Может ли ffmpeg сказать мне, был ли аудиофайл увеличен или нет? В этой статье я вижу, что они использовали анализатор спектра для проверки реального битрейта аудиофайла. Может ли ffmpeg определить реальный битрейт и правильно кодировать файлы? Под соответствующим, я подразумеваю, чтобы закодировать в правильном битрейте для качества звука, который файл содержит?
2 ответа
Страница, на которую вы ссылаетесь, очень неточна в том, что на ней написано. Фактическая скорость передачи сигнала в действительности может не совпадать с количеством информации, закодированной в нем, но отсечка частотного спектра не имеет прямого отношения к скорости передачи данных.
Понимаете, я могу выбрать кодирование исходного файла с полным спектральным разрешением со скоростью 192 кбит / с с помощью MP3-кодера, обрезать самые высокие частоты на 16 кГц с помощью настройки фильтра или кодера, и вы, основываясь на этой статье, подумаете что это всего лишь 128 кбит / с.
Иными словами, отсутствие определенных высоких частот не обязательно означает, что кодирование с низкой скоростью передачи битов маскируется другим циклом кодирования с произвольной скоростью передачи данных. Это только показывает, что действительно отсутствуют высокие частоты, которые можно воспринимать как приглушенный звук.
FFmpeg действительно имеет встроенный спектральный анализатор , но ему не хватает шкалы на осях, и поэтому он не так полезен, как, например, Spek.
Для демонстрации я сгенерировал в Audacity файл, содержащий 30 с синусоидальных волн на 20, 18, 16 и 14 кГц с амплитудой 0,8, наложенный на монофонический 16-битный WAV-файл PCM.
Затем я использовал LAME для кодирования их в MP3 на разных битрейтах:
for b in 320 192 128 96 64 32; do lame -b "$b" test.wav "test-$b.mp3"; done
Из сообщений видно, что вместо "по умолчанию" 20 кГц LAME действительно использует фильтр нижних частот для файла 64 кбит / с на частоте 16–17 кГц. Для 32 кбит / с он переключится на фильтр 8 кГц.
Давайте поместим их в спектрограф, такой как Spek, и посмотрим, что произойдет. Как и ожидалось, даже для 96 кбит / с вы получаете полный частотный спектр - красная линия появляется на частоте 20 кГц. Вы также, конечно, получаете гармоники на нескольких частотах, что связано со сжатием MP3.
Для 64 кбит / с вы видите, как включается фильтр 16 кГц, что приводит к появлению красной линии для синусоидальной волны 16 кГц, но все же есть частоты выше этого, поскольку фильтр нижних частот не ослабляет частоты выше своей точка отсечения.
Наконец, для 32 кбит / с вы можете увидеть фильтр 8 кГц в действии. Здесь действительно частоты выше достаточно ослаблены, поэтому они не видны. Однако, несмотря на этот фильтр, вы можете услышать что-то в файле.
Итак, мы увидели, что отсутствие высоких частот намекает на используемый фильтр, но частоту среза нельзя использовать для определения битрейта, в котором был закодирован файл.
Хотите доказательства? Давайте сгенерируем файл с частотой 8 кГц и частотой 320 кбит / с:
$ lame --lowpass 8000 -b 320k test.wav test-fake.mp3
LAME 3.99.5 64bits (http://lame.sf.net)
Resampling: input 44.1 kHz output 22.05 kHz
Using polyphase lowpass filter, transition band: 7913 Hz - 8180 Hz
Encoding test.wav to test-fake.mp3
Здесь вы можете увидеть срез, но вы также заметите, что из-за высокой скорости передачи битов, алиасинг (шум) значительно уменьшается:
Когда вы слушаете файлы, фальшивый тестовый файл звучит намного "чище", чем файл 32 кбит / с с тем же частотным спектром.
На ваш вопрос о том, может ли ffmpeg определять битрейт аудиофайла, ответ - да.
Вот пример вывода ffmpeg для файла mp3:
Duration: 00:04:12.73, start: 0.025056, bitrate: 332 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
Кроме того, ffmpeg позволяет очень легко кодировать с предопределенными скоростями передачи (https://www.ffmpeg.org/ffmpeg.html).
Должен сказать, я не уверен относительно вашего вопроса об обнаружении апскейлинга, но я бы поспорил, что не может. Однако, глядя на детали файла, с интуицией вы можете увидеть "запах кода" апскейлинга.
Надеюсь это поможет!