Isso deve ser bastante trivial, mas não consigo encontrar uma maneira de fazê-lo funcionar.
Quero que o FFmpeg pegue uma imagem JPEG e um arquivo de áudio como entrada e gere um arquivo de vídeo com a mesma duração que o arquivo de áudio (esticando a imagem estática por toda a duração).
Eu não ligo muito para qual codec de vídeo é usado para saída, mas é vital que eu possa usar "copiar" como codec de áudio (por exemplo, copiar o fluxo de áudio sem transcodificá-lo).
Qual é a linha de comando correta que faria isso?
Eu tentei:
ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi
e tentei um monte de combinações com e sem -s 640x360
, -loop_input
, -shortest
, -t xxx
, -r 0.1
(artificialmente baixa taxa de quadros na esperança de que o vídeo seria mais) e-f image2
Ou eu recebo erros ou recebo um arquivo de vídeo com a duração de um quadro.
Pesquisei no Google e encontrei uma dúzia de soluções propostas (supostamente para essa mesma pergunta), nenhuma das quais funciona.
Alguém pode sugerir um comando funcional e explicar a lógica por trás dele?
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Respostas:
A ordem das opções na linha de comando é importante. O seguinte funciona para o meu caso:
Em um caso mais geral, onde
image.jpg
e ondeaudio.wav
está sua entrada, você pode usar o seguinte comando, adaptado do wiki do FFmpeg :Isso usaria o
libx264
codificador e forneceria uma compressão melhor do que o codec MJPEG usado acima. O áudio é AAC, com offmpeg
codificador AAC embutido .fonte
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
isso funciona melhor !!!?! ??!?!Você está fazendo isso maneira mais difícil do que tem que ser. O FFmpeg é muito mais inteligente do que você acredita - sabe que você deseja que o vídeo tenha a mesma duração da sua faixa de áudio.
Os únicos atributos que você precisa especificar são the
input filenames
, theoutput codecs
e theoutput filename
(que e o ipso inclui theoutput container
,).Obviamente, faz sentido começar com uma imagem estática que compartilhe as mesmas dimensões que o seu eventual vídeo; se você estiver usando um editor de imagens dedicado em vez de especificar as dimensões de saída para o FFmpeg atender, precisará garantir que suas dimensões de entrada sejam pares .
O tamanho da saída é um dos problemas mais comuns do FFmpeg; alguns codecs são mais restritos em dimensões de saída do que outros, mas nenhuma saída pode ter atributos de altura ou largura de número ímpar.
O
pause
comando no final do arquivo em lote mantém a CLI aberta - a melhor maneira de depurar sua linha de comando é lendo as mensagens de erro geradas. Eles são extremamente específicos - e a melhor documentação que o FFmpeg possui - mas o trabalho duro dos desenvolvedores é desperdiçado se você permitir que a janela se feche antes de poder lê-los.O shell de comando possui uma opção
cmd /k
que mantém uma janela aberta, na qual é possível executar as mesmas instruções do script em lote no prompt de comando.FFmpeg e avconv vai ambos fazem você usa
-c:a
para-acodec
e-c:v
para-vcodec
, eventualmente, mas as antigas instruções funcionar bem na constrói eu uso.Nota Bene: Todo commit possui idiossincrasias. Se sua linha de comando estiver falhando sem motivo aparente, geralmente é útil tentar outra compilação - ou seguir a bifurcação para o libav , onde os desenvolvedores mais ativos do FFmpeg estiveram nos últimos dois anos. Sua ferramenta de transcodificação foi renomeada para avconv, mas seus arquivos em lotes devem funcionar com qualquer um deles.
fonte
Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53
Nem sua solução nem a @matteo funcionaram para mim. Além disso, baixei seus arquivos do Google Drive, mas não deu a saída esperada (o arquivo de saída era preto e continha apenas áudio). Por favor, ajude-me a descobrir o comando certo a ser usado.Ainda mais fácil:
ffmpeg -i ep1.png -i ep1.wav ep1.flv
O FFmpeg tentará escolher o melhor codec automaticamente, dependendo da extensão do seu arquivo de saída.
Atualização: notei que o YouTube tem dificuldade em processar o vídeo (fica parado em 95%), acho que porque existe apenas um quadro. A solução que encontrei para deixar o YouTube feliz: adicione mais quadros. Além disso, eu adicionei
-acodec copy
para preservar a qualidade do áudio. Você precisa-shortest
ou faz um loop para sempre. (Ele pára no final do fluxo mais curto, que é o áudio, porque o loop da imagem é infinito.) A ordem das suas opções é muito importante para a velocidade, pois os filtros (e outros) são processados na ordem que você especificar. Se você alterar a ordem desses parâmetros, os resultados serão dramaticamente diferentes.ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv
Observe também que eu defino a taxa de quadros duas vezes, isso não é um acidente - a primeira taxa de quadros é para a entrada e a segunda é para a saída. Se você fizer isso corretamente, deve haver apenas um quadro por segundo de vídeo, o que significa que ele codifica relativamente rápido. Também defino a resolução para 720p aqui, o que significa que você deve obter áudio HD no YouTube :-)
fonte
No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)
... isso funciona:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
A versão que funcionou para mim:
Faça o checkout da opção
-shortest
deve estar na frente do arquivo de saída, caso contrário, recebo o erro abaixo:A opção mais curta (concluir a codificação na entrada mais curta) não pode ser aplicada ao arquivo de entrada pic.jpg - você está tentando aplicar uma opção de entrada a um arquivo de saída ou vice-versa. Mova esta opção antes do arquivo ao qual pertence. Erro ao analisar as opções do arquivo de entrada pic.jpg.
fonte
Na página de manual do ffmpeg:
Como você descobriu, as opções de infile devem vir antes do infile ao qual se aplicam.
Isso não é um bug, no entanto, apenas um mecanismo pelo qual você pode especificar a quais argumentos infile se aplicam.
fonte
Isso funcionou para mim
Descobri que o vcodec
libx264
criou arquivos muito menores quempjeg
(10 MB em vez de 100 MB).fonte
-shortest
é uma opção de saída e pode ser ignorada como uma opção de entrada enquanto você a usa.Eu estava tentando fazer como @matteo , mas sem o áudio, e a solução do @Colonel Panic funcionou melhor:
Eu só tive que adicionar um argumento de duração em segundos (
-t 10
).fonte
-shortest
é uma opção de saída, mas você a está usando como uma opção de entrada. Mova-o antes do arquivo de saída e você poderá eliminá-lo-t 10
, mas sua resposta será praticamente a mesma que as outras.ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4
fonte
Caso alguém queira convertê-los em lote, tente isso.
Você pode definir a pasta de entrada e saída, e também o formato em que deseja que o vídeo esteja. Nesse caso, defino-o como AVI.
Esta resposta Combinar uma imagem + um arquivo de áudio para fazer um vídeo usando o FFmpeg me ajudou muito.
fonte
Tente este comando. É trabalhado para mim.
fonte