Używając ffmpeg do podzielenia mkv, ale straciłeś kilka sekund wideo (przecinanie klatek kluczowych bez ponownego kodowania?)

5

Używam ffmpeg (prawdziwy z FFmpeg, a nie fałszywy z Libav) do dzielenia niektórych plików mkv:

ffmpeg -i input.mkv -ss 00:01:00 -to 00:02:00 -codec copy output.mkv

Kiedy jednak otwieram output.mkv za pomocą VLC, pierwsze kilka sekund nie ma wideo, a tylko dźwięk. A sekundy później widzę zarówno wideo, jak i audio. Interesujące jest to, że kiedy próbuję różnych znaczników czasu po parametrze -ss, czas trwania części „tylko audio” waha się od 1 sekundy do 4 sekund lub nawet dłużej.

Staram się korzystać mkvmergez --split "timecodes:00:01:00,00:02:00", a plik wyjściowy działa poprawnie, bez „Tylko dźwięk” części na początku.

Próbowałem innego kontenera mkv z innym kodowaniem wideo / audio, ale wyniki są takie same.

Myślę, że brakuje mi niektórych opcji w ffmpeg. Co powinienem dodać do wiersza polecenia ffmpeg, aby uniknąć kilku sekund części „tylko dźwięk”?

Aktualizacja 1

Oto pełne dane wyjściowe:

$ ffmpeg -i 21.mkv -ss 00:00:58 -to 00:02:00 -kodek kopiuj clip.mkv
ffmpeg wersja 2.2.2 Copyright (c) 2000-2014 deweloperzy FFmpeg
  zbudowany 7 maja 2014 13:08:45 z gcc 4.8.2 (GCC) 20140206 (wersja wstępna)
  konfiguracja: --prefix = / usr --disable-debug --disable-static --enable-avresample --enable-dxva2 --enable-fontconfig --enable-gnutls --enable-gpl --enable-libass - enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse - enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid - enable-pic --enable-postproc --enable-runtime-cpudetect --enable-shared --enable-swresample --enable-vdpau --enable-version3 --enable-x11grab
  libavutil 52. 66.100 / 52. 66.100
  libavcodec 55. 52.102 / 55. 52.102
  libavformat 55. 33.100 / 55. 33.100
  libavdevice 55. 10.100 / 55. 10.100
  libavfilter 4. 2.100 / 4. 2.100
  libavresample 1. 2. 0 / 1. 2. 0
  libswscale 2. 5.102 / 2. 5.102
  libswresample 0. 18.100 / 0. 18.100
  libpostproc 52. 3.100 / 52. 3.100
Wpisz nr 0, matroska, webm, z '21 .mkv ':
  Metadane:
    koder: libebml v1.3.0 + libmatroska v1.4.0
    Creation_time: 2014-05-07 01:47:41
  Czas trwania: 00: 42: 50,78, start: 0,000000, szybkość transmisji: 2833 kb / s
    Strumień # 0: 0 (eng): Wideo: h264 (High), yuv420p (tv, bt709), 1280x720, SAR 1: 1 DAR 16: 9, 23,98 fps, 23,98 tbr, 1k tbn, 47,95 tbc (domyślnie)
    Strumień # 0: 1: Audio: ac3, 48000 Hz, 5.1 (z boku), fltp, 384 kb / s (domyślnie)
Wyjście # 0, matroska, do 'clip.mkv':
  Metadane:
    enkoder: Lavf55.33.100
    Strumień # 0: 0 (eng): Wideo: h264 (H264 / 0x34363248), yuv420p, 1280x720 [SAR 1: 1 DAR 16: 9], q = 2-31, 23,98 fps, 1k tbn, 1k tbc (domyślnie)
    Strumień # 0: 1: Audio: ac3 ([0] [0] [0] / 0x2000), 48000 Hz, 5.1 (z boku), 384 kb / s (domyślnie)
Mapowanie strumienia:
  Strumień # 0: 0 -> # 0: 0 (kopia)
  Strumień # 0: 1 -> # 0: 1 (kopia)
Naciśnij [q], aby zatrzymać, [?], Aby uzyskać pomoc
ramka = 1414 fps = 0,0 q = -1,0 Lsize = 18275kB czas = 00: 01: 02.00 bitrate = 2414.6kbits / s    
wideo: 15344kB audio: 2906kB podtytuł: 0 danych: 0 globalnych nagłówków: 0kB narzutu na multipleksowanie 0.134916%

Aktualizacja 2

Może być coś wspólnego z „klatkami kluczowymi”, a zezwolenie ffmpeg na ponowne kodowanie strumienia wideo nie doprowadzi do kilku sekund pustego wideo. Ponieważ jednak mkvmerge może wyciąć ten sam plik między klatkami kluczowymi bez ponownego kodowania, zastanawiam się, czy istnieje sposób, aby ffmpeg działał tak samo. Na przykład nieco „ponownie zdefiniuj” klatkę kluczową i tak dalej.

Zhuoyun Wei
źródło
Podaj pełne ffmpegdane wyjściowe konsoli.
llogan
@ LordNeckbeard Dodano.
Zhuoyun Wei,
Kiedy kopiujesz strumienie, ffmpeg może kopiować tylko w klatkach kluczowych, co oznacza, że ​​nie zawsze (lub w większości przypadków) otrzymamy cięcie dokładnie w żądanym znaczniku czasu. Czy ustawienie -async 1jako opcja działa?
slhck
@slhck Tak, wygląda na to, że jest coś wspólnego z klatkami kluczowymi. Próbowałem „-async 1”, ale wyniki są takie same. Czy fakt, że ffmpeg może kopiować tylko w klatkach kluczowych, oznacza, że ​​nie może wyciąć mkv tak dokładnie, jak robią to mkvmerge?
Zhuoyun Wei
mkvmerge może również dzielić wideo na klatki kluczowe.
Calmarius

Odpowiedzi:

0

Aby przełączać się między klatkami kluczowymi (lub GOP, jak się je nazywa), musisz ponownie zakodować wideo. (to samo dotyczy dźwięku, ale tam „klatki” są znacznie mniejsze, zwykle 1024 próbki).

W twoim przypadku możesz zmienić, -codec copyaby -acodec copy -vcodec webmffmpeg ponownie zakodował strumień. To oczywiście potrwa dłużej i stracisz jakość (jeśli zrobisz to dobrze, utrata nie będzie zauważalna, ale będzie trochę).

Niobos
źródło
Dzięki. Wiem, że ponowne kodowanie rozwiąże ten problem. Ale ponieważ mkvmerge może dokładnie podzielić ten sam film bez ponownego kodowania, zastanawiam się, czy istnieje sposób, aby ffmpeg działał tak samo.
Zhuoyun Wei