Исключение ACM Stream Convert, отображающее AcmNotPossible

При распаковке кадров Mp3 с сервера вышеупомянутое исключение возникает, когда Mp3 воспроизводится в течение 10–15 секунд. Мое приложение является приложением клиент/сервер. Я отправляю кадры Mp3, составляя пакеты Mp3 и сериализуя их по сетевому потоку. Я использую NAudio Open Source API для сжатия и распаковки кадров и воспроизведения MP3. Я получаю следующее исключение при использовании Stack Trace.

NAudio.MmException.Try (результат MmResult, строковая функция)

в NAudio.Wave.Compression.AcmStreamHeader.Convert (Int32 bytesToConvert, Int32 и sourceBytesConverted)

в NAudio.Wave.Compression.AcmStream.Convert (Int32 bytesToConvert, Int32 и sourceBytesConverted)

at NAudio.Wave.AcmMp3FrameDecompressor.DecompressFrame (кадр Mp3Frame, Byte [] dest, Int32 destOffset)

в Client.Audio.SoundPlayer.StreamMP3 (состояние объекта)


person Samie    schedule 06.02.2012    source источник


Ответы (2)


AcmNotPossible — это код ошибки, возвращаемый acmStreamConvert функция Windows, которая вызывает кодек MP3 ACM. Эта ошибка, вероятно, указывает либо на недопустимый кадр MP3, либо на то, что вы передали слишком много кадров одновременно. Насколько вы уверены, что получаете целые кадры MP3? Рекомендуется отлаживать такие проблемы, также записывая полученные данные в файл MP3, а затем проверяя, может ли он воспроизводиться должным образом.

person Mark Heath    schedule 07.02.2012
comment
Как вы сообщили, может быть недопустимый фрейм. Позвольте мне рассказать о Naudio API. Когда вы анализируете Mp3Frame с помощью Naudio, его можно проанализировать только тогда, когда из потока будет возвращен правильный Mp3-фрейм. Не может быть второй вероятности, потому что в одном случае в Stream записывается один кадр. - person Samie; 07.02.2012
comment
в раме ничего странного нет? это моно, а остальные стерео? это другая частота дискретизации по сравнению с другими? - person Mark Heath; 07.02.2012
comment
Не могли бы вы рассказать мне о моно и стерео кадрах? Нет! Частота дискретизации одинакова для всех кадров. - person Samie; 07.02.2012

Преобразование в 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 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^, и т. д.

когда вы теперь ссылаетесь на формат mp3, например pWaveformatEx(@buffer[0]).thevalues

Надеюсь, это решит вашу проблему.

person TSpeed Sunset Classic Rock    schedule 03.05.2021