Warum verhält sich die Option -to manchmal anders?

366
Houseman

Zwei verschiedene Videos bereiten mir Probleme, wenn sie zu einem bestimmten Zeitpunkt mit Code beschnitten werden, da derselbe Code die Videos nicht auf dieselbe Weise abschneidet, wenn sie mit demselben ffmpegBefehl verarbeitet werden

Wenn ich mit dem ersten Video eine -tovon 10 spezifiziere, wird es bei einem Bild zuvor geschnitten.

Mit dem zweiten Video, wenn ich einen angeben -to10, wird es geschnitten auf diesem Rahmen.

Wenn man hier einen Kommentar liest, sagt eine Person, dass "Suchen nicht immer auf dts ausgeführt wird, es hängt tatsächlich vom Container ab. Wenn die Containerzeitstempel pts sind, ist das Suchen in pts; wenn Containerzeitstempel dts sind, ist das Suchen in dts."

Was kann ich tun, um vorher zu bestimmen, wie meine Schnitte funktionieren werden?

Im Idealfall möchte ich die Informationen in der Ausgabe eines ffprobeBefehls finden und meine Logik entsprechend anpassen

Video 1

ffprobe -hide_banner steamedHams.mp4 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'steamedHams.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2018-02-17T02:19:35.000000Z Duration: 00:02:43.10, start: 0.000000, bitrate: 190 kb/s Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 116 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 72 kb/s (default) Metadata: creation_time : 2018-02-17T02:19:35.000000Z handler_name : IsoMedia File Produced by Google, 5-11-2011 

Video 2

ffprobe -hide_banner trailer.mp4 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'trailer.mp4': Metadata: major_brand : mp42 minor_version : 512 compatible_brands: isomiso2avc1mp41 creation_time : 2018-03-14T22:10:26.000000Z encoder : HandBrake 1.0.7 2017040900 Duration: 00:00:33.02, start: 0.000000, bitrate: 2778 kb/s Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/bt709), 1920x1080 [SAR 1:1 DAR 16:9], 2653 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc (default) Metadata: creation_time : 2018-03-14T22:10:26.000000Z handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 159 kb/s (default) Metadata: creation_time : 2018-03-14T22:10:26.000000Z handler_name : Stereo 
0

1 Antwort auf die Frage

1
slhck

Sicher, Sie können mit ffprobe die Frames und Pakete prüfen:

ffprobe -select_streams v -show_packets \ -show_entries packet=pts_time,dts_time -of compact=p=0 input.mp4 

Dies zeigt PTS und DTS jedes Pakets.

Der folgende Beitrag kann Ihnen helfen , den nächstgelegenen Keyframe vor einem bestimmten Zeitstempel zu identifizieren .

Mir ist bekannt, wie `-ss` mit Keyframes funktioniert, aber mein Problem ist der` -to`-Befehl. Wie würde es mir helfen, den PTS und den DTS jedes Pakets zu kennen, um zu bestimmen, wie sich der Befehl "to" verhält? Houseman vor 6 Jahren 0
Die Option "-to" sucht auf ähnliche Weise nach dem Zeitstempel jedes Frames, wenn Sie entscheiden, wann die Codierung beendet werden soll. Sie müssen sich Ihre beiden Beispiele ansehen und sehen, warum der PTS- oder DTS-Zeitstempel ausgewählt ist. slhck vor 6 Jahren 0
Tut mir leid, wenn ich unklar war, aber ich habe versucht zu fragen: Was bestimmt, ob das PTS oder DTS ausgewählt ist? Was soll ich suchen? Houseman vor 6 Jahren 0
Ah, deine ursprüngliche Frage war, wie man das Video inspizieren kann. Ich dachte, du könntest dort ein Muster finden. Ich nehme an, es wird vom Paket-Demuxer abhängen, wobei es Dutzende (wenn nicht mehr) Möglichkeiten gibt, wie dieser Demuxer den Frame-Zeitstempel auswählt. Ich bin nicht der richtige Ansprechpartner. Ein FFmpeg-Entwickler, der die Interna kennt, könnte mehr wissen. slhck vor 6 Jahren 0