Wie kann ich AVC / MPEG-TS-Videodateien in Windows mit ffmpeg teilen und verbinden, ohne sie zu transkodieren?

3

Ich suche auch eine Linux - Lösung (in eine separate Frage )

Ich habe zwei Videodateien mit der Endung aufgenommen .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 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, das ist auch plattformübergreifend, als Befehl, den ich gefunden habe Hier 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 hat und auf diese Weise nur die erste ( Stream #0:2[0x2da](fra) ) Audio wird aufgenommen. Was ich will ist: entweder alles Audio, entweder das dritte ( Stream #0:3[0x2db](qaa) ). Wie justieren?

ffmpeg sollte daher arbeiten, um:

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

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

3. Fügen Sie an das Ende der ersten Datei den 3,05-minütigen Teil an, der durch Aufteilen der zweiten Datei erhalten wurde.


Was ich ausprobiert habe:

Openshot: Kann nicht ohne Transcodierung verarbeitet werden.

Avidemux (Linux): Beim Versuch zu speichern heißt es "Dies ist nicht MPEG-kompatibel - Sie können den Kopiercodec nicht verwenden."

Avidemux unter Windows: Audio ist nicht synchron.

Community
quelle
Ich denke, dein Gefühl, die Frage zu aktualisieren, ist eine gute Idee - Kommentare sind nicht für eine längere Diskussion gedacht :) Ich oder jemand anderes kann auf diese Weise klarer ansprechen, was du willst!
bertieb
Gute Arbeit, aber ich habe nicht abgestimmt, noch habe ich VTC-Privilegien; deshalb kann ich diejenigen, die dies getan haben, nicht ansprechen.
bertieb
Alles, was ich hinzufügen möchte, ist, dass ich angesichts der Änderung des Umfangs der Frage (n) vorsichtig bin, wenn ich Ihre Unix.SE-Frage offen lasse, da dies als Cross-Posting angesehen werden kann, das verpönt ist. Es liegt an Ihnen, zu entscheiden, ob beide offen bleiben müssen, und ich mache selbst kein Urteil, aber ich vermute, dass andere es als solches ansehen.
bertieb
@bertieb - Obwohl häufig gestellte Fragen beantwortet werden können, stellt sich meine U & L-Frage jetzt anders, da sie eine allgemeine Linux-Lösung erfordert, während diese eine FFMPEG-Lösung unter Windows erfordert. - Ich habe in der Tat eine Antwort für Linux basierend auf Ihrer Antwort hier erstellt und hier eine vereinfachte Version Ihrer Antwort gepostet, wobei auch eine mögliche GUI-Lösung hinzugefügt wurde.

Antworten:

4

Wie teile und verbinde ich Dateien mit ffmpeg unter Beibehaltung aller Audiospuren?

Wie Sie festgestellt haben, wird nur eine Bitstream-Kopie ausgewählt ein (Audio-) Spur nach dem Dokumentation der Stream-Spezifikation :

Standardmäßig, ffmpeg Bezieht nur einen Stream jedes Typs (Video, Audio, Untertitel) in die Eingabedateien ein und fügt sie jeder Ausgabedatei hinzu. Es wählt das "Beste" von jedem anhand der folgenden Kriterien aus: Für Video ist es der Stream mit der höchsten Auflösung, für Audio der Stream mit den meisten Kanälen, für Untertitel der erste Untertitel-Stream. In dem Fall, dass mehrere Streams desselben Typs die gleiche Rate aufweisen, wird der Stream mit dem niedrigsten Index ausgewählt.

Auswählen alles Audiospuren:

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:

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 Beispiele für die Auswahl von Streams finden Sie in der erweiterte Optionen Abschnitt der ffmpeg Dokumentation.

Ich würde auch kombinieren -vcodec copy -acodec copy von Ihrem ursprünglichen Befehl in -c copy wie oben für die Kompaktheit des Ausdrucks.

Teilt:

Kombinieren Sie diese also mit dem, was Sie in den beiden Dateien erreichen möchten, um sie für eine spätere Wiederverbindung aufzuteilen:

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 dem die ersten zwei Minuten der ersten Eingabedatei
  • OutputTwo.ts, das ist das zuerst 3 Minuten und 5 Sekunden der zweiten Eingabedatei

Beitreten:

ffmpeg unterstützt die Verkettung von Dateien ohne Neukodierung, ausführlich in der Verkettungsdokumentation beschrieben .

Erstellen Sie eine Liste der zu verbindenden Dateien (z. B. join.txt ):

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

Dann dein ffmpeg Befehl kann das verwenden concat demuxer:

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

Da arbeitest du mit mpeg Transportströme ( .ts ), Sie sollte in der Lage sein, das concat zu verwenden Protokoll auch:

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

Siehe obiges Beispiel auf der Concat-Seite. Ich überlasse es Ihnen, damit zu experimentieren.

bertieb
quelle
Ich habe vergessen, das Video einzuschließen -map ping, danke für die erinnerung. Ich habe die Frage zum Zusammenfügen (Verketten) von Videodateien gemäß Ihrer Bearbeitung aktualisiert.
bertieb
1
Behalten alles Streams (Video, Audio, Untertitel) ersetzen alle -map s mit der Single: -map 0
bertieb
1
Wenn das concat Demuxer ebenfalls greift nur nach dem "besten" Track (würde erwarten, dass es anders funktioniert, aber das ist es dann ffmpeg...) würde ich das mit einbeziehen -map 0 auch in diesem Schritt.
bertieb
1
Die Positionierung von ffmpeg Befehle sind sehr wichtig. -ss kann entweder vorher oder nachher verwendet werden -i für leicht unterschiedliche Methoden, um dasselbe Ziel zu erreichen (bildgenaue Suche). Sie können alternativ verwenden -to Wenn Sie lieber eine Endzeit als eine Dauer angeben möchten ( -t ).
bertieb
1
ffmpeg ist für Windows-Systeme über verfügbar Zeranoe , Ja. Ich möchte lieber nicht hineinkommen ffmpeg vs avconv, aber sehen superuser.com/questions/507386/… und stackoverflow.com/questions/9477115/…
bertieb
2

Als vereinfachte Antwort basierend auf der Hauptantwort:

So speichern Sie Daten nach einem Startpunkt (bis zum Ende):

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 speichern Sie Daten von einer bestimmten Dauer nach einem bestimmten Zeitpunkt:

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

So behalten Sie Daten von einer bestimmten Dauer nach dem Beginn bei:

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

So verhindern Sie, dass Daten bis zu einem bestimmten Zeitpunkt beginnen:

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

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


Um Dateien zusammenzufügen, erstellen Sie eine Datei mit dem Namen join.txt mit dem Inhalt

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 ausprobiert, aber mit schlechten Ergebnissen. Bei der Suche nach einer Linux-Lösung habe ich diesen Kommentar gefunden Hier zeigt auf Avidemux jeden Abend :

"Sie können Avidemux ausprobieren, aber nicht das stabile. 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 zu finden, da Sie [ nicht] überall schneiden (wegen der "long gop" Sache ...), aber wie jede Software wie diese kann man NUR SCHNEIDEN, sonst wird es gerendert (bei Übergängen, Effekten, ectc.). http://avidemux.org/nightly/win32/ "

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

enter image description here

Verwenden Sie zum Verknüpfen von Dateien Datei öffnen um die erste Datei hinzuzufügen und dann Datei anhängen für den Rest.

Speichern: Datei - Speichern.


quelle