Comment convertir une série d'images PNG en vidéo pour YouTube?

13

J'ai une séquence de PNG (en voici un exemplaire ) que je transforme en vidéo avec ffmpeg:

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

Avec VLC, tout est beau et dandy, mais sur YouTube, tout ce que je vois est gris!? Pourquoi?

entrez la description de l'image ici

Après un certain temps, une barre horizontale avec des taches colorées s'affiche:

entrez la description de l'image ici

Lorsque j'ajoute «-pix_fmt yuv420p» à la commande, YouTube affiche correctement le clip. Mais alors la plus haute qualité que je peux choisir est 480p, ce qui est trop faible à cet effet.

sortie 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

J'ai collecté les informations sur mon site Web: http://www.joyofdata.de/blog/hd-clips-with-ffmpeg-for-youtube-and-vimeo/

Raffael
la source
Veuillez fournir la sortie console complète et non coupée pour la ou les commandes FFmpeg. Les formats de pixels ne sont pas liés aux dimensions, vous devez donc toujours pouvoir sélectionner une résolution supérieure à 480p sur YouTube si votre source est supérieure ou égale à 720p.
slhck
ajouté la sortie de la commande ffmpeg. Le clip regardé avec VLC montre toujours l'ancienne résolution plus grande. Mais YouTube ne me propose que 480p.
Raffael

Réponses:

34

YouTube s'attend à ce que votre vidéo soit codée H.264 . Si vous utilisez libx264, respectez les suggestions d'encodage de 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

Conseils:

  • -qscaleest un moyen de définir la qualité, mais -qscaleseul est ambigu. À utiliser -qscale:vpour -qscale:ales encodeurs vidéo et audio qui le prennent en charge. N'utilisez cette option que si vous savez ce que cela signifie.

    x264 a une meilleure option pour la qualité de réglage: -crf. Le facteur de débit constant est un mode de codage de qualité constante. Des valeurs plus faibles signifient une meilleure qualité, mais tout ce qui est inférieur à 18 peut ne pas être visuellement meilleur. La valeur par défaut est 23, mais quelque chose comme 20 serait préférable car YouTube réencode à nouveau votre vidéo.

  • -pix_fmt yuv420pdoit être utilisé pour activer le sous-échantillonnage 4: 2: 0 pour l'entrée PNG, qui n'est généralement pas du tout sous-échantillonné (4: 4: 4, comme observé dans votre sortie) et contient souvent un canal Alpha. YouTube ne gère pas cela correctement.

  • -rn'est pas nécessaire pour définir la fréquence d'images de sortie, car YouTube gère de toute façon presque toutes les fréquences d'images. Lors de la lecture de 10 images par seconde en entrée, le changement de la fréquence d'images de sortie à quelque chose de plus élevé (par exemple 30) ne fera que dupliquer les images, ce qui n'est pas nécessaire.

  • -s:v 1380x720est une résolution bizarre. Pensez à utiliser la résolution native 16: 9 720p 1280 × 720 et à recréer vos tracés si nécessaire. Cela vous évitera des problèmes et des problèmes de boîte aux lettres sur YouTube, et le respect de dimensions inhabituelles pourrait empêcher votre vidéo d'être affichée en pleine résolution ou offerte avec le paramètre de qualité 720p.

  • Utilisez le conteneur MP4 au lieu de MOV, que YouTube vous suggère d'utiliser. MP4 est pratiquement identique dans ses fonctionnalités à MOV, mais a un meilleur support dans les appareils de lecture. En général, préférez cela à MOV quand vous le pouvez.

slhck
la source
Je ne pense pas que les commentaires sur -qscaleaient un sens. Car libx264, c'est la même chose que le réglage -qp, n'est-ce pas? C'est une option qui s'applique à la compression x264, donc la source étant PNG n'est pas pertinente. Quoi qu'il en soit, -crfc'est un meilleur choix que -qpou -b:vpour un passage avec une qualité cible. (plutôt qu'un débit binaire cible).
Peter Cordes
1
vous devez également corriger l'effet des images en double. -framerate 10 -i input -r 30générera des doublons lors de la sortie vers mp4. (pas pour mkv, pour des raisons liées au ffmpeg supportant vfr dans mkv, je pense.) Si votre contenu est de 10 fps, faites juste une vidéo de sortie de 10 fps. Je pense que YouTube prend en charge la fréquence d'images que vous souhaitez (jusqu'à 60). Les caméras de téléphone portable enregistrent des vidéos h.264 à fréquence d'images variable en mp4 (surtout en basse lumière), donc si vous pouvez les télécharger directement sur YouTube, tout ira bien.
Peter Cordes
@PeterCordes Absolument. J'avais pris le -r 30commandement du PO sans le changer.
slhck
Avec une commande basée sur celle de cette réponse ( 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), malheureusement, je reçois toujours la mystérieuse erreur "la vidéo n'a pas pu être traitée". Je ne sais pas comment le déboguer, malheureusement.
Radon Rosborough