Como converter uma série de imagens PNG em um vídeo para o YouTube?

13

Eu tenho uma sequência de PNGs ( aqui está uma amostra ) que eu viro em um vídeo com ffmpeg:

ffmpeg -r 10 -i image%03d.png -s 1380x720 -c:v libx264 -qscale 10 -r 30
       basf_merck_libx264.mp4

Com o VLC, tudo fica bonito e elegante, mas no youtube tudo o que vejo é cinza !? porque?

insira a descrição da imagem aqui

Depois de um tempo, é exibida uma barra horizontal com pontos coloridos:

insira a descrição da imagem aqui

Quando adiciono '-pix_fmt yuv420p' ao comando, o youtube mostra o clipe corretamente. Mas a qualidade mais alta que posso escolher é 480p, que é muito baixa para esse fim.

saída ffmpeg

C:\Users\Raffael\Documents\proj>ffmpeg -r 10 -i image%03d.png -s 1380x720 -c:v libx264 -qscale 10 -r 30 basf_merck_libx264.mp4
ffmpeg version N-48785-g2ea3f37 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jan 12 2013 20:45:33 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnu
tls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-l
ibopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libtwol
ame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
--enable-filter=frei0r
  libavutil      52. 14.100 / 52. 14.100
  libavcodec     54. 86.100 / 54. 86.100
  libavformat    54. 59.107 / 54. 59.107
  libavdevice    54.  3.102 / 54.  3.102
  libavfilter     3. 32.100 /  3. 32.100
  libswscale      2.  1.103 /  2.  1.103
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from 'image%03d.png':
  Duration: 00:00:02.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 1380x720, 25 fps, 25 tbr, 25 tbn, 25 tbc
Please use -q:a or -q:v, -qscale is ambiguous
File 'basf_merck_libx264.mp4' already exists. Overwrite ? [y/N] y
using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cache64
[libx264 @ 00000000021c6fe0] profile High 4:4:4 Predictive, level 3.2, 4:4:4 8-bit
[libx264 @ 00000000021c6fe0] 264 - core 129 r2230 1cffe9f - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options:
 cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 dead
zone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_int
ra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahea
d=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'basf_merck_libx264.mp4':
  Metadata:
    encoder         : Lavf54.59.107
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv444p, 1380x720, q=-1--1, 15360 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> libx264)
Press [q] to stop, [?] for help
frame=  151 fps= 16 q=-1.0 Lsize=    1995kB time=00:00:04.96 bitrate=3290.5kbits/s dup=100 drop=0
video:1992kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.127092%
[libx264 @ 00000000021c6fe0] frame I:1     Avg QP:22.19  size: 57949
[libx264 @ 00000000021c6fe0] frame P:54    Avg QP:26.90  size: 36277
[libx264 @ 00000000021c6fe0] frame B:96    Avg QP:21.56  size:   236
[libx264 @ 00000000021c6fe0] consecutive B-frames:  5.3%  1.3% 85.4%  7.9%
[libx264 @ 00000000021c6fe0] mb I  I16..4: 71.1%  2.5% 26.4%
[libx264 @ 00000000021c6fe0] mb P  I16..4:  0.6%  0.5%  5.7%  P16..4:  3.1%  2.1%  2.9%  0.0%  0.0%    skip:85.0%
[libx264 @ 00000000021c6fe0] mb B  I16..4:  0.2%  0.1%  0.0%  B16..8:  4.7%  0.1%  0.0%  direct: 0.0%  skip:94.9%  L0:77.6% L1:22.3% BI: 0.1%
[libx264 @ 00000000021c6fe0] 8x8 transform intra:7.7% inter:5.2%
[libx264 @ 00000000021c6fe0] coded y,u,v intra: 59.5% 54.3% 52.9% inter: 1.3% 1.0% 0.6%
[libx264 @ 00000000021c6fe0] i16 v,h,dc,p: 81% 15%  4%  0%
[libx264 @ 00000000021c6fe0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10%  5% 64%  3%  2%  4%  3%  4%  3%
[libx264 @ 00000000021c6fe0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 13% 21%  7%  6%  7%  6%  7%  6%
[libx264 @ 00000000021c6fe0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 00000000021c6fe0] ref P L0: 65.3%  9.0% 20.2%  5.5%
[libx264 @ 00000000021c6fe0] ref B L0: 73.0% 21.7%  5.3%
[libx264 @ 00000000021c6fe0] ref B L1: 90.8%  9.2%
[libx264 @ 00000000021c6fe0] kb/s:3241.64

Eu coletei as informações no meu site: http://www.joyofdata.de/blog/hd-clips-with-ffmpeg-for-youtube-and-vimeo/

Raffael
fonte
Forneça a saída completa e sem cortes do console para os comandos FFmpeg. Os formatos de pixel não estão relacionados às dimensões, portanto, você sempre deve poder selecionar mais de resolução de 480p no YouTube se sua fonte for 720p ou superior.
slhck
adicionou a saída do comando ffmpeg. O clipe assistido com o VLC ainda mostra a antiga resolução maior. Mas o youtube me oferece apenas 480p.
Raffael

Respostas:

34

O YouTube espera que seu vídeo seja codificado em H.264 . Se você usar libx264, siga as sugestões de codificação do YouTube:

ffmpeg -framerate 10 -i image%03d.png -s:v 1280x720 -c:v libx264 \
-profile:v high -crf 20 -pix_fmt yuv420p daimler_man.mp4

Dicas:

  • -qscaleé uma maneira de definir qualidade, mas por -qscalesi só é ambíguo. Use -qscale:vpara -qscale:acodificadores de vídeo e de áudio compatíveis. Não use essa opção, a menos que saiba o que isso significa.

    x264 tem uma opção melhor para a qualidade Ambiente: -crf. O fator de taxa constante é um modo de codificação de qualidade constante. Valores mais baixos significam melhor qualidade, mas qualquer coisa abaixo de 18 pode não ser visualmente melhor. O padrão é 23, mas algo como 20 seria melhor, pois o YouTube recodifica seu vídeo novamente.

  • -pix_fmt yuv420pdeve ser usado para ativar a redução de escala de 4: 2: 0 para a entrada PNG, que geralmente não é reduzida (4: 4: 4, conforme observado na saída) e geralmente contém um canal alfa. O YouTube não lidará com isso corretamente.

  • -rnão é necessário para definir a taxa de quadros de saída, pois o YouTube manipula quase todas as taxas de quadros de qualquer maneira. Ao ler 10 imagens por segundo como entrada, alterar a taxa de quadros de saída para algo mais alto (por exemplo, 30) duplicará os quadros, o que não é necessário.

  • -s:v 1380x720é uma resolução estranha. Pense em usar a resolução nativa 16: 9 720p 1280 × 720 e gere novamente suas plotagens, se necessário. Isso poupará alguns problemas e problemas de caixa de correio no YouTube, e a aderência a dimensões incomuns pode impedir que seu vídeo seja exibido em resolução total ou oferecido na configuração de qualidade 720p.

  • Use o contêiner MP4 em vez de MOV, sugerido pelo YouTube. O MP4 é praticamente idêntico em funcionalidade ao MOV, mas possui melhor suporte em dispositivos de reprodução. Em geral, prefira isso a MOV quando puder.

slhck
fonte
Não acho que os comentários -qscalefaçam sentido. Pois libx264é o mesmo que definir -qp, não é? É uma opção que se aplica à compactação x264; portanto, a origem sendo PNG é irrelevante. Independentemente disso, -crfé uma escolha melhor do que -qpou -b:vpara uma passagem com a qualidade desejada . (em vez de uma taxa de bits de destino).
Peter Cordes
1
você também deve corrigir o efeito de quadros duplicados. -framerate 10 -i input -r 30irá gerar duplicatas ao enviar para mp4. (não para mkv, por motivos relacionados ao ffmpeg suportando vfr em mkv, acho.) Se o seu conteúdo for 10 fps, faça um vídeo de saída de 10 fps. Eu acho que o youtube suporta qualquer taxa de quadros que você deseja (até 60). As câmeras de telefones celulares gravam vídeo h.264 com taxa de quadros variável em mp4 (especialmente com pouca luz); portanto, se você puder enviá-las diretamente para o youtube, ficará bem.
Peter Cordes
@PeterCordes Absolutely. Eu peguei -r 30o comando do OP sem alterá-lo.
slhck
Com um comando baseado no comando desta resposta ( ffmpeg -y -framerate 1 -i static_image.png -i bg_music.mp3 -s:v 1280x720 -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p output.mp4), infelizmente ainda recebo o misterioso erro "vídeo falhou ao processar". Não tenho certeza de como depurá-lo, infelizmente.
Radon Rosborough