Quais codificadores de áudio no FFmpeg suportam 8 kHz?

Quais codificadores de áudio no FFmpeg suportam 8 kHz?

Tenho um vídeo antigo (feito por uma Casio Exilim EX-Z40, se for o caso), cujo fluxo de áudio ffprobeinforma como pcm_u8, 8000 Hz, mono, u8.

Eu gostaria de transcodificá-lo em algo moderno.

A transcodificação com padrões FFmpeg falha:

libfaac não suporta este formato de saída!

Então, presumivelmente, o libfaac não suporta 8 kHz, porque -c:a copyfunciona.

Quais codificadores suportam uma taxa de amostragem de 8 kHz? Olista encontrada aquiquase não menciona taxas de amostragem.

Posso criar um script de algo que teste todos os codecs instalados, de…

ffmpeg -codecs | grep EA`

…para ver diretamente quais funcionam?

Responder1

O codificador nativo FFmpeg AAC ( -c:a aac) suporta taxa de amostragem de 8.000 Hz:

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

Ele escolherá automaticamente a taxa de amostragem que mais se aproxima da entrada, então você não precisa declarar -ar:

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

Quais codificadores de áudio no FFmpeg suportam 8 kHz?

aac, aptx, aptx_hd, dca, flac, g723_1, libfdk_aac, libmp3lame, libopus, libspeex, libvorbis, real_144, wavpack, muitas variantes pcm.

Provavelmente existem outros, mas o relato deles supported_sampleratesé inconsistente.

Eu gostaria de transcodificá-lo em algo moderno.

libfaac foi removido do FFmpeg há anos e não é considerado um codificador AAC moderno. Você ffmpegdeve ser antigo. Atualize e use o codificador FFmpeg AAC nativo ou compile e use o libfdk_aac.

Se você deseja o uso mais moderno libopus.

Mas quando experimentei [aac], comparado ao original, o tamanho do arquivo aumentou e algumas frequências altas foram atenuadas.

Como suspeito que você ffmpegseja muito antigo, provavelmente você está perdendo as principais atualizações de qualidade do codificador aac. A atualização e a qualidade provavelmente irão melhorar.

Responder2

A taxa de amostragem e o codec são parâmetros diferentes. Muito provavelmente você quer algo como

-ar 48000 -c:a aac

Para aumentar a amostragem de 8KHz para 48KHz e compactar para AAC

Responder3

8 KHz é bastante padrão para fala, conhecido como “banda estreita”. Se isso for discurso, você deverá ter muitas opções, embora nem todas sejam suportadas pelo FFmpeg pronto para uso. Provavelmente as melhores opções são

No entanto, PCM de 8 bits de 8KHz não é uma fonte muito boa em primeiro lugar: a maioria dos codificadores espera / espera uma entrada melhor, por exemplo, G.711 de 8 bits mu-law que é efetivamente dados de 12 bits codificados como 8 bits ponto flutuante. Eles podem não funcionar bem com entrada PCM pura de 8 bits, pois podem não se adequar aos padrões de fala para os quais foram modelados.

Também já é um arquivo bastante pequeno e é possível que seu contêiner de vídeo não suporte codecs mais complicados. Então acho que isso é mais problemático do que vale a pena e deixaria o áudio como está.

Responder4

obraé geralmente considerado o melhor codec de baixa taxa de bits disponível, enão tem problemascom uma taxa de amostragem de entrada de 8kHz. O fluxo de opus resultante ainda pode ser decodificado para qualquer taxa de amostragem conveniente para o decodificador. (Como outros codecs com perdas, ele é compactado com base nas bandas de frequência após fazer uma FFT. Mas alguns outros codecs aparentemente desejam apenas decodificar na mesma taxa de amostragem da entrada. Como outras respostas apontam, vocêpodefaça com que o FFmpeg faça uma nova amostra da entrada antes de fornecê-la ao codec, mas você não precisa disso para o Opus.

Tentarffmpeg -c:a libopus -b:a 24k -frame_duration 120para Opus de 24 kbit/s.

Talvez valha a pena tentar: -application voipajustar para "melhor inteligibilidade de fala" em vez do audioperfil padrão.

Definir -frame_durationo valor mais alto reduz a sobrecarga, eu acho. Você não se importa com a latência do codificador/decodificador porque você só tem arquivos, e não bate-papo por voz bidirecional em tempo real. Assim, você pode armazenar 120 ms de áudio em buffer e agrupar vários quadros CELT ou SILK para reduzir a redundância dos cabeçalhos dos quadros.


O melhor codificador Opus disponível é o gratuito e de código aberto libopus(https://opus-codec.org) então o FFmpeg pode simplesmente usá-lo, ao contrário do AAC, onde os melhores codificadores são de código fechado.

O Opus possui modos especiais para fala com taxa de bits muito baixa (como 16kb/s), detectando fala e até mesmo mudando para um codificador específico de fala (SILK) em taxas de bits baixas.

As ferramentas de codificação de baixa taxa de bits do Opus são semelhantes ao que HE-AACv2 pode fazer, consulteo artigo da Wikipédia.


Mas quando experimentei, comparado ao original, o tamanho do arquivo aumentou...

Parte do objetivo da compactação com perdas é que você podeescolhera taxa de bits de saída, compensando a qualidade. A maioria dos codecs pode usar, -b:a 32kpor exemplo, para escolher uma taxa de bits de áudio de 32 kbit/s.

(Para vídeo, você também pode compensar o tempo de CPU gasto na codificação, por exemplo -preset veryslow versus -preset médio. Mas a compactação de áudio é barata o suficiente para que a maioria dos codecs não tenha muitas opções para gastar mais tempo de CPU para melhorar a taxa de bits versus compensação de qualidade.)

O PCM mono de 8 bits e 8kHz tem uma taxa de bits de 64 kbit/s = 8 * 8000, então você está buscando uma taxa menor do que isso, caso contrário, é melhor manter seus arquivos originais. PCM são apenas amostras brutas, então a taxa de bits é apenas um produto da taxa de amostragem e da largura da amostra. Como o equivalente em áudio de uma .bmpimagem bitmap. Isso é altamente ineficiente e é a razão pela qual codecs melhores foram inventados. (E como você sabe ouvindo, economizar taxa de bits para PCM tem um custo enorme de qualidade e frequênciafaixaporque a taxa de bits está empatada em 1:1 com a taxa de amostragem. Esse não é o caso quando você quantiza no domínio da frequência com um codec com perdas.)


e algumas frequências altas foram atenuadas. Então, pior do que-c:a copy

O codificador AAC nativo do FFmpeg -c:a aaccostumava ser muito ruim e você estava usando um FFmpeg antigo. https://trac.ffmpeg.org/wiki/Encode/HighQualityAudiodiz que a partir de 2017, aacàs vezes é melhor do libfdk_aacque AAC-LC (baixa complexidade e alta taxa de bits). Porém, ele não menciona HE-AAC, e é isso que você deseja para AAC de baixa taxa de bits.

libfdk_aac costumava ser o melhor codificador AAC de código aberto disponível, e talvez ainda seja para HE-AAC. AFAIK, nenhum deles é tão bom quanto os melhores codificadores AAC não livres.

Para AAC de baixa taxa de bits, você realmente deseja o HE-AAC, que adiciona mais ferramentas de codificaçãohttps://en.wikipedia.org/wiki/High-Efficiency_Advanced_Audio_Coding. Não tenho certeza se -c:a aacposso fazer isso.

https://trac.ffmpeg.org/wiki/Encode/HighQualityAudiolista algumas configurações recomendadas e intervalos de taxas de bits úteis para vários codificadores.

Mas você provavelmente deseja Opus, ou possivelmente AMR-NB (banda estreita) para taxas de bits como 4 kbit/s. Eu não sei quantos anoso gráfico de qualidade versus taxa de bits no artigo wiki do Opusé, mas mostra AMR-NB com qualidade superior ao Opus abaixo de 8kb/s.

Com esses poucos bits, você poderá entender a fala, mas ela não soarálegal. É apenas uma questão de qual codec é menos horrível.

informação relacionada