Какие аудиокодеры в FFmpeg поддерживают 8 кГц?

Какие аудиокодеры в FFmpeg поддерживают 8 кГц?

У меня есть старое видео (снятое на Casio Exilim EX-Z40, если это важно), аудиопоток которого ffprobeотображается как pcm_u8, 8000 Hz, mono, u8.

Мне бы хотелось перекодировать его во что-то современное.

Транскодирование с настройками FFmpeg по умолчанию завершается ошибкой:

libfaac не поддерживает этот формат вывода!

Так что, по-видимому, libfaac не поддерживает 8 кГц, потому что -c:a copyработает.

Какие кодеры поддерживают частоту дискретизации 8 кГц?список можно найти здесьпрактически не упоминает частоты дискретизации.

Могу ли я написать скрипт, который попробует все установленные кодеки, из…

ffmpeg -codecs | grep EA`

…чтобы увидеть напрямую, какие из них работают?

решение1

Собственный кодер FFmpeg AAC ( -c:a aac) поддерживает частоту дискретизации 8000 Гц:

ffmpeg -h encoder=aac
...
Supported sample rates: 96000 88200 64000 48000 44100 32000 24000 22050 16000 12000 11025 8000 7350

Он автоматически выберет частоту дискретизации, наиболее точно соответствующую входным данным, поэтому вам не нужно объявлять -ar:

ffmpeg -i input.mov -c:a aac output.m4a

Какие аудиокодеры в FFmpeg поддерживают 8 кГц?

aac, aptx, aptx_hd, dca, flac, g723_1, libfdk_aac, libmp3lame, libopus, libspeex, libvorbis, real_144, wavpack, множество вариантов pcm.

Вероятно, есть и другие, но сведения о них supported_sampleratesпротиворечивы.

Мне бы хотелось перекодировать его во что-то современное.

libfaac был удален из FFmpeg много лет назад и не считается современным кодировщиком AAC. Ваш, ffmpegдолжно быть, древний. Обновите и используйте собственный кодировщик FFmpeg AAC или скомпилируйте и используйте libfdk_aac.

Если вы хотите наиболее современное использование libopus.

Но когда я попробовал [aac], по сравнению с оригиналом, размер файла увеличился, а некоторые высокие частоты были ослаблены.

Поскольку я подозреваю, что ваш ffmpegочень старый, вы, вероятно, пропустили основные качественные обновления кодировщика aac. Обновление и качество, вероятно, улучшатся.

решение2

Частота дискретизации и кодек — это разные параметры. Скорее всего, вам нужно что-то вроде

-ar 48000 -c:a aac

Для повышения частоты дискретизации с 8 кГц до 48 кГц и сжатия до AAC

решение3

8 кГц довольно стандартен для речи, известен как «узкая полоса». Если это речь, то у вас должно быть много вариантов, хотя не так много из них поддерживаются FFmpeg из коробки. Вероятно, лучшими вариантами являются

Однако 8 кГц 8-бит PCM изначально не является хорошим источником: большинство кодировщиков ожидают/надеются на лучший вход, например, 8-бит G.711 mu-law, который фактически представляет собой 12-битные данные, закодированные как 8-бит с плавающей точкой. Они могут не справиться с чистым 8-битным PCM-входом, поскольку он может не соответствовать речевым шаблонам, для которых они смоделированы.

Это также довольно небольшой файл, и возможно, что ваш видеоконтейнер не будет поддерживать более сложные кодеки. Так что я думаю, что это больше проблема, чем польза, и я бы оставил аудио как есть.

решение4

Опусобычно считается лучшим доступным кодеком с низким битрейтом, ине имеет проблемс частотой дискретизации входного сигнала 8 кГц. Полученный поток opus все еще может быть декодирован до любой частоты дискретизации, удобной для декодера. (Как и другие кодеки с потерями, он сжимает на основе частотных диапазонов после выполнения FFT. Но некоторые другие кодеки, по-видимому, хотят декодировать только до той же частоты дискретизации, что и входной сигнал. Как указывают другие ответы, выможетзаставьте FFmpeg передискретизировать входной сигнал перед передачей его кодеку, но для Opus это не нужно.

Пытатьсяffmpeg -c:a libopus -b:a 24k -frame_duration 120для Opus 24 кбит/с.

Возможно, стоит попробовать: -application voipнастроиться на «улучшенную разборчивость речи» вместо audioпрофиля по умолчанию.

Установка -frame_durationна максимальное значение снижает накладные расходы, я думаю. Вам не важна задержка кодера/декодера, потому что у вас просто файлы, а не двусторонний голосовой чат в реальном времени. Поэтому вы можете позволить ему буферизировать 120 мс аудио и упаковать вместе несколько кадров CELT или SILK, чтобы уменьшить избыточность заголовков кадров.


Лучший доступный кодер Opus — это бесплатный кодировщик с открытым исходным кодом libopus(https://opus-codec.org), поэтому FFmpeg может просто использовать его, в отличие от AAC, где лучшие кодировщики имеют закрытый исходный код.

Opus имеет специальные режимы для речи с очень низким битрейтом (например, 16 кбит/с), распознавание речи и даже переключение на речевой кодер (SILK) при низких битрейтах.

Инструменты кодирования с низким битрейтом Opus аналогичны тому, что может делать HE-AACv2, см.статья в википедии.


Но когда я попробовал, по сравнению с оригиналом, размер файла увеличился...

Суть сжатия с потерями заключается в том, что вы можетевыбиратьвыходной битрейт, компромисс с качеством. Большинство кодеков могут использовать, -b:a 32kнапример, для выбора битрейта аудио 32 кбит/с.

(Для видео вы также можете выбрать компромисс между временем ЦП, затрачиваемым на кодирование, например, -preset veryslow и -preset medium. Но сжатие аудио достаточно дешево, поэтому у большинства кодеков нет большого количества вариантов для траты большего количества времени ЦП на улучшение соотношения битрейта и качества.)

Моно 8-бит 8 кГц PCM имеет битрейт 64 кбит/с = 8 * 8000, так что вы стремитесь к более низкому значению, в противном случае вы могли бы также сохранить свои оригинальные файлы. PCM - это просто сырые сэмплы, так что битрейт - это просто произведение частоты дискретизации и ширины сэмпла. Как аудиоэквивалент растрового .bmpизображения. Это крайне неэффективно, и именно поэтому были изобретены лучшие кодеки. (И как вы знаете из прослушивания, сохранение битрейта для PCM обходится очень дорого для качества и частотыдиапазон(Поскольку битрейт связан 1:1 с частотой дискретизации. Это не тот случай, когда вы квантуете в частотной области с помощью кодека с потерями.)


и некоторые высокие частоты были ослаблены. Так что, хуже, чем-c:a copy

Собственный кодировщик AAC FFmpeg -c:a aacраньше был довольно плохим, и вы использовали старый FFmpeg. https://trac.ffmpeg.org/wiki/Encode/HighQualityAudioговорит, что по состоянию на 2017 год aacиногда лучше, чем libfdk_aacдля AAC-LC (низкая сложность высокий битрейт). Он не упоминает HE-AAC, хотя, а это то, что вам нужно для низкого битрейта AAC.

libfdk_aac Раньше был лучшим кодировщиком AAC с открытым исходным кодом, и, возможно, до сих пор им является для HE-AAC. Насколько мне известно, ни один из них не так хорош, как лучшие платные кодировщики AAC.

Для AAC с низким битрейтом вам действительно нужен HE-AAC, который добавляет больше инструментов кодирования.https://en.wikipedia.org/wiki/Высокоэффективное_расширенное_аудиокодирование. Я не уверен, что -c:a aacсмогу это сделать.

https://trac.ffmpeg.org/wiki/Encode/HighQualityAudioперечислены некоторые рекомендуемые настройки и диапазоны полезных битрейтов для различных кодеров.

Но вам, вероятно, нужен Opus или, возможно, AMR-NB (узкополосный) для битрейтов вроде 4 кбит/с. Я не знаю, сколько летграфик зависимости качества от битрейта в статье вики Opusесть, но он показывает AMR-NB с более высоким качеством, чем Opus, при скорости ниже 8 кбит/с.

С этими несколькими битами вы, возможно, сможете понимать речь, но она не будет звучатьхороший. Вопрос лишь в том, какой кодек менее ужасен.

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