Jak przekonwertować serię obrazów PNG na wideo na YouTube?

13

Mam sekwencję plików PNG ( tutaj jest jedna próbka ), które zamieniam w wideo z ffmpeg:

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

Dzięki VLC wszystko wygląda ładnie i elegancko, ale na youtube wszystko, co widzę, jest szare !? dlaczego?

wprowadź opis zdjęcia tutaj

Po chwili wyświetla się poziomy pasek z kolorowymi plamami:

wprowadź opis zdjęcia tutaj

Kiedy dodam do polecenia „-pix_fmt yuv420p”, youtube poprawnie pokazuje klip. Ale wtedy najwyższą jakością, jaką mogę wybrać, jest 480p, co jest zbyt niskie w tym celu.

wyjście 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

Zebrałem informacje na mojej stronie internetowej: http://www.joyofdata.de/blog/hd-clips-with-ffmpeg-for-youtube-and-vimeo/

Raffael
źródło
Podaj pełne, nieocięte dane wyjściowe konsoli dla komend FFmpeg. Formaty pikseli nie są powiązane z wymiarami, więc zawsze powinieneś być w stanie wybrać rozdzielczość większą niż 480p w YouTube, jeśli źródłem jest 720p i więcej.
slhck
dodano dane wyjściowe polecenia ffmpeg. Klip oglądany za pomocą VLC nadal pokazuje starszą większą rozdzielczość. Ale youtube oferuje mi tylko 480p.
Raffael

Odpowiedzi:

34

YouTube oczekuje, że Twój film będzie kodowany w standardzie H.264 . Jeśli używasz libx264, trzymaj się sugestii kodowania 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

Wskazówki:

  • -qscalejest sposobem na ustalenie jakości, ale -qscalesam jest dwuznaczny. Użyj -qscale:vdo wideo i -qscale:akoderów audio, które go obsługują. Nie używaj tej opcji, chyba że wiesz, co to znaczy.

    x264 ma lepszą opcję jakości Otoczenie: -crf. Współczynnik stałej szybkości to tryb kodowania o stałej jakości. Niższe wartości oznaczają lepszą jakość, ale wszystko poniżej 18 może nie być wizualnie lepsze. Domyślnie jest to 23, ale coś takiego jak 20 byłoby lepsze, ponieważ YouTube ponownie koduje wideo ponownie.

  • -pix_fmt yuv420pnależy użyć, aby włączyć próbkowanie w dół 4: 2: 0 dla wejścia PNG, które zwykle nie jest w ogóle próbkowane w dół (4: 4: 4, jak zaobserwowano na wydruku) i często zawiera kanał alfa. YouTube nie poradzi sobie z tym poprawnie.

  • -rnie jest potrzebne do ustawienia wyjściowej liczby klatek na sekundę, ponieważ YouTube i tak poradzi sobie z prawie wszystkimi częstotliwościami klatek. Podczas odczytu 10 obrazów na sekundę jako danych wejściowych, zmiana wyjściowej częstotliwości klatek na coś wyższego (np. 30) spowoduje jedynie powielenie klatek, co nie jest konieczne.

  • -s:v 1380x720to dziwne rozwiązanie. Pomyśl o użyciu natywnej rozdzielczości 720p 720p 1280 × 720 i ponownym generowaniu wykresów, jeśli to konieczne. Pozwoli ci to zaoszczędzić trochę problemów i problemów ze skrzynkami na litery w YouTube, a trzymanie się nietypowych wymiarów może uniemożliwić wyświetlanie filmu w pełnej rozdzielczości lub oferowanie go przy ustawieniu jakości 720p.

  • Użyj kontenera MP4 zamiast MOV, którego sugeruje YouTube. MP4 ma praktycznie identyczną funkcjonalność jak MOV, ale ma lepszą obsługę urządzeń odtwarzających. Ogólnie rzecz biorąc, lepiej niż MOV, kiedy możesz.

slhck
źródło
Nie sądzę, żeby komentarze na temat -qscalemiały sens. Bo libx264to jest to samo co ustawienie -qp, prawda? Jest to opcja, która dotyczy kompresji x264, więc źródło PNG nie ma znaczenia. Niezależnie od tego, -crfjest lepszym wyborem niż -qplub -b:vna jeden przejazd z docelową jakością. (zamiast docelowej szybkości transmisji).
Peter Cordes,
1
powinieneś także naprawić efekt zduplikowanych ramek. -framerate 10 -i input -r 30wygeneruje duplikaty podczas wysyłania do MP4. (nie dla mkv, z powodów związanych z ffmpeg obsługującym vfr w mkv, myślę.) Jeśli twoja zawartość to 10 fps, po prostu zrób wideo wyjściowe 10 fps. Myślę, że youtube obsługuje dowolną liczbę klatek na sekundę (do 60). Aparaty do telefonów komórkowych nagrywają w formacie mp4 wideo o zmiennej liczbie klatek na sekundę w formacie h.264 (szczególnie przy słabym świetle), więc jeśli możesz przesłać je bezpośrednio na youtube, nic ci nie będzie.
Peter Cordes
@PeterCordes Absolutnie. Wziąłem -r 30komendę OP bez zmiany.
slhck 15.01.2015
Z poleceniem opartym na tym w tej odpowiedzi ( 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) niestety nadal pojawia się tajemniczy błąd „przetwarzanie wideo nie powiodło się”. Niestety nie wiem, jak to debugować.
Radon Rosborough,