Das Trimmen auf Millisekunden in FFmpeg führt zu einer massiven Verlangsamung der Verarbeitungsgeschwindigkeit

Das Trimmen auf Millisekunden in FFmpeg führt zu einer massiven Verlangsamung der Verarbeitungsgeschwindigkeit

Ich bin neu hier und besuche zum ersten Mal ein Forum wie dieses. Also bitte ich aufrichtig um Entschuldigung, wenn ich nichts tauge! Vielen Dank im Voraus für Ihre Geduld. Auf meinem Laptop verwende ich Windows CMD.

Ich versuche, die ersten 7,3 Sekunden aus einem Tanzvideo zu kürzen (zu löschen), dessen Ton mit diesen Bewegungen synchronisiert ist. Hier ist die Codezeile, mit der ich angefangen habe:

ffmpeg -ss 7.3 -i myVideo.mp4 -c copy trimmed.mp4

Während diese Bearbeitung sofort erfolgt (großartig), wird die Millisekunde ignoriert und die resultierende Ausgabedatei wird ab 7 Sekunden statt 7,3 gekürzt. Also habe ich versucht, Folgendes zu ändern (indem ich die Reihenfolge der Eingaben geändert habe):

ffmpeg -i myVideo.mp4 -ss 7.3 -c copy trimmed.mp4

Auch hier war die Bearbeitung sofort (großartig) und mit der richtigen Detailgenauigkeit im Millisekundenbereich fertig, allerdings kam es zu einer Verzögerung bei meinem Audio (wodurch das bearbeitete Video unbrauchbar wurde). Ich verwende derzeit die generische Software „Movies & TV“, um das Video abzuspielen, werde diese Videos aber irgendwann auf Vimeo hochladen, von wo aus sie auf mehrere Geräte gestreamt werden.

Ich habe alles gesucht und nur eine Lösung gefunden:

ffmpeg -ss 7.3 -i myVideo.mp4 -c:v libx264 -c:a aac trimmed.mp4

Obwohl dies genau funktioniert, dauert die Verarbeitung einer 450 MB großen Datei leider etwa 45 Minuten. Ich muss etwa 800 ähnliche Videos bearbeiten (die alle genau dasselbe Intro haben, das herausgeschnitten werden muss) und frage mich, ob es eine Möglichkeit gibt, die Millisekundengenauigkeit zu erreichen, ohne die Verarbeitung massiv zu verlangsamen. Oder könnte ich dieses Problem vielleicht anderweitig durch einen schnelleren Computer lösen? Ich bin für alle Ideen offen, vielen Dank für Ihre Hilfe!

Hier ist die ungeschnittene Befehlszeilenausgabe von meinemzweiteBefehl:

ffmpeg -i myVideo.mp4 -ss 7.3 -c copy trimmed.mp4
ffmpeg version N-94576-g1965161ef6 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.1.1 (GCC) 20190807
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 33.100 / 56. 33.100
  libavcodec     58. 55.100 / 58. 55.100
  libavformat    58. 31.101 / 58. 31.101
  libavdevice    58.  9.100 / 58.  9.100
  libavfilter     7. 58.100 /  7. 58.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'myVideo.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    creation_time   : 2019-07-18T19:40:35.000000Z
  Duration: 00:03:37.25, start: 0.000000, bitrate: 20007 kb/s
    Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Audio
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 19864 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 60k tbc (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Video
Output #0, mp4, to 'trimmed.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    encoder         : Lavf58.31.101
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 19864 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 30k tbc (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Video
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Audio
Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 6271 fps=2425 q=-1.0 Lsize=  523124kB time=00:03:29.93 bitrate=20412.9kbits/s speed=81.2x
video:519589kB audio:3357kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.034075%

Antwort1

Wenn Sie ein Video mit Bitstream Copy () schneiden -c copy, können Sie nicht an beliebigen Zeitstempeln schneiden. Ein Video kann nur an Schlüsselbildern (Intra-Frames oder I-Frames) geschnitten werden, da diese Frames keine anderen Frames im Bitstream benötigen, um dekodiert zu werden.

Was ffmpeg tun wird, ist, dass es immer noch alle Frames einschließt, die für den Frame an dem von Ihnen angegebenen Punkt (7,2 s) erforderlich sind, um dekodierbar zu sein. Das bedeutet, dass Ihr geschnittenes Videokönnteenthält so viele Frames wie Ihr Original. ffmpeg weist diesen Frames jedoch einen negativen Zeitstempel zu, sodass sie nicht angezeigt werden sollten – allerdings beachten das nicht alle Player. Dies kann zu A/V-Synchronisierungsproblemen führen.

So oder so ist die einzige Methode, um hier volle Genauigkeit zu erreichen, das erneute Kodieren des Videos, wie Sie in Ihrem zweiten Befehl gezeigt haben. Die einzige Möglichkeit, dies zu beschleunigen, besteht darin, eine schnellere CPU zu verwenden, einen schnelleren GPU-Encoder zu verwenden (z. B. NVENC, wenn Sie eine unterstützte NVIDIA-GPU haben) oder dem Encoder zu erlauben, einige Funktionen zu deaktivieren, wodurch die Ausgabedatei etwas größer wird (die Kodierung wird weniger effizient). Siehe dieH.264-Kodierungshandbuchfür weitere Informationen. Beispiel:

ffmpeg -ss 7.3 -i myVideo.mp4 -c:v libx264 -preset faster -c:a aac trimmed.mp4

Der -presetWert kann auf andere Voreinstellungen eingestellt werden, je nachdem, wie viel Geduld Sie beim Kodieren haben.

verwandte Informationen