При конвертации аудио с помощью 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 дБ помогло, то это было бы так.
Для получения реальных объяснений того, какая информация будет сброшена, я предлагаю вам начать с чтенияСтатья Википедии о сжатии аудиоданных.