Как FFmpeg управляет битовой глубиной и битрейтом?

Как FFmpeg управляет битовой глубиной и битрейтом?

При конвертации аудио с помощью FFmpeg есть -arи -acопции, которые управляют частотой дискретизации и количеством каналов соответственно. Он также предлагает -abопцию, которая управляет битрейтом, но нет опции управления битовой глубиной.

С…

[битрейт] = [количество каналов] * [частота дискретизации] * [битовая глубина]

…означает ли это, что ffmpeg вычисляет битовую глубину на основе остальных трех параметров?

Еще один постговорит, что битовая глубина контролируется в опции формата. Это меня смутило, потому что приведенное выше уравнение может больше не выполняться, если пользователь задаст все 4 параметра.

Может ли кто-нибудь объяснить, как работают битовая глубина и битрейт в FFmpeg?

решение1

Что касается возможностейустановка битовой глубины: Это зависит от исходных файлов и выходного формата.

Например, возьмем pcm_s16leи pcm_s24le— оба будут рендерить файлы PCM, но с глубиной цвета 16 бит/24 бит соответственно. (Эту информацию можно найти с помощью ffmpeg -h encoder=<YOUR_ENCODER>.)

Если у вас есть формат, который может принимать несколько битовых глубин (например, libmp3lame), FFmpeg по умолчанию укажет используемое значение, глядя на исходный файл: Так что если вы берете -c:a libmp3lameи ваш входной файл имеет битовую глубину 16 бит, то FFmpeg будет использовать 16 бит. Если у вас есть 32-битный файл и вы хотите закодировать его в кодеке, который может принимать только 16 бит, то FFmpeg сделает для вас выборку.

Но вы также можете указать это самостоятельно.с использованием-sample_fmt.


Что касается вашегоформула скорости передачи данных: FFmpeg, как и практически все другие инструменты, видит количество аудиоканалов, битовую глубину и частоту дискретизации как фиксированные значения (то есть они не будут меняться внутри файла), в то время как битовая скорость является переменной, которая коррелирует с качеством кодирования. Это, однако, верно только для кодеков с потерями; вот почему перекодирование WAV-файла 200 раз не будет иметь значения, в то время как перекодирование тех же файлов 20 раз с помощью довольно приличного MP3-кодера уже может привести к невыносимым результатам.

Кодеки с потерями добавляют качество в ваше уравнение: например, в MP3 значение 320kдаст очень хорошее качество, так как кодеру не придется отбрасывать много информации, чтобы оставаться в пределах указанных значений. Если вы используете -b:a 64k, кодеру придется отбрасывать много информации, чтобы достичь указанного битрейта. Кодеры будут уменьшать его настолько, насколько это необходимо для достижения битрейта:Очень упрощенные и поэтому лишь теоретические примеры информации, которую можно было бы опустить:

  • Если бы объединение всех частот от 8 до 16 кГц в одну полукомплексную синусоиду позволило кодеру достичь необходимой скорости передачи данных, он бы это сделал.
  • Если бы удаление всех сигналов ниже -32 дБ помогло, то это было бы так.

Для получения реальных объяснений того, какая информация будет сброшена, я предлагаю вам начать с чтенияСтатья Википедии о сжатии аудиоданных.

Связанный контент