在UWP中播放带有NAudio的多个Audiofiles

时间:2016-09-09 19:27:44

标签: c# uwp naudio

我正在开发一个通用应用程序,其中同时播放多个音频流。我需要能够单独更改每个流的音量。我尝试使用MixinSampleProvider,如Mark Heath的blog entry中所示,但在开始播放时我得到了一个com异常(在MediaFoundationReaderUniversal中)。我对NAudio很新,所以我有点迷失在这里。我已经研究了很多但是关于UWP的样本非常罕见。以下就是我的意思。我应该使用哪种正确方法/哪个类?

这是我到目前为止所做的:

IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(path, UriKind.Absolute));
var stream = await file.OpenAsync(FileAccessMode.Read);
var player = new WasapiOutRT(AudioClientShareMode.Shared, 200);
player.Init(() => { return new MediaFoundationReaderUniversal(stream); });
player.Play();

我能以UWP兼容的方式做我想做的事吗?

编辑:

这是我得到的例外,它是德语的一半,但重要的部分是英语。最后一部分说“界面不受支持”:

  

无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“NAudio.MediaFoundation.IMFSourceReader”。此操作失败,因为对于具有IID“{70AE66F2-C809-4E4F-8915-BDCB406B7993}”的接口的COM组件的QueryInterface调用由于以下错误而失败:Schnittstellenichtunterstützt(HRESULT的异常:0x80004002(E_NOINTERFACE))。

在MediaFoundationReader.Read pReader.ReadSample(MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM,0,out actualStreamIndex,out dwFlags,out timestamp,out pSample);

1 个答案:

答案 0 :(得分:2)

好的,我自己解决了,问题是当我为player.Init()函数使用一个闭包时,就像这样:

IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(path, UriKind.Absolute));
var stream = await file.OpenAsync(FileAccessMode.Read);
var waveChannel32 = new WaveChannel32(new MediaFoundationReaderUniversal(stream));
var mixer = new MixingSampleProvider(new ISampleProvider[] { waveChannel32.ToSampleProvider() });

_audioOutput = new WasapiOutRT(AudioClientShareMode.Shared, 200);
_audioOutput.Init(() =>
{
    return mixer.ToWaveProvider();
});
_audioOutput.Play();

当我将上面的代码更改为此代码时,不会抛出COM异常并且代码运行正常:

IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(path, UriKind.Absolute));
var stream = await file.OpenAsync(FileAccessMode.Read);

_audioOutput = new WasapiOutRT(AudioClientShareMode.Shared, 200);
_audioOutput.Init(() =>
{
    var waveChannel32 = new WaveChannel32(new MediaFoundationReaderUniversal(stream));
    var mixer = new MixingSampleProvider(new ISampleProvider[] { waveChannel32.ToSampleProvider() });
    return mixer.ToWaveProvider();
});
_audioOutput.Play();