Ich suche auch nach einer Linux-Lösung (ineine gesonderte Frage)
Ich habe zwei aufgezeichnete Videodateien mit der Erweiterung .ts
. Ich muss einen Teil der ersten entfernen, die zweite teilen und dann die erste Datei mit dem ersten (geteilten) Teil der zweiten Datei zusammenführen.
Sie haben beide die gleichen Eigenschaften:
Format : MPEG-TS
File size : 3.16 GiB
Duration : 1h 39mn
Overall bit rate mode : Variable
Overall bit rate : 4 527 Kbps
Video
ID : 720 (0x2D0)
Menu ID : 6181 (0x1825)
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L4
Format settings, CABAC : Yes
Format settings, ReFrames : 4 frames
Codec ID : 27
Duration : 1h 39mn
Width : 1 440 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate : 25.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : MBAFF
Sie enthalten auch mehrere Audiospuren und Untertitel.
Ich möchte sie verarbeiten, ohne die Dateien zu transkodieren, zumindest den Anfang usw. entfernen können.
FFMPEG
:
ffmpeg -i source.mts
gibt:
Input #0, mpegts, from 'source1.mts':
Duration: 01:40:00.76, start: 2995.511878, bitrate: 4526 kb/s
Program 6181
Stream #0:0[0x46](fra,fra): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006)
Stream #0:1[0x2d0]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:2[0x2da](fra): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 73 kb/s
Stream #0:3[0x2db](qaa): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 67 kb/s
Stream #0:4[0x2dc](deu): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 49 kb/s
Stream #0:5[0x2dd](qad): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 57 kb/s
Ich denke, es ist sehr gut machbar mit ffmpeg
, das auch plattformübergreifend ist, als ein Befehl, den ich gefunden habeHier um einen Teil einer Datei zu entfernen.
ffmpeg -i InputFile -vcodec copy -acodec copy -ss 00:12:34.567 -t 00:34:56.789 OutputFile
funktioniert, abgesehen davon, dass der Eingang vier Audiospuren hat und auf diese Weise nur das erste ( Stream #0:2[0x2da](fra)
) Audio übernommen wird. Was ich will, ist: entweder das gesamte Audio oder das dritte ( Stream #0:3[0x2db](qaa)
). Wie kann ich das einstellen?
ffmpeg
sollte daher darauf hinwirken:
1. Schneiden Sie den Anfang der ersten Datei ab (entfernen Sie die ersten 2 Minuten aus der 1h40-min-Datei)
2. Teilen Sie eine zweite (1 Stunde) Datei in zwei Teile (nach 3,05 Minuten)
3. Fügen Sie den 3,05-Minuten-Teil, der durch das Teilen der zweiten Datei entstanden ist, an das Ende der ersten Datei an.
Was ich versucht habe:
Openshot: kann ohne Transkodierung nicht verarbeitet werden.
Avidemux (Linux): Beim Versuch zu speichern kommt die Meldung„Dies ist nicht MPEG-kompatibel – Sie können den Kopiercodec nicht verwenden.“
Avidemux unter Windows: Audio ist nicht synchron.
Antwort1
Wie kann ich Dateien teilen und zusammenfügen und ffmpeg
dabei alle Audiospuren beibehalten?
Wie Sie festgestellt haben, wählt eine Bitstream-Kopie nureins(Audio-)Spur, gemäß derDokumentation zur Stream-Spezifikation:
Standardmäßig
ffmpeg
wird nur ein Stream jedes Typs (Video, Audio, Untertitel) in die Eingabedateien aufgenommen und zu jeder Ausgabedatei hinzugefügt. Es wählt den „besten“ Stream anhand der folgenden Kriterien aus: Bei Video ist es der Stream mit der höchsten Auflösung, bei Audio der Stream mit den meisten Kanälen, bei Untertiteln der erste Untertitel-Stream. Falls mehrere Streams desselben Typs die gleiche Rate aufweisen, wird der Stream mit dem niedrigsten Index ausgewählt.
Zu wählenalleAudiospuren:
ffmpeg -i InputFile.ts-c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a FirstFile.ts
Zur Auswahl derdritteAudiospur:
ffmpeg -i InputFile.ts -c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a:2 FirstFile.ts
Weitere Informationen und Beispiele zur Stream-Auswahl finden Sie imerweiterte OptionenAbschnitt der ffmpeg
Dokumentation.
Der Kompaktheit des Ausdrucks halber würde ich -vcodec copy -acodec copy
Ihren ursprünglichen Befehl auch wie oben kombinieren .-c copy
Teilt:
Kombinieren Sie diese also mit dem, was Sie in den beiden Dateien im Hinblick auf die Aufteilung für ein späteres Wiederzusammenführen erreichen möchten:
ffmpeg -i InputOne.ts -ss 00:02:00.0 -c copy -map 0:v -map 0:a OutputOne.ts
ffmpeg -i InputTwo.ts -c copy -t 00:03:05.0 -map 0:v -map 0:a OutputTwo.ts
werde dir geben:
OutputOne.ts
, das ist allesnachdie ersten zwei Minuten der ersten EingabedateiOutputTwo.ts
, das ist dieErste3 Minuten und 5 Sekunden der zweiten Eingabedatei
Verbinden:
ffmpeg
unterstützt die Verkettung von Dateien ohne Neukodierung,ausführlich beschrieben in der Verkettungsdokumentation.
Erstellen Sie Ihre Liste der zusammenzufügenden Dateien (z. B. join.txt
):
file '/path/to/files/OutputOne.ts'
file '/path/to/files/OutputTwo.ts'
Dann ffmpeg
kann Ihr Befehl Folgendes verwenden concat demuxer
:
ffmpeg -f concat -i join.txt -c copy FinalOutput.ts
mpeg
Da Sie mit Transportströmen ( ) arbeiten .ts
,sollenin der Lage sein, die concat verwendenProtokollsowie:
ffmpeg -i "concat:OutputOne.ts|OutputTwo.ts" -c copy -bsf:a aac_adtstoasc output.mp4
Gemäß dem Beispiel auf der oben verlinkten Concat-Seite. Damit überlasse ich es Ihnen, zu experimentieren.
Antwort2
Eine vereinfachte Antwort basierend auf der Hauptantwort:
So behalten Sie Daten nach einem Startpunkt (bis zum Ende) bei:
ffmpeg -i INPUT -c copy -ss START_TIME -map 0 OUTPUT
So behalten Sie Daten zwischen zwei Zeitpunkten bei:
ffmpeg -i INPUT -c copy -ss START_TIME -to END_TIME -map 0 OUTPUT
So behalten Sie Daten für eine bestimmte Dauer nach einem bestimmten Zeitpunkt:
ffmpeg -i INPUT -c copy -ss START_TIME -t DURATION_TIME -map 0 OUTPUT
So behalten Sie Daten für eine bestimmte Dauer nach dem Beginn:
ffmpeg -i INPUT -c copy -t DURATION_TIME -map 0 OUTPUT
So halten Sie Daten vom Beginn bis zu einem bestimmten Zeitpunkt zurück:
ffmpeg -i INPUT -c copy -to TIME_POINT -map 0 OUTPUT
ZEIT kann eine Zahl in Sekunden oder im Format hh:mm:ss[.xxx] sein.
Um Dateien zusammenzufügen, erstellen Sie eine Datei join.txt
mit dem Namen
file 'path-to-INPUT1'
file 'path-to-INPUT2'
file...etc
Dann
ffmpeg -f concat -i join.txt OUTPUT
Oder:
So verbinden Sie MPEG-Dateien (einschließlich Transportdateien)
ffmpeg -i "concat:INPUT-1|INPUT-2" -c copy -bsf:a aac_adtstoasc OUTPUT
Als GUI-Lösung habe ich Avidemux ausprobiert, allerdings mit schlechten Ergebnissen. Bei der Suche nach einer Linux-Lösung habe ich diesen Kommentar gefundenHierzeigt aufAvidemux nächtlich:
"Sie können Avidemux ausprobieren, aber nicht die stabile Version. Sie sollten die Win32-Version (ja, für Windows) mit "Wine" ausprobieren. Sie unterstützt H.264 und Sie müssen den Doppelpfeil verwenden, um die Keyframes herauszufinden, da Sie [nicht] überall schneiden können (aufgrund der "Long Gop"-Sache...). Aber wie bei jeder Software dieser Art können Sie NUR SCHNITTE machen, sonst wird es gerendert (bei Übergängen, Effekten usw.). http://avidemux.org/nightly/win32/"
Ich habe das unter Linux/Wine getestet, aber es sollte auch unter Windows funktionieren.
Um Dateien zusammenzuführen, verwenden SieDatei öffnenum die erste Datei hinzuzufügen, und dannDatei-Anhängenfür den Rest.
Speichern:Datei - Speichern.