gpt4 book ai didi

c# - SharpDX:循环播放多个wav文件

转载 作者:行者123 更新时间:2023-12-03 02:10:34 25 4
gpt4 key购买 nike

我目前正在使用SharpDX SourceVoice在WP8应用程序中播放wav文件,该文件可以很好地播放单个文件。

但是,我找不到在没有在SourceVoice上注册事件并排队下一个文件的情况下循环播放多个文件的方法。这似乎造成了一些断断续续的情况,而且不是很顺畅,因此我希望有某种方法可以将两个文件排队一次并在它们之间循环。

关于同时播放两个文件(例如这个文件:Best way to play two audio files simultaneously in Windows Phone 8)存在一些问题,但是我想循环播放它们。

我必须播放单个文件的代码如下所示:

xaudio = new XAudio2();
masteringVoice = new MasteringVoice(xaudio);

var nativefilestream = new NativeFileStream(String.Format(@"{0}", soundfile),NativeFileMode.Open,NativeFileAccess.Read,NativeFileShare.Read);
var soundstream = new SoundStream(nativefilestream);
var waveFormat = soundstream.Format;
var buffer = new AudioBuffer
{
Stream = soundstream.ToDataStream(),
AudioBytes = (int)soundstream.Length,
Flags = BufferFlags.EndOfStream
};

sourceVoice = new SourceVoice(xaudio, waveFormat, true);
sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo);
sourceVoice.Start();

如果要循环播放单个音频,则将AudioBuffer上的循环计数设置为无穷大,如下所示:
LoopCount = AudioBuffer.LoopInfinite,

我确实尝试使用不同的AudioBuffer两次调用SubmitSourceBuffer方法,两个方法都将LoopCount设置为LoopInfinite,但是只播放了第一个。

最佳答案

我无法按照我想要的方式来工作,即将两个AudioBuffer排队并让它们重复。事实证明,如果将两个AudioBuffer排队,并在每个AudioBuffer上设置Loop = x,则第一个循环x次,然后第二个循环x次。 Aslo,它看起来像一个缓冲区一旦被播放就从队列中删除,因此怀疑您是否可以将两个缓冲区循环在一起。

我还尝试通过将两个单独的AudioBuffer复制到MemoryStream来从两个单独的AudioBuffer创建“合并”的AudioBuffer,但结果流无效且无法播放(可能是由于每个文件中都有某种 header 或EOF标记)各个流)。

最终,我决定使用连续的ThreadPoolTimer每隔x毫秒将AudioBuffer提交到SourceVoice的解决方案,从而获得所需的结果。

ThreadPoolTimer timer = ThreadPoolTimer.CreatePeriodicTimer(
(timer) =>
{
sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo);
sourceVoice.Start();

}, TimeSpan.FromMilliseconds(1500));

我仍然不确定是否应该这样做,如果有人知道相反的说法,我会很乐意接受他们的回答。

关于c# - SharpDX:循环播放多个wav文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24530914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com