Como posso extrair o áudio do vídeo com o ffmpeg?

227

Eu tentei o seguinte comando para extrair o áudio do vídeo:

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

mas eu recebo a seguinte saída

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

Alguém pode ajudar por favor?

user1269669
fonte

Respostas:

406

Para extrair o fluxo de áudio sem recodificar:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn não há vídeo.
  • -acodec copy diz usar o mesmo fluxo de áudio que já está lá.

Leia a saída para ver qual é o codec, para definir a extensão correta do nome do arquivo.

Paul Irish
fonte
54
e em vez de correr ffmpeg um primeiro tempo apenas para verificar qual o fluxo de áudio é, o uso ffprobe input-video.avi
FlorianB
15
Se você extrair apenas o áudio de um fluxo de vídeo, a duração do áudio poderá ser menor que a duração do vídeo. Para garantir que isso não aconteça, extraia áudio e vídeo com a mesma chamada para ffmpeg, por exemplo "ffmpeg -i vid.avi -map 0: a audio.wav -map 0: v onlyvideo.avi
BlenderBender
2
Seria ótimo expandir essa resposta com um comando que também encapsula o AAC bruto em um contêiner M4A.
Gras Double
8
Nesse caso preciso, basta substituir ".aac" por ".m4a" no caminho de destino. ffmpeg é inteligente o suficiente para adivinhar sua intenção, e ele encapsula o resultado em um recipiente M4A :)
Gras Duplo
1
FWIW, criei um script PHP, para especificar apenas o arquivo de vídeo de entrada e ele determina automaticamente a extensão do arquivo de áudio de saída: superuser.com/questions/1301901/…
Gras Double
117

Para codificar um MP3 de alta qualidade a partir de um AVI, use -q: a para taxa de bits variável:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

Se você deseja extrair uma parte do áudio de um vídeo, use a opção -ss para especificar o registro de data e hora inicial e a opção -t para especificar a duração da codificação, por exemplo, de 3 minutos e 5 segundos em 45 segundos:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • Os registros de data e hora precisam estar no formato HH: MM: SS.xxx ou em segundos.

  • Se você não especificar a opção -t, ela será finalizada.

Exemplo de trabalho:

  1. Baixar ffmpeg
  2. Abra um prompt de comando (Iniciar> Executar> CMD) ou, em um Linux / Mac, abra um Terminal
  3. CD para o diretório com o ffmeg.exe
  4. Emita seu comando e aguarde o arquivo de saída (ou solucione erros)

insira a descrição da imagem aqui

Jeremy Thompson
fonte
3
Aqui está um guia para os -q:avalores: trac.ffmpeg.org/wiki/Encode/MP3 Zero é a configuração de VBR de mais alta qualidade, que normalmente resulta em taxas de bits médias na parte superior do intervalo de CBR sã (onde 320 kbit / s é o máximo, provavelmente um pouco além do ponto em que a compactação sem perdas se torna mais apropriada).
Evgeni Sergeev
3
E o que -map afaz?
Iulian Onofrei 22/09
Advertência: esta é a recodificação do áudio com uma compactação com perdas, o que prejudicará ligeiramente a qualidade. Se o original já estiver compactado, você degradará a qualidade duas vezes, o que pode ou não ser perceptível.
Davidmh
Este comando funciona para mim, quando o comando acima -vnnão.
Mmm
12

A linha de comando está correta e funciona em um arquivo de vídeo válido. Eu garantiria que você instalou a biblioteca correta para funcionar com mp3, instale o lame o probe com outro codec de áudio.

Usualmente

ffmpeg -formats

ou

ffmpeg -codecs

daria informações suficientes para que você saiba mais.

Álvaro
fonte
11

ffmpeg -i sample.avifornecerá as informações de formato de áudio / vídeo para o seu arquivo. Verifique se você possui as bibliotecas apropriadas configuradas para analisar os fluxos de entrada. Além disso, verifique se o arquivo não está corrompido.

smp
fonte
Agora, eu tenho resultado correto quando eu tentei o mesmo comentário com um .mkv vedio.why ele não está funcionando para .avi, existe algum comando ffmpeg para converter .avi
user1269669
1
AVI ou MKV refere-se ao formato do contêiner que pode conter vários formatos diferentes de áudio / vídeo. Você não está olhando para converter áudio AVI, está olhando para converter a faixa de áudio no arquivo AVI, que você ainda não especificou. Use o comando listado acima para ver que tipo de faixa de áudio está no arquivo AVI. Se for MP3, você precisará compilar o FFMPEG com uma biblioteca de MP3 como LAME lame.sourceforge.net
smp
6

Para codificar o áudio mp3, ffmpeg.org mostra o seguinte exemplo:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

Eu extraí o áudio de um vídeo apenas substituindo input.wavpelo nome do arquivo do vídeo. Os 2meios 190 kb / s. Você pode ver os outros níveis de qualidade no meu link acima.

Suragch
fonte
Esse exemplo é para converter um arquivo de áudio em um formato diferente, não para extraí-lo de um vídeo.
Iulian Onofrei
@IulianOnofrei, como descrevi na minha resposta, você pode substituir o arquivo de áudio por um arquivo de vídeo. Funcionou para mim.
Suragch
6

Aqui está o que eu acabei de usar:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

Explicação das opções:

  • my.mkv é um arquivo de vídeo de origem, você também pode usar outros formatos
  • -map 0:3significa que eu quero o terceiro stream do arquivo de vídeo. Coloque seu N lá - os arquivos de vídeo geralmente têm vários fluxos de áudio; você pode omiti-lo ou usá -map 0:a-lo para obter o fluxo de áudio padrão. Execute ffprobe my.mkvpara ver quais fluxos o arquivo de vídeo possui.
  • my.mp3 é um nome de arquivo de áudio de destino e o ffmpeg descobre que quero um MP3 a partir de sua extensão. No meu caso, o fluxo de áudio de origem é DTS ac3 e apenas copiar não era o que eu queria
  • 320k é a taxa de bits desejada
  • -vn significa que não quero vídeo no arquivo de destino
Artem Vasiliev
fonte
2

Apenas um palpite:

-ab 192

deveria estar

-ab 192k

Parece que isso pode ser um problema, mas talvez o ffmpeg seja inteligente o suficiente para corrigi-lo.

Caótico
fonte
2
Comentário válido e editei a pergunta do OP para alterá-lo, mas isso não muda nada (no máximo, isso produz um aviso).
Jean-Philippe Pellet
2

Se o áudio incorporado no avi não estiver no formato mp3, pode ser necessário especificar -acodec mp3como um parâmetro adicional. Ou qualquer que seja o seu codec de mp3 (provavelmente nos sistemas Linux -acodec libmp3lame). Você também pode obter o mesmo efeito, independente de plataforma, especificando -f mp3"forçar" o formato para mp3, embora nem todas as versões do ffmpeg ainda suportem essa opção. Sua milhagem pode variar.

Xheralt
fonte
2

Para extrair sem conversão, uso uma entrada do menu de contexto - como ação personalizada do gerenciador de arquivos no Linux - para executar o seguinte (depois de verificar o tipo de áudio que o vídeo contém; por exemplo, o vídeo que contém oggáudio):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

que é baseado no comando ffmpeg ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

Eu usei -map 0:1isso sem problemas, mas, como foi dito em um comentário de @LordNeckbeard, " 0:1não é garantido que o stream sempre seja áudio. Usar em -map 0:avez de -map 0:1evitará ambiguidade".


fonte
1
0:1Não é garantido que o fluxo seja sempre áudio. Usar em -map 0:avez de -map 0:1evitará ambiguidade.
Llogan 17/05/19
@LordNeckbeard ~ Vou levar isso em conta, obrigado.
Eu costumava mediainfodeterminar a faixa de áudio e a escolhi assim: -map 0:a:1onde a: 1 é o segundo índice de faixa de áudio, thx! -c:a copytornou muito mais rápido!
Poder de Aquário
1

Para quem procura a maneira mais simples de extrair o áudio de um arquivo de vídeo, mantendo os parâmetros do arquivo de vídeo original, você pode usar:

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

Por exemplo, executando:

ffmpeg -i screencap.mov screencap.mp3

extrai um mp3arquivo de áudio de um movarquivo de vídeo.

Iulian Onofrei
fonte
Simples e funciona. Por que todas as outras soluções são tão complicadas? +1
Scott Biggs
1
A questão é: por que isso tem um voto de exclusão ?!
Iulian Onofrei
-1

Use em -b:avez de -abcomo -abestá desatualizado agora, também verifique se o caminho do arquivo de entrada está correto.

Para extrair o áudio de um vídeo, usei o comando abaixo e está funcionando bem.

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

Aqui,

  • -y - Sobrescreva arquivos de saída sem perguntar.
  • -i- O FFmpeg lê a partir de um número arbitrário de "arquivos" de entrada especificados pela -iopção
  • -vn - Desativar gravação de vídeo
  • -ar - define a taxa de amostragem para fluxos de áudio se codificado
  • -ac - Defina o número de canais de áudio.
  • -b:a - Defina a taxa de bits do áudio
  • -f - formato

Confira isso no meu exemplo completo do projeto android FFmpeg no GitHub.

Desenvolvedor Android
fonte