Отвращение чтения mp3 debug naudio?
Вопрос
Мой код, использующий Naudio, чтобы прочитать один конкретный MP3, получает разные результаты, чем несколько других коммерческих приложений.
В частности,: мой код на Naudio находит ~ 1,4 секунды молчания в начале этого MP3 перед «слышным аудио» (барабанный пикап) начинается, тогда как другие приложения (Windows Media Player, RealPlayer, Wavepad) показывают ~ 2,5 секунды молчания до что же барабанный пикап.
Особый mp3 "как каменщик", загруженный с Amazon.com. Протестировали несколько других MP3 и не показывают какую-либо похожую разницу между моим кодом и другими приложениями. Большинство MP3 не начинаются с такой длинной тишины, поэтому я подозреваю, что это источник разницы.
Проблемы отладки:
Я не могу на самом деле найти способ даже доказать, что другие приложения имеют право, а Naudio / Me неверно, то есть для сравнения блоковых результатов моего кода к «известной хорошей справочной реализации»; Поэтому я даже не могу точно определить «ошибку», мне нужно отладить.
Поскольку мой код читает тысячи образцов в течение этих 1,4 секунды без явных ошибок, я не могу подумать, как сузить, где / когда в входном потоке для поиска ошибок.
Сердце кода 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 декодеры, а не полагаются на операционную систему.
Другие советы
Я нашел некоторые частичные ответы на свой вопрос:
Поскольку моя проблема сводится к употреблению слишком намного много MP3 W / O, производить достаточно PCM, я использовал условные точки останова, чтобы найти только там, где это происходит, затем пробурено в это.
Это показало мне, что некоторые вызовы ACMSreamVert () возвращают успех, потребляя 417 байтов SRC, но производства 0 "BYTES DEST BYTES".
Далее я планирую попробовать ACMStreamsize (), чтобы задать кодеку, сколько SRC байтов его «хочет» потреблять, а не «рассказывать», чтобы потреблять 417.
Редактировать (продолжить): я исправил его!
Он пришел к прохождению ACMStreamConvert () достаточно SRC Bytes, чтобы сделать его счастливым. Давая ему его acmstreamsize () запрошенный размер исправил проблему в некоторых местах, но затем она возникла в других; Предоставление его запрашиваемым временем размера 3, по-видимому, вылечит «Использовал байты 0 DEST BYTES» во всех MP3, которые я испытывал.
С помощью этого исправления ACMStreamVervert (), а затем иногда возвращается гораздо большие преобразованные кусочки (почти 32 КБ), поэтому мне также пришлось изменять какой-то другой код Naudio, чтобы пройти в более крупных буферах назначения, чтобы удерживать результаты.