Criando vídeo com áudio e imagem parada para o YouTube


23

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.

Respostas:


13

Aqui está o que funcionou:

ffmpeg -i audio.mp3 -f image2 -loop 1 -i logo.jpg 
-r 15 -s 640x480 \
-c:v libx264 -crf 18 -tune stillimage -preset medium \
-shortest foo.mov

Especificamente, a loopopção, que duplicará a imagem como quadros. Ele também precisará da shortestopção para impedir que o arquivo cresça e cresça (dessa forma, ele o trunca para a duração do fluxo mais curto - aqui, o arquivo de áudio).

A ropção altera a taxa de quadros e crf 18define a qualidade (use um valor mais alto aqui para obter uma qualidade de vídeo mais baixa). Veja aqui para mais detalhes: FFmpeg: A melhor ferramenta de manipulação de vídeo e áudio


2
Não funciona para mim. Eu recebo um filme de um quadro.
Pavel Vlasov

Eu trabalho para mim agora.
22414 Molnarg

4

Um pedaço de código que funciona para mim, de outro fórum:

ffmpeg -loop 1 -r ntsc -i image.jpg -i song.mp3 -c:a copy -c:v libx264 -preset fast -threads 0 -shortest output.mkv 

2

Peguei o código de Pavel, que também funcionou para mim, e o reduzi cortando opções desnecessárias:

ffmpeg -loop 1 -shortest -i <audio file> -i <image file> <output video file>

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:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> output.avi

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:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> -ab 128k output.avi

Obrigado. Eu corri, ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.avimas obtive 'Loop de opção não encontrado'. Alguma ideia?
Coronel Panic

@col Se ainda estiver interessado: você precisa da opção de loop antes da entrada da imagem, não antes do áudio.
slhck

isto é o que funcionou para mim:ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
Karolinger

2

com avconv:

avconv -i input.mp3 -loop 1 -f image2 -i logo.png -r 30 -s 640x480 -ab 128k -ar 44100 -ac 1 -ss 00:00:00.000 -t 01:02:03.123 foo.ogv

Bem-vindo ao SuperUser e obrigado pela sua resposta. Mais alguns detalhes sobre o que você está propondo e por que seria útil.
Brad Patton

1
a resposta é devido ffmpeg está obsoleto
ZiTAL

2
Não, o projeto ffmpeg está em andamento. Houve uma disputa que levou à mensagem descontinuada. Veja stackoverflow.com/questions/9477115/…
Brad Patton

2
Use as -shortestopções de saída em vez de declarar horários manualmente (também, use em ffmpegvez de avconvse possível).
Llogan

2
Feito um script bash em caso alguém estiver interessado
Dallaylaen

0

Consegui que isso funcionasse após muita experimentação: https://www.youtube.com/watch?v=qjlDT819Q3s

  1. 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.

  2. 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.mp4fazer 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 que ffmpegnã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)

  3. 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.mp4deve ser aceito pelo YT.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.