Wie kann ich teilen und beitreten, ohne AVC / MPEG-TS-Videodateien in Windows mit ffmpeg zu transcodieren?

11945
cipricus

Ich suche auch nach einer Linux-Lösung (in einer separaten Frage )

Ich habe zwei Videodateien mit der Erweiterung aufgenommen .ts. Ich muss einen Teil der ersten entfernen, die zweite teilen und dann die erste Datei mit dem ersten (aufgeteilten) 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 transcodieren, zumindest den Anfang entfernen zu können usw.

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, was auch plattformübergreifend ist, als Befehl, den ich hier gefunden habe, 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, mit der Ausnahme, dass der Eingang vier Audiospuren enthält und auf diese Weise nur das erste ( Stream #0:2[0x2da](fra)) Audio aufgenommen wird. Was ich will ist: entweder alles Audio, entweder das dritte ( Stream #0:3[0x2db](qaa)). Wie muss man sich anpassen?

ffmpeg sollte daher funktionieren:

1. Schneiden Sie den Anfang der ersten Datei ab (entfernen Sie die ersten 2 Minuten aus der 1h40-Minuten-Datei).

2. Teilen Sie eine zweite (1 Stunde) Datei in zwei Teile (nach 3,05 Minuten).

3. Fügen Sie den 3.05-min-Teil, der durch Aufteilen der zweiten Datei erhalten wurde, dem Ende der ersten Datei hinzu (anhängen).


Was ich versucht habe:

Openshot: Kann nicht ohne Transcodierung verarbeitet werden.

Avidemux (Linux): Beim Speichern wird "MPEG-kompatibel" angezeigt. Sie können den Copy-Codec nicht verwenden.

Avidemux unter Windows: Audio ist nicht synchron.

3
Ich denke, Ihr Gefühl, die Frage zu aktualisieren, ist eine gute Idee - Kommentare sind nicht für eine ausführliche Diskussion gedacht :) Ich oder eine andere Person kann das, was Sie wollen, klarer auf diese Weise ansprechen! bertieb vor 8 Jahren 0
Gute Arbeit, aber ich habe nicht abgelehnt und habe keine VTC-Privilegien. Ich kann mich also nicht an diejenigen wenden, die dies getan haben. bertieb vor 8 Jahren 0
Alles, was ich hinzufügen möchte, ist, dass ich angesichts der Änderung des Umfangs der Frage [s] Ihre Unix.SE-Frage offen lassen sollte, da sie als Cross-Posting betrachtet werden kann, was als missbilligend angesehen wird. Es liegt an Ihnen, zu entscheiden, ob beide offen bleiben müssen, und ich führe selbst kein Urteil ab, aber ich vermute, dass andere dies als solches betrachten. bertieb vor 8 Jahren 0
@bertieb - Obwohl allgemeine Antworten gegeben werden können, wird meine U & L-Frage jetzt als eine andere betrachtet, da sie nach einer allgemeinen Linux-Lösung fragt, während diese eine FFMPEG-Lösung in Windows fordert. - Ich habe tatsächlich eine Antwort für Linux erstellt, die auf Ihrer Antwort hier basiert, und hier eine vereinfachte Version Ihrer Antwort gepostet, die auch eine mögliche GUI-Lösung enthält. cipricus vor 8 Jahren 0

2 Antworten auf die Frage

5
bertieb

Wie teile ich Dateien auf und füge sie zusammen, ffmpegwährend alle Audiotracks erhalten bleiben?

Wie Sie festgestellt haben, wählt eine Bitstream-Kopie nur eine (Audio-) Spur gemäß der Dokumentation der Streamspezifikation aus :

Beinhaltet standardmäßig ffmpegnur einen Stream jedes Typs (Video, Audio, Untertitel) in den Eingabedateien und fügt sie jeder Ausgabedatei hinzu. Es wird das "Beste" von jedem anhand der folgenden Kriterien ausgewählt: Für Video ist dies der Stream mit der höchsten Auflösung, für Audio der Stream mit den meisten Kanälen, für Untertitel der erste Untertitelstream. In dem Fall, in dem mehrere Streams des gleichen Typs gleich sind, wird der Stream mit dem niedrigsten Index ausgewählt.

So wählen Sie alle Audiospuren aus:

ffmpeg -i InputFile.ts-c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a FirstFile.ts 

So wählen Sie die dritte Audiospur aus:

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 für die Stream-Auswahl finden Sie im Abschnitt Erweiterte Optionen der ffmpegDokumentation.

Ich würde auch -vcodec copy -acodec copyvon Ihrem ursprünglichen Befehl aus -c copywie oben für die Kompaktheit des Ausdrucks kombinieren .

Teilt:

Kombinieren Sie diese mit dem, was Sie in den beiden Dateien erreichen möchten, was das Aufteilen zum späteren Wiederverbinden angeht:

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 alles nach den ersten zwei Minuten der ersten Eingabedatei
  • OutputTwo.tsDies sind die ersten 3 Minuten und 5 Sekunden der zweiten Eingabedatei

Beitreten:

ffmpegunterstützt die Verkettung von Dateien ohne Neucodierung, die ausführlich in der Verkettungsdokumentation beschrieben wird .

Erstellen Sie Ihre Liste der zu verbindenden Dateien (zB join.txt):

file '/path/to/files/OutputOne.ts' file '/path/to/files/OutputTwo.ts' 

Dann kann Ihr ffmpegBefehl Folgendes verwenden concat demuxer:

 ffmpeg -f concat -i join.txt -c copy FinalOutput.ts 

Da Sie mit mpegTransportströmen ( .ts) arbeiten, sollten Sie auch das concat- Protokoll verwenden können :

ffmpeg -i "concat:OutputOne.ts|OutputTwo.ts" -c copy -bsf:a aac_adtstoasc output.mp4 

Gemäß dem Beispiel auf der oben verlinkten Concat-Seite. Das überlasse ich dir, um damit zu experimentieren.

Ich habe vergessen, das Video `-map`ping aufzunehmen, danke für die Erinnerung. Ich habe die Frage nach dem Zusammenfügen (Verketten) von Videodateien gemäß Ihrer Bearbeitung aktualisiert. bertieb vor 8 Jahren 0
Meine Bearbeitung enthält einen Abschnitt zum Verbinden von Dateien. Ich bin immer noch nicht sicher, was Sie mit dem "Split" meinen, aber ich bin froh, dass Sie einen Befehl haben, der funktioniert :) bertieb vor 8 Jahren 0
Wie viele Ausgänge möchten Sie? Eins, die endgültige verbundene Datei? Oder müssen Sie * beide * Teile des Split auf der zweiten Datei behalten? bertieb vor 8 Jahren 0
Um * alle * Streams (Video, Audio, Untertitel) beizubehalten, ersetzen Sie alle `-map`s durch die einzelnen:` -map 0` bertieb vor 8 Jahren 1
Bearbeiten Sie den Inhalt von `join.txt`: Der Pfad zu den Dateien muss in umgekehrten Komas sein, um zu funktionieren. Bei keiner der Lösungen zum Verbinden können jedoch alle Audiodaten beibehalten werden, da nur Standard / zuerst ausgewählt ist cipricus vor 8 Jahren 0
Guter Fang, ich könnte schwören, dass ich diese in einer früheren Revision hatte. Relative Pfade funktionieren auch. bertieb vor 8 Jahren 0
Gibt es eine Möglichkeit, die Dateien mit allen Audiodaten zu verbinden? Sie gehen beim Beitritt außer dem Standard verloren. oder ich wähle in einem früheren Stadium den bevorzugten aus und verwende ihn in beiden Dateien, um verbunden zu werden cipricus vor 8 Jahren 0
Wenn der "concat" -Demuxer * auch nur den "besten" Track holt (würde erwarten, dass er anders funktioniert, aber dann ist dies "ffmpeg" ...), würde ich auch die "-map 0" in diesen Schritt einschließen . bertieb vor 8 Jahren 1
Interessant ist ein Kommentar unter [hier] (http://askubuntu.com/a/370190/47206), in dem "-ss" vor "-i" verwendet wird, während "-t" hinter "-i" stehen sollte. Außerdem: http://trac.ffmpeg.org/wiki/Seeking und http://askubuntu.com/a/547995/47206 cipricus vor 8 Jahren 0
Die Positionierung von 'ffmpeg'-Befehlen ist sehr wichtig. "-ss" kann entweder vor oder nach "-i" für leicht unterschiedliche Methoden zum Erzielen desselben verwendet werden (framegenaue Suche). Sie können alternativ auch "-to" verwenden, wenn Sie lieber eine Endzeit als eine Dauer ("-t") angeben möchten. bertieb vor 8 Jahren 1
Das Ersetzen von "ffmpeg" durch "avconv" funktioniert ok, denke ich in Linux. Ist es auch für Windows verfügbar? cipricus vor 8 Jahren 0
`ffmpeg` ist für Windows-Systeme über [Zeranoe] (http://ffmpeg.zeranoe.com/builds/) verfügbar, yes. Ich möchte lieber nicht in `ffmpeg` vs.` avconv` einsteigen, sondern http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg-or-is-there-even sehen -a-difference und http://stackoverflow.com/questions/9477115/what-eine-differenz-und-ähnlichkeiten-zwischen-ffmpeg-libav-und-avconv/9477756#9477756 bertieb vor 8 Jahren 1
Nach "So wählen Sie alle Audiospuren:" ändern Sie den Befehl, indem Sie nach "InputFile.ts" ein Leerzeichen hinzufügen cipricus vor 8 Jahren 0
1
cipricus

Als vereinfachte Antwort basierend auf der Hauptantwort:

Um Daten nach einem Startpunkt (bis zum Ende) zu behalten:

ffmpeg -i INPUT -c copy -ss START_TIME -map 0 OUTPUT 

Um Daten zwischen zwei Zeitpunkten zu halten:

ffmpeg -i INPUT -c copy -ss START_TIME -to END_TIME -map 0 OUTPUT 

Um Daten nach einer bestimmten Zeit von einer bestimmten Dauer zu halten:

ffmpeg -i INPUT -c copy -ss START_TIME -t DURATION_TIME -map 0 OUTPUT 

Um Daten nach dem Beginn einer bestimmten Dauer zu halten:

ffmpeg -i INPUT -c copy -t DURATION_TIME -map 0 OUTPUT 

Um zu verhindern, dass Daten bis zu einem Zeitpunkt anfangen:

ffmpeg -i INPUT -c copy -to TIME_POINT -map 0 OUTPUT 

TIME kann eine Zahl in Sekunden oder in hh: mm: ss [.xxx] sein.


Erstellen Sie zum Zusammenfügen von Dateien eine join.txtmit dem Inhalt aufgerufene Datei

file 'path-to-INPUT1' file 'path-to-INPUT2' file...etc 

dann

 ffmpeg -f concat -i join.txt OUTPUT 

Oder:

So fügen Sie mpeg-Dateien (einschließlich Transportdateien) zusammen

 ffmpeg -i "concat:INPUT-1|INPUT-2" -c copy -bsf:a aac_adtstoasc OUTPUT 

Als GUI-Lösung habe ich Avidemux getestet, jedoch mit schlechten Ergebnissen. Bei der Suche nach einer Linux-Lösung habe ich diesen Kommentar gefunden, der nachts auf Avidemux verweist :

"Sie können Avidemux ausprobieren, aber nicht die stabile Version. Sie sollten die Win32-Version (ja, für Windows) mit" Wine "versuchen. Sie unterstützt H.264 und Sie müssen den Doppelpfeil verwenden, um die Keyframes herauszufinden, da Sie not] nicht überall schneiden (wegen der "long gop" -Sache ...). Aber wie jede andere Software kann man JUST CUTS machen, sonst wird es gerendert (im Falle von Übergängen, Effekten usw.). http: / /avidemux.org/nightly/win32/ "

Ich habe das in Linux / Wine getestet, aber es sollte auch in Windows funktionieren.

Um Dateien zu verbinden, fügen Sie mit File-Open die erste Datei und dann File-Append für den Rest hinzu.

Speichern: Datei - Speichern.