Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在UWP中使用NAudio播放多个音频文件_C#_Uwp_Naudio - Fatal编程技术网

C# 在UWP中使用NAudio播放多个音频文件

C# 在UWP中使用NAudio播放多个音频文件,c#,uwp,naudio,C#,Uwp,Naudio,我正在开发一个通用应用程序,可以同时播放多个音频流。我需要的能力,以改变音量为我的每个流分开。我尝试使用MixinSampleProvider,如Mark Heath所示,但在开始播放时(在MediaFoundationReaderUniversal中)出现com异常。我对NAudio还很陌生,所以我在这里有点迷路了。我已经研究了很多,但是关于UWP的样本非常少。下面是我已经拥有的。正确的方法是什么/我应该使用哪一类 这就是我到目前为止所做的: IStorageFile file = await

我正在开发一个通用应用程序,可以同时播放多个音频流。我需要的能力,以改变音量为我的每个流分开。我尝试使用MixinSampleProvider,如Mark Heath所示,但在开始播放时(在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.\u ComObject”类型的COM对象强制转换为接口类型“NAudio.MediaFoundation.IMFSourceReader”。此操作失败,因为对IID“{70AE66F2-C809-4E4F-8915-BDCB406B7993}”接口的COM组件的QueryInterface调用由于以下错误而失败:Schnittstele nicht unterstützt(HRESULT的异常:0x80004002(E_NOINTERFACE))


在MediaFoundationReader.Read pReader.ReadSample中(MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM,0,输出actualStreamIndex,输出dwFlags,输出时间戳,输出pSample)

好的,我自己解决了,问题是当我对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();

好的,我自己解决了,问题是当我对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();

您会遇到什么异常?:“您可以使用此方法使用“ms appx://”或“ms appdata://”URI访问应用程序的资源。@IInspectable:资产的打开和播放工作正常,当我在读卡器和播放器之间放置MixinSampleProvider时会出现问题您会遇到什么异常?”“您可以使用此方法使用“ms appx://”或“ms appdata://”URI访问应用程序的资源。“@IInspectable:asset的打开和回放工作正常,当我在读卡器和播放器之间放置MixinSampleProvider时出现问题,这是由于COM线程问题,我们需要NAudio中的编译后IL修改步骤来解决(就像SharpDx一样)是,这是由于COM线程问题,我们需要在NAudio中进行编译后IL修改步骤才能解决(就像SharpDx一样)