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, é particularmente 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
isso define a taxa de bits da faixa de áudio para 256Kb / s constante. Uma opção mais inteligente seria codificar com uma taxa de bits variável, especificando o parâmetro de qualidade : -q:a 0
solicita a qualidade máxima, enquanto -q:a 4
muitas vezes representa um bom compromisso entre a qualidade de áudio percebida e a taxa de bits (e, portanto, o tamanho do arquivo).
-c:v copy
isso indica que o fluxo de vídeo (a imagem .jpg) não deve ser recodificado, mas deve ser copiado como está. Isso é útil para evitar processamento desnecessário e perda potencial de qualidade ao recodificar em um formato com perda. No nosso caso, sem esse parâmetro, a imagem seria decodificada de .jpg e codificada para .png, que aparentemente é o formato nativo escolhido por padrão. Isso não representaria uma perda de qualidade, já que .png é lossles, mas, com mais freqüência, aumentará o tamanho do arquivo, devido ao fato de que .jpg (com perda) geralmente oferece uma melhor taxa de compactação.
-map 0:a:0
isso seleciona o fluxo a ser usado desde o primeiro (0:
arquivo de entrada ): ele deve ser o primeiro :0
( a
) fluxo de áudio ( ) que ele contém.
-map 1:v:0
isso seleciona o primeiro (:0
) vídeo ( v
) do segundo ( 1:
) arquivo de entrada.
output.mp3
o nome desse parâmetro foi astuciosamente escolhido para sugerir que esse deve ser o nome a ser dado ao arquivo de áudio de saída (.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
Consulte a documentação do ffmpeg sobre a seleção de fluxos de entrada com-map
, que é a opção relevante aqui.
Primeiro executei o comando com simplicidade -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 transmitir 1
(áudio aac) a partir do arquivo que possui um número de índice 0
, ou seja, o arquivo de vídeo; portanto, teve que ser explicitamente selecionado com -map 0:1 -map 1
.