【问题标题】:SharpDX: Play multiple wav files one after another in a loopSharpDX:循环播放多个wav文件
【发布时间】:2014-07-02 12:18:25
【问题描述】:

我目前正在使用 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,

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

【问题讨论】:

    标签: c# audio windows-phone-8 sharpdx


    【解决方案1】:

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

    我还尝试通过将两个单独的音频缓冲区复制到 MemoryStream 中来从两个单独的音频缓冲区创建一个“合并的”音频缓冲区,但生成的流无效并且无法播放(可能是由于存在某种标题或 EOF 标记在每个单独的流中)。

    最终,我确定了使用连续 ThreadPoolTimer 每隔 x 毫秒将 AudioBuffer 提交给 SourceVoice 的解决方案,从而达到了预期的结果。

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多