В чем, по мнению ffmpeg, разница между аудиофреймом и аудиосэмплом? - PullRequest
1 голос
/ 10 февраля 2020

Вот интересная опция, перечисленная на страницах справочника ffmpeg:

-aframes number (output)
    Set the number of audio frames to output. This is an obsolete alias for "-frames:a", which you should use instead.

Что такое «аудио кадр», мне кажется сомнительным. Этот SO-ответ говорит, что фрейм является синонимом семпла, но это не может быть тем, что ffmpeg считает фреймом. Просто посмотрите на этот пример, когда я ресэмплирую аудио до 22,05 кГц с длиной ровно 313 кадров:

$ ffmpeg -i input.mp3 -frames:a 313 -ar:a 22.05K output.wav

Если бы 'frame' и 'sample' были синонимами, мы ожидали бы, что продолжительность звука будет 0,014 секунды , но фактическая продолжительность составляет 8 секунд. ffmpeg считает частоту кадров моего ввода 39,125.

Что здесь происходит? Что думает ffmpeg о том, что такое аудио кадр? Как мне go узнать эту частоту кадров моего входного аудио?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Здесь «кадр» - это немного перегруженный термин.

В РСМ кадр - это набор выборок, происходящих одновременно. Если ваш звук был 22,05 кГц, и у вас было 313 кадров PCM, его длина по времени, как вы ожидаете, составляла бы около 14 миллисекунд.

Однако, ваш звук не PCM ... это MP3. Кадр MP3 длится около 26 миллисекунд. 313 из них составляют около 8 секунд. Кадр здесь представляет собой блок аудио, который не может быть декодирован независимо. (Фактически, некоторые кадры фактически зависят от других кадров через битовый резервуар!)

1 голос
/ 11 февраля 2020

FFmpeg использует внутреннюю структуру AVFrame для передачи и обработки всех медиаданных в виде фрагментов. Количество выборок в кадре зависит от декодера. Для видео кадр состоит из всех данных пикселей для одного изображения, которое является логической группировкой, хотя он также может содержать данные пикселей для двух полукадров чересстрочного видеопотока.

Для аудио декодеры DCT основанные на кодеках, как правило, заполняют кадр количеством сэмплов, используемых в окне DCT - это 1024 для AA C и 576/1152 для MP3, как упоминал Брэд, в зависимости от частоты дискретизации. Образцы PCM являются независимыми, поэтому не существует внутренней концепции кадрирования и, следовательно, размера кадра. Однако сэмплы все еще должны быть размещены в AVFrames, и ffmpeg по умолчанию составляет 1024 сэмпла на кадр для планарной PCM в каждом буфере (по одному для каждого канала).

Вы можете использовать фильтр ashowinfo для отображения размера кадра. Вы также можете использовать фильтр asetnsamples, чтобы перегруппировать данные в произвольном размере кадра.

...