首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于重采样的例外

关于重采样的例外
EN

Stack Overflow用户
提问于 2012-11-21 06:25:15
回答 1查看 718关注 0票数 0

当我使用ResamplerDmoStream并选择除WaveOutput (例如WASAPIDirectSound)以外的任何东西时,我都遇到了以下异常:无法将COM对象NAudio.DMO.ResamplerMediaComObject转换为接口类型Naudio.Dmo.IMediaObject .

异常调用堆栈:

代码语言:javascript
复制
at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
at NAudio.Dmo.IMediaObject.GetInputStatus(Int32 inputStreamIndex, DmoInputStatusFlags& flags)
at NAudio.Dmo.MediaObject.IsAcceptingData(Int32 inputStreamIndex) in NAudio\Dmo\MediaObject.cs:line 468
at NAudio.Wave.ResamplerDmoStream.Read(Byte[] buffer, Int32 offset, Int32 count) in NAudio\Wave\WaveStreams\ResamplerDmoStream.cs:line 136
at NAudio.Wave.Wave16ToFloatProvider.Read(Byte[] destBuffer, Int32 offset, Int32 numBytes) in NAudio\Wave\WaveProviders\Wave16toFloatProvider.cs:line 47
at NAudio.Wave.MixingWaveProvider32.Read(Byte[] buffer, Int32 offset, Int32 count) in NAudio\Wave\WaveProviders\MixingWaveProvider32.cs:line 116
at NAudio.Wave.SampleProviders.WaveToSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count) in NAudio\Wave\SampleProviders\WaveToSampleProvider.cs:line 33
at NAudio.Wave.SampleProviders.MeteringSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count) in NAudio\Wave\SampleProviders\MeteringSampleProvider.cs:line 72
at NAudio.Wave.SampleProviders.VolumeSampleProvider.Read(Single[] buffer, Int32 offset, Int32 sampleCount) in NAudio\Wave\SampleProviders\VolumeSampleProvider.cs:line 42
at NAudio.Wave.SampleProviders.SampleChannel.Read(Single[] buffer, Int32 offset, Int32 sampleCount) in NAudio\Wave\SampleProviders\SampleChannel.cs:line 58
at NAudio.Wave.SampleProviders.MeteringSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count) in NAudio\Wave\SampleProviders\MeteringSampleProvider.cs:line 72
at NAudio.Wave.SampleProviders.MultiplexingSampleProvider.Read(Single[] buffer, Int32 offset, Int32 count) in NAudio\Wave\SampleProviders\MultiplexingSampleProvider.cs:line 93
at NAudio.Wave.SampleProviders.SampleToWaveProvider.Read(Byte[] buffer, Int32 offset, Int32 count) in NAudio\Wave\SampleProviders\SampleToWaveProvider.cs:line 35
at NAudio.Wave.DirectSoundOut.Feed(Int32 bytesToCopy) in NAudio\Wave\WaveOutputs\DirectSoundOut.cs:line 516
at NAudio.Wave.DirectSoundOut.PlaybackThreadFunc() in NAudio\Wave\WaveOutputs\DirectSoundOut.cs:line 415
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-27 09:35:06

这个问题很可能是在STAThread上创建COM对象(在本例中是driver )(如果使用WinForms或WPF,情况就是这样),然后将它们传递给NAudio输出驱动程序模型,后者将试图在后台线程上访问它们,这是不允许的。

这是一个非常恼人的问题,因为如果您将您的GUI线程设置为MTAThread,其他内容就会中断(例如,打开文件对话框)。您的主要选择如下:

  1. 坚持使用有窗口回调的WaveOut。您还可以使用WasapiOutGuiThread,这是我最近添加到演示项目中的一个实验班。这是迄今为止最简单的解决办法。你真的需要使用DirectSound吗?
  2. 音频管道中没有ResamplerDmoStream。使用WaveFormatConversionStream代替,或者简单地让WASAPI插入一个(它会自动地)
  3. 创建一个后台线程,用于音频播放,并将消息从您的GUI线程发送到它,告诉它您想要启动,停止,重新定位等。不幸的是,这是一个相当复杂的选择。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13487558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档