Problemy z liczbą klatek na sekundę podczas konwersji wideo za pomocą ffmpeg z libx264

7

Mam problemy z transkodowaniem niektórych filmów. Uruchomiłem najprostszą komendę ffmpeg i zajmuje to bardzo dużo czasu, a plik wyjściowy jest około 10 razy większy. Jeśli podam parametr szybkości klatek -r, działa to dobrze (mały plik, szybkie transkodowanie). Na czym polega problem i jak mogę go rozwiązać? Nie chcę ustawiać stałej liczby klatek, ponieważ myślę, że lepiej pozostawić to samo co źródło, prawda?

Być może problemem jest coś innego, ponieważ znalazłem wiele przykładów w Internecie, w których nie użyto opcji -r. Także transkodowanie do innego formatu lub z innego źródła działa dobrze bez opcji -r (próbowałem z ffmpeg 0.7.13 i 1.2.1 na Mac OS (dostarczany przez porty Mac) i 0.7.15 na serwerze Linux Debian). Filmy są dostarczane przez użytkowników mojej witryny i automatycznie konwertowane na odpowiednie dla sieci. Potrzebuję więc najbardziej ogólnego polecenia do automatycznej konwersji.

W poniższym wyjściu ffmpeg znajdziesz te dwie podejrzane wiadomości:

  • Bardzo wysoka częstotliwość klatek dla multipleksera, który nie obsługuje go skutecznie. Proszę rozważyć podanie niższej liczby klatek na sekundę, innego multipleksera lub -vsync 2
  • Szybkość MB (36000000)> limit poziomu (983040)

Komenda i wyjście ffmpeg (bez opcji -r):

    ffmpeg -i '/tmp/standort_aquarium.mp4' -vcodec libx264 output.mp4
    ffmpeg wersja 0.7.15, Copyright (c) 2000-2013 programiści FFmpeg zbudowali 22 lutego 2013 07:18:58 z konfiguracją gcc 4.4.5: --enable-libdc1394 --prefix = / usr --extra-cflags = '-Wall -g' --cc = 'ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid - -enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree - disable-stripping --enable-avfilter --enable-libdirac --disable-decoder = libdirac --enable-libfreetype --enable-libschroedinger --disable-encoder = libschroedinger --enable-version3 --enable-libopenjpeg --enable -libvpx --enable-librtmp --extra-libs = -lgcrypt --disable-altivec --disable-armv5te --disable-armv6 --disable-vis
      libavutil 50. 43. 0 / 50. 43. 0
      libavcodec 52.123. 0 / 52,123 0
      libavformat 52.111. 0 / 52,111. 0
      libavdevice 52. 5. 0 / 52. 5. 0
      libavfilter 1. 80. 0 / 1. 80. 0
      libswscale 0. 14. 1 / 0. 14. 1
      libpostproc 51. 2. 0 / 51. 2. 0
    Wprowadź nr 0, mov, mp4, m4a, 3gp, 3g2, mj2, z '/tmp/standort_aquarium.mp4':
      Metadane:
        major_brand: mp42
        minor_version: 0
        Kompatybilne_brands: mp423gp4isom
        Creation_time: 19.04.2013 15:04:05
      Czas trwania: 00: 00: 18,24, początek: 0,000000, szybkość transmisji: 2095 kb / s
        Strumień # 0.0 (und): Wideo: mpeg4, yuv420p, 640x480 [PAR 1: 1 DAR 4: 3], 2001 kb / s, 14,97 fps, 30k tbr, 30k tbn, 30k tbc
        Metadane:
          Creation_time: 19.04.2013 15:04:05
        Strumień # 0,1 (und): Audio: aac, 48000 Hz, mono, s16, 96 kb / s
        Metadane:
          Creation_time: 19.04.2013 15:04:05
    Plik „output.mp4” już istnieje. Zastąpić? [t / n] r
    [mp4 @ 0x20eed80] Bardzo wysoka częstotliwość klatek dla multipleksera, który nie obsługuje go skutecznie.
    Proszę rozważyć podanie niższej liczby klatek na sekundę, innego multipleksera lub -vsync 2
    [bufor @ 0x20f8820] w: 640 h: 480 pixfmt: yuv420p tb: 1/1000000 sar: 1/1 sws_param:
    [libx264 @ 0x20efde0] Wykryto ustawienia domyślne przy użyciu profilu średniego
    [libx264 @ 0x20efde0] przy użyciu SAR = 1/1
    [libx264 @ 0x20efde0] Szybkość MB (36000000)> limit poziomu (983040)
    [libx264 @ 0x20efde0] z wykorzystaniem możliwości procesora: MMX2 SSE2 Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x20efde0] profil Wysoki, poziom 5.1
    [libx264 @ 0x20efde0] 264 - rdzeń 118 - kodek AVC H.264 / MPEG-4 AVC - Copyleft 2003-2011 - http://www.videolan.org/x264.html - opcje: cabac = 1 ref = 3 deblock = 1 : 0: 0 zanalizuj = 0x3: 0x113 me = hex subme = 7 psy = 1 psy_rd = 1,00: 0,00 mixed_ref = 1 me_range = 16 chroma_me = 1 krata = 1 8x8dct = 1 cqm = 0 deadzone = 21,11 fast_pskip = 1 chroma_qp_offset = -2 wątki = 1 wątki pocięte na plastry = 0 nr = 0 dziesiętne = 1 z przeplotem = 0 bluray_compat = 0 constrained_intra = 0 ramek = 3 b_piramid = 2 b_adapt = 1 b_bias = 0 bezpośrednio = 1 wagab = 1 open_gop = 0 waga = 2 keyint = 250 keyint_min = 25 scenecut = 40 intra_refresh = 0 rc_lookahead = 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
    Wyjście # 0, mp4, na 'output.mp4':
      Metadane:
        major_brand: mp42
        minor_version: 0
        Kompatybilne_brands: mp423gp4isom
        Creation_time: 19.04.2013 15:04:05
        enkoder: Lavf52.111.0
        Strumień # 0.0 (und): Wideo: libx264, yuv420p, 640x480 [PAR 1: 1 DAR 4: 3], q = 2-31, 200 kb / s, 30 kb / s, 30 kb
        Metadane:
          Creation_time: 19.04.2013 15:04:05
        Strumień # 0.1 (und): Audio: libfaac, 48000 Hz, mono, s16, 64 kb / s
        Metadane:
          Creation_time: 19.04.2013 15:04:05
    Mapowanie strumienia:
      Strumień # 0,0 -> 0,0
      Strumień # 0,1 -> # 0,1
    Naciśnij [q], aby zatrzymać, [?], Aby uzyskać pomoc
    ramka = 542630 fps = 132 q = 33,0 Lsize = 77226kB czas = 00: 00: 18,08 bitrate = 34976.2kbits / s dup = 542358 drop = 0
    wideo: 68604 kB audio: 143 kB globalnych nagłówków: obciążenie kumulacyjne 0 kB 12,333275%
    ramka I: 2174 Śr. QP: 18,72 rozmiar: 25040
    [libx264 @ 0x20efde0] ramka P: 136846 Śr. QP: 25,27 rozmiar: 56
    [libx264 @ 0x20efde0] ramka B: 403610 Śr. QP: 32,99 rozmiar: 20
    [libx264 @ 0x20efde0] kolejne ramki B: 0,8% 0,0% 0,1% 99,1%
    [libx264 @ 0x20efde0] MB I I16..4: 5,5% 83,3% 11,1%
    [libx264 @ 0x20efde0] MB P I16..4: 0,0% 0,0% 0,0% P16..4: 0,5% 0,0% 0,0% 0,0% 0,0% pominięcie: 99,4%
    [libx264 @ 0x20efde0] MB B I16..4: 0,0% 0,0% 0,0% B16..8: 0,0% 0,0% 0,0% bezpośredni: 0,0% pominąć: 100,0% L0: 21,2% L1: 78,8% BI: 0,0%
    [libx264 @ 0x20efde0] Transformacja 8x8 intra: 83,1% inter: 85,2%
    [libx264 @ 0x20efde0] zakodowane y, uvDC, uvAC intra: 91,2% 95,8% 80,7% inter: 0,0% 0,1% 0,0%
    [libx264 @ 0x20efde0] i16 v, h, dc, p: 13% 40% 12% 35%
    [libx264 @ 0x20efde0] i8 v, h, dc, ddl, ddr, vr, hd, vl, hu: 19% 34% 15% 4% 4% 5% 6% 7% 8%
    [libx264 @ 0x20efde0] i4 v, h, dc, ddl, ddr, vr, hd, vl, hu: 20% 38% 6% 4% 6% 6% 8% 6% 6%
    [libx264 @ 0x20efde0] i8c dc, h, v, p: 39% 32% 19% 10%
    [libx264 @ 0x20efde0] Ważone ramki typu P: Y: 0,0% UV: 0,0%
    [libx264 @ 0x20efde0] ref. P L0: 91,5% 5,2% 2,8% 0,4% 0,0%
    [libx264 @ 0x20efde0] ref B L0: 55,7% 43,5% 0,8%
    [libx264 @ 0x20efde0] ref B L1: 97,9% 2,1%
    [libx264 @ 0x20efde0] kb / s: 31071.04

Komenda i wyjście ffmpeg z opcją -r 24:

    ffmpeg -i '/tmp/standort_aquarium.mp4' -r 30000/1001 -vcodec libx264 output.mp4
    ffmpeg wersja 0.7.15, Copyright (c) 2000-2013 deweloperzy FFmpeg
      zbudowany 22 lutego 2013 07:18:58 z gcc 4.4.5
      konfiguracja: --enable-libdc1394 --prefix = / usr --extra-cflags = '- Wall -g' --cc = 'ccache cc' --enable-shared --enable-libmp3lame --enable-gpl - enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore -amrwb --enable-libx264 --enable-libspeex --enable-nonfree - disis-stripping --enable-avfilter --enable-libdirac --disable-decoder = libdirac --enable-libfreetype --enable-libschroedinger - -disable-encoder = libschroedinger --enable-version3 --enable-libopenjpeg --enable-libvpx --enable-librtmp --extra-libs = -lgcrypt --disable-altivec --disable-armv5te --disable-armv6 - -disable-vis
      libavutil 50. 43. 0 / 50. 43. 0
      libavcodec 52.123. 0 / 52,123 0
      libavformat 52.111. 0 / 52,111. 0
      libavdevice 52. 5. 0 / 52. 5. 0
      libavfilter 1. 80. 0 / 1. 80. 0
      libswscale 0. 14. 1 / 0. 14. 1
      libpostproc 51. 2. 0 / 51. 2. 0
    Wprowadź nr 0, mov, mp4, m4a, 3gp, 3g2, mj2, z '/tmp/standort_aquarium.mp4':
      Metadane:
        major_brand: mp42
        minor_version: 0
        Kompatybilne_brands: mp423gp4isom
        Creation_time: 19.04.2013 15:04:05
      Czas trwania: 00: 00: 18,24, początek: 0,000000, szybkość transmisji: 2095 kb / s
        Strumień # 0.0 (und): Wideo: mpeg4, yuv420p, 640x480 [PAR 1: 1 DAR 4: 3], 2001 kb / s, 14,97 fps, 30k tbr, 30k tbn, 30k tbc
        Metadane:
          Creation_time: 19.04.2013 15:04:05
        Strumień # 0,1 (und): Audio: aac, 48000 Hz, mono, s16, 96 kb / s
        Metadane:
          Creation_time: 19.04.2013 15:04:05
    Plik „output.mp4” już istnieje. Zastąpić? [t / n] r
    [bufor @ 0x132e820] w: 640 h: 480 pixfmt: yuv420p tb: 1/1000000 sar: 1/1 sws_param:
    [libx264 @ 0x1325de0] Wykryto ustawienia domyślne przy użyciu profilu średniego
    [libx264 @ 0x1325de0] przy użyciu SAR = 1/1
    [libx264 @ 0x1325de0] z wykorzystaniem możliwości procesora: MMX2 SSE2 Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x1325de0] profil Wysoki, poziom 3.0
    [libx264 @ 0x1325de0] 264 - rdzeń 118 - kodek AVC H.264 / MPEG-4 AVC - Copyleft 2003-2011 - http://www.videolan.org/x264.html - opcje: cabac = 1 ref = 3 deblock = 1 : 0: 0 zanalizuj = 0x3: 0x113 me = hex subme = 7 psy = 1 psy_rd = 1,00: 0,00 mixed_ref = 1 me_range = 16 chroma_me = 1 krata = 1 8x8dct = 1 cqm = 0 deadzone = 21,11 fast_pskip = 1 chroma_qp_offset = -2 wątki = 1 wątki pocięte na plastry = 0 nr = 0 dziesiętne = 1 z przeplotem = 0 bluray_compat = 0 constrained_intra = 0 ramek = 3 b_piramid = 2 b_adapt = 1 b_bias = 0 bezpośrednio = 1 wagab = 1 open_gop = 0 waga = 2 keyint = 250 keyint_min = 25 scenecut = 40 intra_refresh = 0 rc_lookahead = 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
    Wyjście # 0, mp4, na 'output.mp4':
      Metadane:
        major_brand: mp42
        minor_version: 0
        Kompatybilne_brands: mp423gp4isom
        Creation_time: 19.04.2013 15:04:05
        enkoder: Lavf52.111.0
        Strumień # 0.0 (und): Wideo: libx264, yuv420p, 640x480 [PAR 1: 1 DAR 4: 3], q = 2-31, 200 kb / s, 30 kb / s, 29,97 tbc
        Metadane:
          Creation_time: 19.04.2013 15:04:05
        Strumień # 0.1 (und): Audio: libfaac, 48000 Hz, mono, s16, 64 kb / s
        Metadane:
          Creation_time: 19.04.2013 15:04:05
    Mapowanie strumienia:
      Strumień # 0,0 -> 0,0
      Strumień # 0,1 -> # 0,1
    Naciśnij [q], aby zatrzymać, [?], Aby uzyskać pomoc
    ramka = 542 fps = 36 q = 29,0 Lsize = 2059kB czas = 00: 00: 18,01 bitrate = 936,3 kb / s dup = 270 drop = 0
    wideo: 1904kB audio: 143kB nagłówki globalne: obciążenie nadmiarowe 0kB 0,609224%
    ramka I: 3 Śr. QP: 22,39 rozmiar: 14773
    [libx264 @ 0x1325de0] ramka P: 514 Śr. QP: 23,98 rozmiar: 3675
    [libx264 @ 0x1325de0] ramka B: 25 Śr. QP: 27,44 rozmiar: 643
    [libx264 @ 0x1325de0] kolejne ramki B: 93,7% 0,0% 1,1% 5,2%
    [libx264 @ 0x1325de0] mb I I16..4: 16,4% 78,3% 5,3%
    [libx264 @ 0x1325de0] MB P I16..4: 1,6% 6,3% 0,3% P16..4: 30,8% 8,6% 3,1% 0,0% 0,0% pominięcie: 49,4%
    [libx264 @ 0x1325de0] MB B I16..4: 0,4% 0,7% 0,0% B16..8: 13,2% 1,6% 0,2% bezpośrednie: 0,3% pominięcie: 83,6% L0: 50,0% L1: 47,1% BI: 2,9%
    [libx264 @ 0x1325de0] Transformacja 8x8 intra: 77,1% inter: 83,1%
    [libx264 @ 0x1325de0] zakodowane y, uvDC, uvAC intra: 62,0% 76,4% 24,4% inter: 17,9% 26,3% 2,3%
    [libx264 @ 0x1325de0] i16 v, h, dc, p: 14% 60% 13% 13%
    [libx264 @ 0x1325de0] i8 v, h, dc, ddl, ddr, vr, hd, vl, hu: 15% 35% 33% 2% 3% 3% 3% 3% 4%
    [libx264 @ 0x1325de0] i4 v, h, dc, ddl, ddr, vr, hd, vl, hu: 15% 40% 12% 4% 7% 7% 7% 5% 4%
    [libx264 @ 0x1325de0] i8c dc, h, v, p: 46% 34% 16% 4%
    [libx264 @ 0x1325de0] Ważone ramki typu P: Y: 8,0% UV: 4,5%
    [libx264 @ 0x1325de0] ref. P L0: 65,6% 16,7% 8,8% 7,9% 0,9%
    [libx264 @ 0x1325de0] ref B L0: 85,9% 13,3% 0,8%
    [libx264 @ 0x1325de0] ref B L1: 88,7% 11,3%
    [libx264 @ 0x1325de0] kb / s: 862,28

Źródło wideo jest tymczasowo dostępne pod adresem : https://www.dropbox.com/s/4xg147z77u40g87/standort_aquarium.mp4

LarS
źródło
To może być błąd, ale nie przeszukiwałem narzędzia do śledzenia błędów FFmpeg dla żadnych istniejących powiązanych raportów.
llogan
Jeśli to błąd, oznacza to, że tak się stanie z wyświetlaniem filmów i mogę zignorować ten problem?
LarS
Może jest to związane z tym biletem: ffmpeg.org/trac/ffmpeg/ticket/187 - Ponownie otworzyłem bilet w kolejce problemów z ffmpeg, podając powyższe informacje.
LarS
Cóż, ten bilet jest przyczyną, dla której mp4 domyślnie się nie -vsync 2stosuje. To właśnie spowodowało ogromne duplikowanie klatek, które widziałeś (a nie oryginalny błąd, który doprowadził do tego obejścia). -vsync 2Wydaje mi się jednak, że mxing do mp4 działa z obecnym git ffmpeg.
Peter Cordes

Odpowiedzi:

4

Problem polega na tym, że ffmpeg wybiera wartość domyślną dla -vsyncna podstawie wyjściowego multipleksera. Domyślnie multiplekser mp4 to vsync 1, ale wybiera bardzo wysoką szybkość klatek, dzięki czemu może umieścić ramkę we właściwym czasie dla każdej ramki wejściowej.

(Czas wyświetlania klatek wejściowych nie jest stały. Średnio wynosi 14,97 fps, według ffmpeg. Prawdopodobnie z aparatu telefonicznego? Robią zmienne FPS. Myślę, że zwalniają, aby uzyskać więcej światła dla każdej klatki, ale może to być inny powód. )

Więc ffmpeg powieli klatki do 30k fps, które wybrał, czy coś takiego. h.264 jest dość wydajny w przechowywaniu zduplikowanych ramek, ale to śmieszne.

W każdym razie rozwiązaniem jest użycie -vsync 2w wierszu polecenia ffmpeg. Lub wyjście do mkv, a następnie remux do mp4, ale powodem jest to, że domyślnie mkv -vsync 2. To naprawdę takie proste. Nie musisz tworzyć wyjściowego CFR. Youtube radzi sobie z dowolną <= 60liczbą klatek na sekundę, o ile są one dostępne , podobnie jak większość innych graczy. Zakładam, że telefony są w porządku, ponieważ przede wszystkim tworzą zmienne filmy FPS. Nie musisz używać -r somethingdo wymuszenia powielania klatek, aby uzyskać dokładnie 30 klatek na sekundę lub cokolwiek innego.

Peter Cordes
źródło
Mam ten sam problem i dodanie vsync 2 naprawiło to. Czy możesz wyjaśnić, czego szukać w metadanych pliku, aby wiedzieć, jak korzystać z opcji vsync 2? Dzięki.
Shaun Bowe
3
@ShaunBowe: Mam nadzieję, że korzystanie z niego jest zawsze bezpieczne -vsync 2, chociaż nie jest to ustawienie domyślne dla multipleksera MP4 ffmpeg. Ale powinieneś szukać zmiennej ilości klatek na sekundę, np mediainfo. Przy użyciu . Jeśli ma minimalną / maksymalną liczbę klatek na sekundę, które nie są równe, jest to VFR. Być może będziesz w stanie powiedzieć coś bardziej szczegółowego na temat danych wejściowych MP4 w odniesieniu do podstawy czasu i tak dalej, ale nie znam się na tym, w jaki sposób MP4 reprezentuje znaczniki czasu.
Peter Cordes
0

Nie mogłem zobaczyć żadnego problemu z twoim wideo, używając następującego polecenia w wersji ffmpeg 1.1.2:

ffmpeg -i standort_aquarium.mp4 -r 30000/1001 -vcodec libx264 output.mp4

Rozmiar pliku wynikowego jest zgodny z oczekiwaniami (około połowy rozmiaru), wideo odtwarzało się poprawnie, a konwersja szybkości klatek wydaje się działać dobrze (więc nie jest to błąd).

Jedyny problem, jaki widzę w twoich wynikach, to brak mapowania pary (z nieznanego powodu). Na twoim wyjściu:

Stream mapping:

  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1

Gdzie powinno być napisane:

Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 -> libx264)
  Stream #0:1 -> #0:1 (aac -> libfaac)

Zakładam, że masz problem ze swoim plikiem binarnym / wersją ffmpeg (również wersja 1.2.1 nigdy nie została wydana). Spróbuj ponownie pobrać lub ponownie skompilować z wersją 1.1.2

NA PRZYKŁAD
źródło
Polecenie, o którym mowa, to polecenie bez opcji -r: ffmpeg -i '/tmp/standort_aquarium.mp4' -vcodec libx264 output.mp4
LarS
czy możesz przetestować ponownie bez -r 30000/1001? Jakiej wersji ffmpeg używasz? Używam wersji 1.2.1 i 0.7.13 na Macu dostarczanych przez porty Mac i 0.7.15 na serwerze Linux Debian.
LarS