ACM Stream转换显示AcmNotPossible的异常

时间:2012-02-06 09:48:40

标签: c# tcp audio-streaming networkstream naudio

当从服务器解压缩Mp3的帧时,Mp3已播放10到15秒时发生上述异常。我的应用程序是客户端/服务器应用程序。我通过编写Mp3数据包并将其序列化来发送Mp3帧网络流。我使用 NAudio开源API 进行压缩和解压缩帧并播放Mp3.I使用堆栈跟踪获得以下异常。

  
    

NAudio.MmException.Try(MmResult result,String function)

         

at NAudio.Wave.Compression.AcmStreamHeader.Convert(Int32 bytesToConvert,Int32& sourceBytesConverted)

         

at NAudio.Wave.Compression.AcmStream.Convert(Int32 bytesToConvert,Int32& sourceBytesConverted)

         

at NAudio.Wave.AcmMp3FrameDecompressor.DecompressFrame(Mp3Frame frame,Byte [] dest,Int32 destOffset)

         

在Client.Audio.SoundPlayer.StreamMP3(对象状态)

  

2 个答案:

答案 0 :(得分:1)

AcmNotPossible是acmStreamConvert Windows函数返回的错误代码,它调用MP3 ACM编解码器。此错误可能表示MP3帧无效,或者您一次传入太多帧。您对整个MP3帧的确定程度如何?最好通过将收到的数据写入MP3文件,然后检查可以按预期播放来调试这样的问题。

答案 1 :(得分:0)

转换为 mp3 需要扩展信息。

  • 将 mp3formatin "pwaveformatEx" 移动到 512 字节的 "bytebuffer"。
  • 将 mp3 编解码器扩展信息添加到字节缓冲区。

我将 mp3 编解码器信息声明为

const MP3Extend = chr(0)+chr(1)+chr(0)+chr(4)+chr(0)+chr(0)+chr(0)+chr(192)+chr(3)+chr(1)+chr(0)+chr(0);

然后我创建了 var 缓冲区 buffer=array[0..511] 字节; mp3formatin:PWaveformatEx;

  • 初始化 mp3formatin 和 formatout
  • 将 mp3formatin pwaveformatEx 移动到字节缓冲区
  • move(mp3formatin^,buffer[0],sizeof(pWaveformatex))
  • 然后添加 mp3 扩展编解码器信息 move(mp3extend,buffer[sizeof(pWaveformatex)-1],length(MP3EXTEND)) acmstreamopen(Instance, nil,pwaveformatEx(@buffer[0])^,outputwaveformatEx^,

当您现在参考 mp3formatin 时,例如 pWaveformatEx(@buffer[0]).thevalues

希望这能解决您的问题。