Вопрос

Мой код, использующий Naudio, чтобы прочитать один конкретный MP3, получает разные результаты, чем несколько других коммерческих приложений.

В частности,: мой код на Naudio находит ~ 1,4 секунды молчания в начале этого MP3 перед «слышным аудио» (барабанный пикап) начинается, тогда как другие приложения (Windows Media Player, RealPlayer, Wavepad) показывают ~ 2,5 секунды молчания до что же барабанный пикап.

Особый mp3 "как каменщик", загруженный с Amazon.com. Протестировали несколько других MP3 и не показывают какую-либо похожую разницу между моим кодом и другими приложениями. Большинство MP3 не начинаются с такой длинной тишины, поэтому я подозреваю, что это источник разницы.

Проблемы отладки:

  1. Я не могу на самом деле найти способ даже доказать, что другие приложения имеют право, а Naudio / Me неверно, то есть для сравнения блоковых результатов моего кода к «известной хорошей справочной реализации»; Поэтому я даже не могу точно определить «ошибку», мне нужно отладить.

  2. Поскольку мой код читает тысячи образцов в течение этих 1,4 секунды без явных ошибок, я не могу подумать, как сузить, где / когда в входном потоке для поиска ошибок.

  3. Сердце кода Naudio представляет собой вызов P / Invoke для ACMStreamConvert (), который является вызовом Windows «Black Box», который я не могу подумать, как проверить ошибку.

Может кто-нибудь подумать о любых хитростях / техниках для отладки этого?

Это было полезно?

Решение

Код Naudio ACM никогда не был предназначен для MP3S, но для декодирования Codeec Codes Contry Contry Contry. Однажды я пытался настроить волновую формат, чтобы указать MP3 как эксперимент, и что вышло достаточно хорошо. Тем не менее, я всегда немного нервничал о декодировании MP3 (особенно VBR) с ACM (например, что выходит, если Tegs ID3 или альбом Art пройдены - могли ли это объяснить дополнительную тишину?), И я никогда не был на 100% Убедился, что Naudio делает это правильно - очень мало документации о том, как именно вы должны использовать кодеки ACM. К сожалению нет никакого управляющего MP3 декодера с лицензией, которую я могу использовать в Naudio, поэтому ACM остается единственным вариантом на данный момент.

Я не уверен, что подходят к другим медиаптам, чтобы воспринимать MP3, но я подозреваю, что многие из них имеют свои собственные встроенные MP3 декодеры, а не полагаются на операционную систему.

Другие советы

Я нашел некоторые частичные ответы на свой вопрос:

  1. Поскольку моя проблема сводится к употреблению слишком намного много MP3 W / O, производить достаточно PCM, я использовал условные точки останова, чтобы найти только там, где это происходит, затем пробурено в это.

  2. Это показало мне, что некоторые вызовы ACMSreamVert () возвращают успех, потребляя 417 байтов SRC, но производства 0 "BYTES DEST BYTES".

Далее я планирую попробовать ACMStreamsize (), чтобы задать кодеку, сколько SRC байтов его «хочет» потреблять, а не «рассказывать», чтобы потреблять 417.

Редактировать (продолжить): я исправил его!

Он пришел к прохождению ACMStreamConvert () достаточно SRC Bytes, чтобы сделать его счастливым. Давая ему его acmstreamsize () запрошенный размер исправил проблему в некоторых местах, но затем она возникла в других; Предоставление его запрашиваемым временем размера 3, по-видимому, вылечит «Использовал байты 0 DEST BYTES» во всех MP3, которые я испытывал.

С помощью этого исправления ACMStreamVervert (), а затем иногда возвращается гораздо большие преобразованные кусочки (почти 32 КБ), поэтому мне также пришлось изменять какой-то другой код Naudio, чтобы пройти в более крупных буферах назначения, чтобы удерживать результаты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top