Как я могу извлечь аудиоданные только в память, без фактического запуска через декомпрессор?
Вы не можете извлечь аудиоданные, не распаковывая их - они сжаты! Однако, если вам нужен только сжатый поток, читайте дальше!
Типичный аудиофайл mp3 будет разделен на разделы:
[вероятный метатег]
[возможный хлам]
[возможные теги XING / LAME [возможно больше мусора]]
[mp3 аудио кадры]
[возможный метатег]
Вероятный метатег: Большинство аудиофайлов mp3 имеют тег id3 в заголовке. Имейте в виду, что некоторые пользователи могут отмечать свои mp3-файлы различными форматами тегов, такими как APE , поэтому вам придется учитывать это тоже.
Возможный мусор: Некоторые аудиофайлы mp3 были помечены, повторно помечены и преобразованы так много раз, что заголовок метатега может не дать вам точное смещение по первому звуковому фрейму, так как остатки предыдущих тегов могут Быть оставленным позади. foobar2000 имеет возможность исправить это.
Возможные теги XING / LAME: Они содержатся в аудиофрейме mp3, но не содержат реального звука. madplay содержит код, чтобы показать вам, как читать и анализировать эти кадры. Заголовок XING / LAME может иметь количество кадров, поэтому стоит проанализировать эти заголовки. Опять же, если файл прошел через множество различных тэггеров и редакторов, здесь может быть найдено несколько искаженных, недействительных аудиокадров.
Аудиокадры MP3 : Фактический сжатый поток, разбитый на «кадры». Каждый кадр начинается с битовой комбинации синхронизации, 0xFFE.
Возможный метатег : Нередко встречаются дополнительные метатеги в конце файла. id3v1, APE, тексты песен можно найти здесь.
Чтобы найти смещение аудиокадров, вам потребуется проанализировать любые заголовки метатегов, а затем начать поиск битового шаблона синхронизации. Вы не можете просто начать поиск шаблона синхронизации с начала файла, так как не все тегеры правильно поддерживают unsynchronization , поэтому сам метатег может содержать шаблон 0xFFE.
Как только у вас будет смещение к первому звуковому кадру, вы должны посмотреть на конец файла и вычислить, сколько там данных не аудио, чтобы вы знали, когда прекратить анализ аудио. Как только у вас есть смещение к началу аудиоданных и смещение к концу аудиоданных, вы можете передавать аудиоданные с помощью функции хэша / контрольной суммы!