在 UWP 中使用 NAudio 播放多个音频文件
Posted
技术标签:
【中文标题】在 UWP 中使用 NAudio 播放多个音频文件【英文标题】:Playback of multiple Audiofiles with NAudio in UWP 【发布时间】:2016-09-09 19:27:44 【问题描述】:我正在开发一个通用应用程序,可以同时播放多个音频流。我需要能够分别更改每个流的音量。我尝试使用 MixinSampleProvider,如 Mark Heath 的blog entry 所示,但在开始播放时(在 MediaFoundationReaderUniversal 中)出现 com 异常。我对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 调用因以下错误而失败:Schnittstelle nicht unterstützt(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE))。
in MediaFoundationReader.Read pReader.ReadSample(MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, out actualStreamIndex, out dwFlags, out timestamp, out pSample);
【问题讨论】:
你得到了什么异常? StorageFile.GetFileFromApplicationUriAsync: “您可以使用此方法通过“ms-appx://”或“ms-appdata://”URI 访问您应用的资源。”我> @IInspectable:资产的打开和播放工作正常,当我在阅读器和播放器之间放置一个 MixinSampleProvider 时出现问题 【参考方案1】:好的,我自己解决了,问题是当我为 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();
【讨论】:
是的,这是由于 COM 线程问题,我们需要在 NAudio 中进行编译后 IL 修改步骤来解决(就像 SharpDx 一样)以上是关于在 UWP 中使用 NAudio 播放多个音频文件的主要内容,如果未能解决你的问题,请参考以下文章