ffmpeg Schneiden Sie ein Medium, das alle Streams, aber auch alle Metadaten, Timecodes und alles andere beibehält

Heute wollte ich eine ts-Datei erhalten, die alles beibehält, also habe ich es mit diesem Befehl versucht:

ffmpeg -i "original.ts" -map 0 -c copy -t 00:30:0.0 -threads 1 "cutted.ts"

Die resultierende Datei hat unterschiedliche Nebenspezifikationen, die ich an die Originaldatei anpassen möchte.

original.ts

[mpeg2video @ 00000000030df040] Invalid frame dimensions 0x0.    
    Last message repeated 2 times    
[mp3 @ 00000000030e0420] Header missing    
[mp3 @ 00000000030df940] Header missing    
    Last message repeated 1 times    
[mpegts @ 00000000030dd500] PES packet size mismatch    
    Last message repeated 2 times    
Input #0, mpegts, from 'original.ts':    
  Duration: 01:14:46.92, start: 64563.955900, bitrate: 5367 kb/s    
  Program 1    
    Stream #0:0[0x201]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv), 720x576 [SAR 16:15 DAR 4:3], max.    
 10000 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc    
    Stream #0:1[0x28b](eng): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, stereo, s16p, 192 kb/s    
    Stream #0:2[0x2b7](001): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, mono, s16p, 64 kb/s    
    Stream #0:3[0x2b8](eng): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, stereo, s16p, 192 kb/s    
    Stream #0:4[0x241](001): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006), 492x250

cutted.ts

[mp3 @ 000000000302fa20] Header fehlt
Letzte Nachricht 1 Mal wiederholt
[mp3 @ 00000000030304c0] Header fehlt
Input #0, mpegts, from 'cutted.ts':
Duration: 00:00:10.08, start: 1.400000 , bitrate: 4297 kb/s
Programm 1
Metadaten:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[ 0x100 ]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv), 720x576 [SAR 16:15 DAR 4:3], max.
10000 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[ 0x101 ](eng): Audio: mp2 ( [3][0][0][0] / 0x0003 ), 48000 Hz , Stereo, s16p, 192 kb/s
Stream #0:2[ 0x102](001): Audio: mp2 ( [3][0][0][0] / 0x0003 ), 48000 Hz, mono, s16p, 64 kb/s
Stream #0:3[ 0x103 ](eng): Audio: mp2 ( [3][0][0][0] / 0x0003 ), 48000 Hz, Stereo, s16p, 192 kb/s
Stream #0:4[ 0x104 ](001): Untertitel: dvb_teletext ([6][0 ][0][0] / 0x0006), 492x250

Die angezeigte Bitrate ändert sich offensichtlich, da die Teilmenge der betrachteten Medien eine andere Länge hat und dies in Ordnung ist.

Start wird nicht beibehalten, da ich Teil eines Transportstroms bin, möchte ich genau diese Startzeit beibehalten. Hier https://ffmpeg.org/pipermail/ffmpeg-user/2013-July/016109.html sprechen sie über reset_timestamps und initial_offset , aber anstatt sie anzugeben, möchte ich, dass sie automatisch kopiert werden.

Streams-ID-Änderungen sowie einige kleinere Spezifikationen in Klammern, aber ich weiß nicht, wofür sie sind.

Ist es auch möglich, eine Ausgabedatei ohne ffmpeg service_name und service_provider Metadaten zu erhalten?

PS: Original ts-Datei wurde von Terratec Home Cinema erstellt.

PPS: Meine Frage enthielt absichtlich nicht die Option -ss, weil diese die Startzeit ändern soll, aber ich interessiere mich auch für eine Lösung mit -ss, die automatisch (wenn möglich) die Startzeit mit (Startzeit ausgeben = Eingabe Startzeit + -ss Befehl Offset)

Antworten (3)

Das scheint zu funktionieren:

ffmpeg -ss N -i input.ts -c copy -copyts -muxdelay 0 -max_delay 0 output.ts

Sie können eine hinzufügen

-map_metadata 0

um alle Metadaten zu erhalten, die ffmpeg kann. Dies scheint jedoch nicht alle Metadaten zu übertragen.

Ich habe es versucht, aber es scheint bei mir nicht zu funktionieren :( Wenn ich die -copytsOption verwende, gibt es eine Ausgabe von 0 kB und eine Warnung aus. Wenn ich alle anderen Optionen hinzufüge, geht die Startzeit auf Null und die Stream-IDs bleiben unverändert wie in meiner vorheriges Beispiel.
Können Sie einen kleinen Teil hochladen - 10 Sekunden?

Das Folgende ist meine Lösung für eine .mp4-Videodatei mit ffmpeg in Windows 7. Dieser Befehl, der in einer .bat -Batchdatei ausgeführt wird, kopiert einen Abschnitt der Eingabedatei (d. h. extrahiert sie als Ausgabedatei), beginnend mit 30 Sekunden in die Eingabedatei, wobei der Extrakt eine Dauer von 60 Sekunden hat und keiner der beiden Streams neu codiert wird.

Dies kann bei Bedarf für einen anderen Videotyp, z. B. einen .ts-Stream (Transportstrom), geändert werden. Aber ändern Sie nicht die Mapping-Befehle in Zeile 2, da diese Zeile der Schlüssel zur Aufrechterhaltung der Audio-Synchronisation ist (die Option itsoffset ).

Die Mapping-Befehle bewahren die Synchronisation des Audiostreams mit dem Videostream, indem sie jegliche Änderung des Offsets zwischen ihnen verhindern.

Die Metadaten in der Eingabedatei werden ebenfalls unverändert in die Ausgabedatei kopiert.

Die Flags-Befehle werden benötigt, um die Ausgabedatei zu schreiben, da mp4 ein Containerformat ist. Die flags-Befehle stellen das mp4-Format der Eingabedatei wieder her (dh den Container, in dem die Audio- und Videostreams untergebracht und synchronisiert sind).

Die letzten beiden Zeilen zeigen nach der Operation Schlüsseldaten sowohl aus den Eingabe- als auch aus den Ausgabedateien auf dem Bildschirm an, damit Sie sie vergleichen und sicher sein können, dass das, was Sie erreichen wollten, erreicht wurde.

SET file=movie.mp4

SET mapping=-i "%file%" -itsoffset 0 -i "%file%" -map 0:v -map 1:a -copyts

SET flags=-flags global_header -movflags faststart

ffmpeg %mapping% -c:v copy -c:a copy -map_metadata 0 -ss 30 -t 60 %flags% out.mp4

echo. & echo. ffmpeg  -i "%file%" -f nul
echo. & echo. ffmpeg  -i out.mp4  -f nul

Ich bin kein Experte für das .ts-Format, aber es ist kein zuverlässiges Videoformat. Es stellt nicht die globalen Dateidaten bereit, die die .mp4- und .mkv-Videoformate bereitstellen, sodass eine .ts-Datei nicht leicht zu finden ist, die Wiedergabe langsam beginnt und möglicherweise einige Dateidaten (z. B. die Gesamtdauer) nicht genau meldet des Videos). Daher ist es besser, von .ts in .mp4 oder .mkv zu konvertieren, da diese Formate nicht die Mängel des .ts-Formats aufweisen.

Um von .ts- zu .mp4-Videos zu konvertieren, löschen Sie einfach Zeile 1 in meinem obigen Batch-Skript und ersetzen Sie dies durch: SET file=movie.ts

.

ffmpeg überschreibt service_nameund service_providermit Standardwerten:

Service01und FFmpeg.

Sie könnten es mit den ursprünglichen Metadaten überschreiben, aber zuerst müssen Sie es abrufen:

i="input.ts"

# get service_name with ffprobe and store it in a variable
svc_name=$(ffprobe -hide_banner -v error -show_entries program_tags=service_name -of default=nw=1:nk=1 "${i}");\

# get service_provider with ffprobe and store it in a variable
svc_provider=$(ffprobe -hide_banner -v error -show_entries program_tags=service_provider -of default=nw=1:nk=1 "${i}");\

# add service_name and service_provider to new TS
ffmpeg -i "${i}" -c copy -copyts -muxdelay 0 -max_delay 0 -map_metadata 0 -metadata service_name="${svc_name}" -metadata service_provider="${svc_provider}" output.ts

Leider funktioniert ffprobe program_tags=nicht mit service_type.