VidCutter

Mit VidCutter kann man Teile von Videos abspeichern, ohne diese Teile erneut codieren zu müssen. Dafür wird im Hintergrund eine Funktion von ffmpeg verwendet, die man auch manuell direkt nutzen könnte. Jedoch geht die Arbeit mit VidCutter sehr viel einfacher als per CLI.

hinweis

Mittlerweile nutze ich nur noch MPV mit einem schönen Plugin zum Herausschneiden von Videosequenzen, denn das kann ich schon beim ersten Anschauen der Videos machen und muss nicht ein weiteres Programm starten.

Wie das genau geht, steht hier.

Das Programm gibt es für Windows, Linux und Mac OS.

Wenn man es doch per CLI direkt mit ffmpeg machen möchte, dann funktioniert das so:

ffmpeg -i eingabevideo.mp4 -vcodec copy -acodec copy -ss 00:03:45 -t 00:04:45.000 ausgabevideo.mp4

In diesem Beispiel startet ausgabevideo.mp4 bei 03:45 von eingabevideo.mp4 und dauert 60 Sekunden.

Es ruckelt und wird nur halb so schnell abgespielt

Auf meinem System ruckelt es bei der Wiedergabe und das Video wird mit der halben Geschwindigkeit abgespielt. Vermutlich hängt das damit zusammen, dass die Kamera bei mir mit 120 fps aufnimmt?

Wenn man in den Einstellungen des Programms das Hardwaredecoding deaktiviert, dann funktioniert es richtig.

“Zero length file”

Das Problem

Bei Nutzung von Videos einer DJI Osmo Action Videokamera gibt es einen Fehler im Programm. Es wird angezeigt, dass die zu speichernde Datei gespeichert wurde, jedoch wird diese gar nicht erst erzeugt. Die Meldung im Log lautet cut resulted in zero length file, trying again without all stream mapping.

Stellt man das Logging in VidCutter auf verbose ein, dann wird die auszuführende Kommandozeile angezeigt; so sieht man, mit welchen Parametern ffmpeg aufgerufen wird:

/usr/bin/ffmpeg -hide_banner -v error -ss 00:00:00.583 -t 00:00:01.619 -i "eingabevideo.mp4" -c copy -map 0:0 -map 0:1 -map 0:2 -avoid_negative_ts 1 -y "ausgabevideo.mp4"

Führt man den Befehl so in der Shell aus, dann kommt der Fehler:

Could not find tag for codec none in stream #2, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

Die Lösung

Warnung: Ich habe absoult maximal keinerlei Ahnung was genau diese Funktion macht; es funktioniert für die Videos meiner beiden Kameras und ich habe noch keine Fehler bemerkt. Wenn ich jedoch die Manpage von ffmpeg richtig verstehe, dann wird das Mapping-Zeugs automatisch gemacht, wenn man es nicht als Parameter angibt:

Each input or output url can, in principle, contain any number of streams of different types (video/audio/subtitle/attachment/data). The allowed number and/or types of streams may be limited by the container format. Selecting which streams from which inputs will go into which output is either done automatically or with the "-map" option (see the Stream selection chapter).

ffmpeg provides the "-map" option for manual control of stream selection in each output file. Users can skip "-map" and let ffmpeg perform automatic stream selection as described below.

Das habe ich dann direkt mit ffmpeg ausprobiert und verschiedene Parameter weggelassen, bis es funktionierte. Schuld waren die drei -map-Argumente. Im Python-Code habe ich dann nach der Stelle gesucht, wo die, den Fehler verursachenden, Parameter gesetzt werden.

Das passiert in der Datei libs/videoservice.py bzw. in /usr/lib/python3.8/site-packages/vidcutter/libs/videoservice.py. Dort fügt man in Zeile 276 nach ‘‘output = ’’ eine neue Zeile ein und schreibt in diese return output.

Die Funktion parseMapping sieht danach so aus:

271     def parseMappings(self, allstreams: bool = True) -> str:
272         if not len(self.mappings) or (self.parent is not None and self.parent.hasExternals()):
273             return '-map 0 ' if allstreams else ''
274         # if False not in self.mappings:
275         #     return '-map 0 '
276         output = ''
277 
278         return output
279 
280         for stream_id in range(len(self.mappings)):
281             if self.mappings[stream_id]:
282                 output += '-map 0:{} '.format(stream_id)
283         return output
Zuletzt geändert: 2023-10-29 12:45:49 +0100 CET: relref statt ref