Eu tenho um vídeo antigo (feito por um Casio Exilim EX-Z40, se for o caso), cujo fluxo de áudio ffprobe
é relatado como pcm_u8, 8000 Hz, mono, u8
.
Eu gostaria de transcodificá-lo em algo moderno.
A transcodificação com os padrões do FFmpeg falha:
libfaac não suporta este formato de saída!
Então, presumivelmente, o libfaac não suporta 8 kHz, porque -c:a copy
funciona.
Quais codificadores suportam uma taxa de amostragem de 8 kHz? A lista encontrada aqui mal menciona as taxas de amostragem.
Posso fazer um script de algo que tente todos os codecs instalados, de…
ffmpeg -codecs | grep EA`
…para ver diretamente quais funcionam?
O codificador FFmpeg AAC nativo (
-c:a aac
) suporta taxa de amostragem de 8000 Hz:Ele escolherá automaticamente a taxa de amostragem que mais se aproxima da entrada, então você não precisa declarar
-ar
:aac, aptx, aptx_hd, dca, flac, g723_1, libfdk_aac, libmp3lame, libopus, libspeex, libvorbis, real_144, wavpack, muitas variantes de pcm.
Provavelmente existem outros, mas o relato
supported_samplerates
é inconsistente.O libfaac foi removido do FFmpeg por anos e não é considerado um codificador AAC moderno. Você
ffmpeg
deve ser antigo. Atualize e use o codificador FFmpeg AAC nativo ou compile e uselibfdk_aac
.Se você quer o uso mais moderno
libopus
.Como eu suspeito que o seu
ffmpeg
é muito antigo, você provavelmente está perdendo as principais atualizações de qualidade para o codificadoraac
. A atualização e a qualidade provavelmente melhorarão.A taxa de amostragem e o codec são parâmetros diferentes. Muito provavelmente você quer algo na linha de
Para fazer upsample de 8KHz para 48KHz e comprimir para AAC
8 KHz é bastante padrão para fala, conhecido como 'banda estreita'. Se for fala, você deve ter muitas opções, embora nem todas sejam suportadas pelo FFmpeg pronto para uso. Provavelmente as melhores opções são
No entanto, o PCM de 8 bits e 8 KHz não é uma fonte muito boa em primeiro lugar: a maioria dos codificadores espera / espera uma entrada melhor, por exemplo, lei mu G.711 de 8 bits, que é efetivamente dados de 12 bits codificados como 8 bits ponto flutuante. Eles podem não funcionar bem com a entrada PCM pura de 8 bits, pois podem não se ajustar 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. Portanto, acho que isso é mais problema do que vale a pena e deixaria o áudio como está.
O Opus é geralmente considerado o melhor codec de baixa taxa de bits disponível e não apresenta problemas com uma taxa de amostragem de entrada de 8 kHz. O fluxo opus resultante ainda pode ser decodificado para qualquer taxa de amostragem conveniente para o decodificador. (Como outros codecs com perdas, ele comprime com base nas bandas de frequência depois de fazer um FFT. Mas alguns outros codecs aparentemente só querem decodificar para a mesma taxa de amostragem da entrada. Como outras respostas apontam, você pode obter o FFmpeg para reamostrar a entrada antes dando-o ao codec, mas você não precisa disso para o Opus.
Tente
ffmpeg -c:a libopus -b:a 24k -frame_duration 120
para Opus de 24 kbit/s.Talvez valha a pena tentar:
-application voip
ajustar para "melhor inteligibilidade de fala" em vez doaudio
perfil padrão.Definir
-frame_duration
o 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, não bate-papo por voz bidirecional em tempo real. Portanto, você pode armazenar em buffer 120 ms de áudio e agrupar vários quadros CELT ou SILK para reduzir a redundância dos cabeçalhos do quadro.O melhor codificador Opus disponível é o código aberto e gratuito
libopus
( https://opus-codec.org ), portanto, o FFmpeg pode apenas 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 alternando para um codificador específico de fala (SILK) em taxas de bits baixas.
As ferramentas de codificação de baixa taxa de bits da Opus são semelhantes ao que o HE-AACv2 pode fazer, consulte o artigo da wikipedia .
Parte do ponto de compactação com perdas é que você pode escolher a taxa de bits de saída, compensando a qualidade . A maioria dos codecs pode usar,
-b:a 32k
por 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 vs. -preset medium. Mas compactar áudio é barato 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, portanto, você deseja um valor menor do que isso; caso contrário, é melhor manter seus arquivos originais. O PCM é apenas amostras brutas, portanto, a taxa de bits é apenas um produto da taxa de amostragem e da largura da amostra. Como o equivalente em áudio de uma
.bmp
imagem bitmap. Isso é altamente ineficiente e é a razão pela qual melhores codecs foram inventados. (E como você sabe por ouvir, salvar a taxa de bits para PCM tem um custo enorme para a qualidade e a faixa de frequência porque 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.)O codificador AAC nativo do FFmpeg
-c:a aac
costumava ser muito ruim e você estava usando um FFmpeg antigo. https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio diz que, a partir de 2017,aac
às vezes é melhor do quelibfdk_aac
para AAC-LC (alta taxa de bits de baixa complexidade). 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 HE-AAC, que adiciona mais ferramentas de codificação https://en.wikipedia.org/wiki/High-Efficiency_Advanced_Audio_Coding . Não tenho certeza se
-c:a aac
pode fazer isso.https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio lista algumas configurações recomendadas e faixas de taxas de bits úteis para vários codificadores.
Mas você provavelmente quer Opus, ou possivelmente AMR-NB (banda estreita) para taxas de bits como 4 kbit/s. Não sei quantos anos tem o gráfico de qualidade versus taxa de bits no artigo wiki do Opus , mas mostra AMR-NB com qualidade superior ao Opus abaixo de 8 kb/s.
Com esses poucos bits, você pode entender a fala, mas não vai soar bem . É apenas uma questão de qual codec é menos horrível.