Как определить битовую глубину AAC
С wav
файл, например, вы можете легко различить глубину в битах
24-битный
Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 44100 Hz, stereo,
s32, 2116 kb/s
16-битный
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo,
s16, 1411 kb/s
Однако AAC кажется непостижимым
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo,
fltp, 151 kb/s
3 ответа
AAC - это формат с потерями (например, MP3), и, как объясняет Википедия (действительно, та же статья, на которую вы ссылались):
Глубина в битах имеет смысл только в отношении цифрового сигнала ИКМ. Форматы, отличные от PCM, такие как форматы сжатия с потерями, не имеют связанных битовых глубин. Например, в MP3 квантование выполняется на выборках ИКМ, которые были преобразованы в частотную область.
ffprobe сообщает правильную битовую глубину, но только когда есть битовая глубина для отчета, иначе он правильно сообщает, что "битовая глубина" не применима (N/A).
В отчете FFmpeg о поле данных "bits_per_raw_sample" и в ответе Каранса "битовая глубина" является неправильным для аудио, закодированного AAC.
Если вы пытаетесь проверить файл данных, вы можете grep -e
для "codec_name", чтобы определить, какие потоки (видео, аудио, текст) сообщает "bits_per_raw_sample". Это позволяет легко узнать, относится ли сообщаемый статус битовой глубины к видеокодеку или аудиокодеку:
$ ffprobe -show_streams <input_file.mp4> | grep -e codec_name -e bits_per_raw_sample
... пример итогового отчета о видео и аудио файлах данных:
codec_name=h264 <----- video
bits_per_raw_sample=8 <----- 8-bit depth video
codec_name=aac <----- AAC audio
bits_per_raw_sample=N/A <----- bit depth is "Not Applicable" to AAC audio
Вам может понравиться эта статья " Аудиокодирование демистифицировано"
Бит глубина
Наряду с частотой дискретизации необходимо учитывать и битовую глубину. Глубина в битах - это количество цифровых битов информации, используемых для кодирования каждой выборки. Проще говоря, битовая глубина измеряет "точность". Чем выше битовая глубина, тем точнее сигнал может передавать амплитуду фактического аналогового источника звука. При минимальной глубине в битах у нас есть только два варианта измерения точности звука: 0 для полной тишины и 1 для полной громкости. Чем выше битовая глубина, тем выше точность кодированного звука. В качестве примера: звук с качеством CD является стандартным 16-битным, что дает на выбор 216 (или 65 536) томов.
Глубина в битах фиксирована для кодирования PCM, но для кодеков сжатия с потерями (таких как MP3 и AAC) она рассчитывается во время кодирования и может варьироваться от образца к образцу.
... так, чтобы ответить на вопрос "Как определить битовую глубину AAC?" Я полагаю, вам придется делать это на основе каждого образца.
Правда в том, что эти форматы не имеют точного размера битов на выборку, но вы можете сделать приближение, имея в виду две переменные: частоту дискретизации и битрейт.
Если вы знаете, что частота дискретизации означает количество сэмплов в секунду (например, если у вас 44100 Гц, это означает, что за 1 секунду воспроизводится 44100 сэмплов) и битрейт (в моем случае это 95 Кбит/с), то вы знаете, что 95000 байт /секунда, разделенная на 44100 выборок/секунду = 2,1542 (приблизительно) байт/выборку. Это немного больше, чем 16-битное качественное кодирование. Таким образом, вы можете декодировать до 24 бит на необработанный образец с частотой 44100 Гц с помощью следующей команды ffmpeg:
ffmpeg -i input.mp4a -acodec pcm_s24le -f s24le -ar 44.1k -ac 2 out.pcm
Это не будет ровно 24 бита, поэтому его размер может быть слишком большим, но вы не потеряете качество, если преобразуете его в более низкое качество.