Estou executando o seguinte comando:
ffmpeg -i audio.mp3 -ar 44100 -f image2 -i logo.jpg -r 15 -b 1800 -s 640x480 foo.mov
Que gera com sucesso um vídeo com meu áudio gravado e uma imagem nele.
Quando tento fazer o upload para o YouTube, ele não é processado, independentemente dos formatos que tento: .mov, .avi, .flv, .mp4
Falta alguma configuração acima que gere um formato que o Youtube aceite? Eu tentei olhar através da documentação do ffmpeg, mas eu estou pensando demais.
Eu fiz um experimento colocando um vídeo de 2 segundos com um mp3 de 30 segundos. Quando carreguei no youtube, o vídeo resultante tinha apenas 2 segundos. Portanto, pode ser que o YouTube olhe apenas para a faixa de vídeo e, como uma imagem tem apenas um quadro ou qualquer outra coisa, talvez isso seja um problema.
Um pedaço de código que funciona para mim, de outro fórum:
fonte
Peguei o código de Pavel, que também funcionou para mim, e o reduzi cortando opções desnecessárias:
Essa é uma forma geral que funciona com qualquer arquivo de imagem e áudio como entrada e produz um arquivo de vídeo como saída.
Dito isto, como seu fluxo de vídeo será composto de uma única imagem repetida indefinidamente, você poderá definir uma baixa taxa de quadros (ou seja, o número de imagens que aparece em um segundo)
-r
. Observe que nem todos os contêineres de saída permitem taxas de quadros baixas. Um que faz éavi
, então você pode fazer:isso criaria um arquivo de vídeo com uma taxa de quadros de 0,1 (ou seja, uma imagem a cada 10 segundos) em vez do padrão de 25. Isso afetará o tamanho do arquivo, mas não a qualidade do vídeo. Eventualmente, você pode definir a taxa de bits do áudio para obter uma melhor qualidade de áudio
-ab
. Este é o comando que eu realmente uso para fazer esse tipo de vídeo para o youtube:fonte
ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.avi
mas obtive 'Loop de opção não encontrado'. Alguma ideia?ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
com avconv:
fonte
-shortest
opções de saída em vez de declarar horários manualmente (também, use emffmpeg
vez deavconv
se possível).Consegui que isso funcionasse após muita experimentação: https://www.youtube.com/watch?v=qjlDT819Q3s
Converta imagens em vídeo, de acordo com https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images :
ffmpeg -framerate 1/20 -i png/img-%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" png.mp4
Aqui eu uso várias imagens e as faço mudar a cada 20 anos.
Concatene cópias suficientes do vídeo acima para abranger a duração do seu áudio, conforme https://trac.ffmpeg.org/wiki/Concatenate . Outras soluções, como esperar
ffmpeg -i wav.wav -i png.mp4 youtube.mp4
fazer a coisa certa, acabaram sendo rejeitadas pelo YouTube (também, players como o VLC estão confusos e não podem procurar adequadamente). Meu palpite é que as posições de tempo precisam ser ajustadas nas cópias, o queffmpeg
não funciona, a menos que sejam concatenadas:ffmpeg -f concat -i pngs.txt -c copy pngs.mp4
(onde o arquivo
pngs.txt
é feito à mão para conter quantas cópias forem necessárias: cópias = duração do áudio / duração do vídeo)Misture seu áudio com o vídeo obtido em 2, conforme https://www.virag.si/2015/06/encoding-videos-for-youtube-with-ffmpeg/ :
ffmpeg -i pngs.mp4 -i wav.wav -shortest -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart youtube.mp4
Agora o arquivo
youtube.mp4
deve ser aceito pelo YT.fonte