Melhor resposta , com explicação, incorporando sugestões inteligentes de slhck e Mulvya, sem parâmetros essenciais.
ffmpeg -i video.mp4 -i cover.jpg -acodec libmp3lame -b:a 256k -c:v copy -map 0:a:0 -map 1:v:0 output.mp3
ffmpeg
ferramenta de manipulação de áudio / vídeo: já selecionada pelo OP, é especialmente adequada para este trabalho.
-i video.mp4
primeiro arquivo de entrada: um vídeo com algum áudio que queremos extrair.
-i cover.jpg
segundo arquivo de entrada, uma imagem que queremos exibir quando reproduzimos o arquivo de áudio resultante.
-acodec libmp3lame
queremos criar um arquivo .mp3 usando o codificador LAME.
-b:a 256k
define a taxa de bits da faixa de áudio para uma constante de 256Kb / s. Uma opção mais inteligente seria codificar com uma taxa de bits variável, especificando o parâmetro quality : -q:a 0
pede o máximo qualidade, enquanto -q:a 4
geralmente representa um bom compromisso entre a qualidade de áudio percebida e a taxa de bits (e, portanto, o tamanho do arquivo).
-c:v copy
indica que o fluxo de vídeo (a imagem .jpg) não deve ser reencodificado, mas deve ser copiado como está. Isso é útil para evitar processamento desnecessário e possível perda de qualidade ao reencodificar para um formato com perdas. No nosso caso, sem esse parâmetro, a imagem seria decodificada de .jpg e codificada para .png, que aparentemente é o formato nativo que é escolhido por padrão. Isso não representaria uma perda na qualidade, já que o .png é o lossles, mas com mais freqüência o tamanho do arquivo aumentará, devido ao fato de que o .jpg (com perdas) geralmente oferece uma taxa de compactação melhor.
-map 0:a:0
isto seleciona o fluxo a ser usado a partir do primeiro arquivo de entrada ( 0:
): ele precisa ser o primeiro ( :0
) fluxo de áudio ( a
) que contém.
-map 1:v:0
seleciona o primeiro fluxo de vídeo ( :0
) ( v
) do segundo arquivo de entrada ( 1:
).
output.mp3
o nome desse parâmetro foi engenhosamente escolhido para sugerir que este deve ser o nome a ser dado ao arquivo de saída de áudio (.mp3) com a imagem incorporada que queremos criar.
Resposta original
Isso cria um arquivo de áudio (.mp3) com uma imagem estática reunindo um vídeo (.mp4) e uma imagem (.jpg) do meu casamento:
ffmpeg -i video.mp4 -i cover.jpg -acodec libmp3lame -metadata title=video -b:a 256k -map_metadata 0 -map 0:1 -map 1 output.mp3
Veja ffmpeg documentação sobre a seleção de fluxos de entrada com -map
, que é a opção relevante aqui.
Primeiro, executei o comando com apenas -map 0 -map 1
e obtive esta informação:
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> png (native))
Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame))
Stream #1:0 -> #0:2 (mjpeg (native) -> png (native))
Assim, eu sabia que queria o fluxo 1
(aac audio) do arquivo que possui um número de índice de 0
, ou seja, o arquivo de vídeo; portanto, tinha que ser explicitamente selecionado com -map 0:1 -map 1
.