
У меня есть старое видео (снятое на 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 из коробки. Вероятно, лучшими вариантами являются
- АМР- ты можешьскомпилировать libopencode-amrnb в FFmpegдля поддержки
- Opus, который будет использовать речевой кодек Vorbis CELT
Однако 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 кбит/с.
С этими несколькими битами вы, возможно, сможете понимать речь, но она не будет звучатьхороший. Вопрос лишь в том, какой кодек менее ужасен.