ACM流转换异常显示AcmNotPossible

本文关键字:显示 AcmNotPossible 异常 转换 ACM | 更新日期: 2023-09-27 18:22:32

从服务器解压缩Mp3帧时,当Mp3播放10到15秒时,会发生上述异常。我的应用程序是客户端/服务器应用程序。我通过组合Mp3数据包并通过网络流对其进行串行化来发送Mp3帧。我使用NAudio开源API压缩和解压缩帧并播放Mp3。堆栈跟踪出现以下异常。

NAudio.MmException.Ttry(MmResult结果,字符串函数)

在NAudio.Wave.Compression.AcmStreamHeader.Convert(Int32字节ToConvert,Int32&sourceBytesCoverted)

在NAudio.Wave.Compression.AcmStream.Convert(Int32字节ToConvert,Int32&sourceBytesCoverted)

在NAudio.Wave.AcMP3FrameDecompressor.DompressFrame(Mp3Frame frame,Byte[]dest,Int32 destOffset)

在客户端.Audio.SoundPlayer.StreamMP3(对象状态)

ACM流转换异常显示AcmNotPossible

AcmNotPossible是acmStreamConvert Windows函数返回的错误代码,该函数调用MP3 ACM编解码器。此错误可能表示MP3帧无效,或者您一次传入的帧太多。你有多确定你得到的是整帧MP3?调试这样的问题是一个好主意,方法是将接收到的数据写入MP3文件,然后检查是否可以按预期播放。

转换为mp3需要扩展信息。

  • 移动mp3formatin";pwaveformatEx";至";字节缓冲区";512字节
  • 将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缓冲区字节的CCD_ 1;mp3formatin:PWaformatEx;

  • 初始化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])。值

希望这能解决你的问题。