Wie kann ich eine Reihe von PNG-Bildern in ein Video für YouTube konvertieren?

13

Ich habe eine Folge von PNGs ( hier ist ein Exemplar ), die ich mit ffmpeg in ein Video verwandle:

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

Mit VLC sieht alles schön und gut aus, aber auf Youtube sehe ich nur Grau!? Warum?

Geben Sie hier die Bildbeschreibung ein

Nach einer Weile wird ein horizontaler Balken mit bunten Flecken angezeigt:

Geben Sie hier die Bildbeschreibung ein

Wenn ich dem Befehl '-pix_fmt yuv420p' hinzufüge, zeigt youtube den Clip korrekt an. Aber dann ist die höchste Qualität, die ich wählen kann, 480p, was für diesen Zweck zu niedrig ist.

ffmpeg Ausgabe

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

Ich habe die Informationen auf meiner Website gesammelt: http://www.joyofdata.de/blog/hd-clips-with-ffmpeg-for-youtube-and-vimeo/

Raffael
quelle
Bitte geben Sie die vollständige, ungeschnittene Konsolenausgabe für die FFmpeg-Befehle an. Pixelformate hängen nicht mit den Abmessungen zusammen, daher sollten Sie auf YouTube immer eine Auflösung von mehr als 480p auswählen können, wenn Ihre Quelle 720p und höher ist.
Slhck
Die Ausgabe des Befehls ffmpeg wurde hinzugefügt. Der mit VLC angesehene Clip zeigt immer noch die alte größere Auflösung. Aber YouTube bietet mir nur 480p.
Raffael

Antworten:

34

YouTube erwartet, dass dein Video H.264-codiert ist . Wenn Sie verwenden libx264, halten Sie sich an die Codierungsvorschläge von 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

Tipps:

  • -qscaleist ein Weg, um Qualität zu setzen, aber -qscaleallein ist nicht eindeutig. Verwendung -qscale:vfür Video- und -qscale:aAudio-Encoder, die dies unterstützen. Verwenden Sie diese Option nur, wenn Sie wissen, was sie bedeutet.

    x264 bietet eine bessere Option zum Einstellen der Qualität : -crf. Der Konstantratenfaktor ist ein Codierungsmodus mit konstanter Qualität. Niedrigere Werte bedeuten eine bessere Qualität, aber alles unter 18 ist möglicherweise optisch nicht besser. Der Standardwert ist 23, aber ungefähr 20 wäre besser, da YouTube dein Video erneut neu codiert.

  • -pix_fmt yuv420psollte verwendet werden, um das 4: 2: 0-Downsampling für den PNG-Eingang zu aktivieren, der normalerweise überhaupt nicht heruntergesampelt wird (4: 4: 4, wie in Ihrem Ausgang beobachtet) und häufig einen Alpha-Kanal enthält. YouTube wird damit nicht richtig umgehen.

  • -rwird zum Einstellen der Ausgabe-Framerate nicht benötigt, da YouTube ohnehin fast alle Bildraten verarbeitet. Wenn Sie 10 Bilder pro Sekunde als Eingabe lesen und die Ausgabebildrate auf etwas Höheres (z. B. 30) ändern, werden nur Bilder dupliziert, was nicht erforderlich ist.

  • -s:v 1380x720ist eine seltsame Auflösung. Denken Sie daran, die native 16: 9 720p-Auflösung 1280 × 720 zu verwenden und Ihre Diagramme bei Bedarf neu zu generieren. Dies erspart Ihnen einige Probleme und Probleme mit dem Letterboxing auf YouTube. Wenn Sie sich an ungewöhnliche Abmessungen halten, wird Ihr Video möglicherweise nicht in voller Auflösung angezeigt oder in der 720p-Qualitätseinstellung angeboten.

  • Verwenden Sie den MP4-Container anstelle von MOV, den YouTube Ihnen empfiehlt. MP4 ist in der Funktionalität praktisch identisch mit MOV, bietet jedoch eine bessere Unterstützung für Wiedergabegeräte. Ziehen Sie dies im Allgemeinen MOV vor, wenn Sie können.

slhck
quelle
Ich halte die Kommentare zu nicht -qscalefür sinnvoll. Denn libx264es ist dasselbe wie das Einstellen -qp, nicht wahr? Diese Option gilt für die x264-Komprimierung, sodass die Quelle PNG keine Rolle spielt. Unabhängig davon -crfist eine bessere Wahl als -qpoder -b:vfür einen Durchgang mit einer Zielqualität. (anstatt einer Zielbitrate).
Peter Cordes
1
Sie sollten auch den Effekt für doppelte Frames korrigieren. -framerate 10 -i input -r 30generiert Duplikate bei der Ausgabe auf mp4. (Nicht für mkv, aus Gründen, die sich auf ffmpeg beziehen, das vfr in mkv unterstützt, denke ich.) Wenn Ihr Inhalt 10 fps beträgt, erstellen Sie einfach ein 10 fps-Ausgabevideo. Ich denke, YouTube unterstützt jede gewünschte Framerate (bis zu 60). Handykameras zeichnen h.264-Videos mit variabler Bildrate in mp4 auf (insbesondere bei schlechten Lichtverhältnissen). Wenn Sie diese also direkt auf YouTube hochladen können, ist alles in Ordnung.
Peter Cordes
@ PeterCordes Auf jeden Fall. Ich hatte -r 30den Befehl des OP übernommen, ohne ihn zu ändern.
Slhck
Mit einem Befehl, der auf dem in dieser Antwort ( 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) basierenden Befehl basiert , erhalte ich leider immer noch den mysteriösen Fehler "Video konnte nicht verarbeitet werden". Ich bin mir leider nicht sicher, wie ich es debuggen soll.
Radon Rosborough