FFmpeg - Schneiden Sie Videos in Segmente, transkodieren Sie sie einzeln, verketten Sie sie und geben Sie sie an .ts aus

2180
Mugba

Dies ist eine Folgefrage zu einem Audiofehler, wenn Sie Clips mit ffmpeg verketten

Was ich erreichen möchte, ist folgendes:

  1. Schneiden Sie ein Eingangsvideo in Stücke
  2. Transkodieren Sie jeden Abschnitt (Video und Audio) mithilfe von x.264 und libfdk_aac einzeln in einen .ts-Container
  3. Verketten Sie die transcodierten Chunks und geben Sie sie als 1 .ts-Datei aus

Ich kann die Segmente mit der hier vorgeschlagenen trim / concat-Lösung schneiden und verketten

ffmpeg -i input.mp4 -filter_complex "[0:v]trim=duration=5[av];[0:a]atrim=duration=5[aa];\ [0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[bv]; [0:a]atrim=start=05:end=10,asetpts=PTS-STARTPTS[ba];\ [av][bv]concat[cv];[aa][ba]concat=v=0:a=1[ca];\ [0:v]trim=start=10:end=15,setpts=PTS-STARTPTS[dv];\ [0:a]atrim=start=10:end=15,asetpts=PTS-STARTPTS[da];\ [cv][dv]concat[outv];[ca][da]concat=v=0:a=1[outa]" -map [outv] -map [outa] output.mp4 

Bei diesen Lösungen fehlt jedoch der Schritt "Jedes Segment einzeln umcodieren".

Ich habe einen anderen Ansatz ausprobiert - schneiden Sie jedes Segment und transcodieren Sie es mit demselben Befehl

ffmpeg -i input.mp4 -ss 00 -t 10 -vcodec libx264 -acodec libfdk_aac -f mpegts segment0.ts 

dann concat

printf "file '%s'\n" ./*.ts > mylist.txt  ffmpeg -f concat -i mylist.txt -vcodec copy -bsf:a aac_adtstoasc output.mp4 

Bereits nach dem Segment- / Transcodeschritt hat jedes Segment am Anfang seines Audiostroms eine kurze Stille, die dann an jedem Klebepunkt im verketteten Video hörbar ist. Ich habe einige Testvideos ausprobiert und es gab nur 1, bei dem ich diese Stille nicht hören konnte.

Jetzt frage ich mich, ob es eine Möglichkeit gibt, die oben beschriebene trim / concat-Lösung zu verwenden, aber einen "Transcode jedes Segment separat vor dem concat" -Schritt enthalten. Möglicherweise muss dies in drei Befehlen erreicht werden, dh in Segmente schneiden, jedes Segment transkodieren, transkodierte Concat-Segmente und können nicht alle mit demselben Befehl ausgeführt werden.

Bei dem Ansatz, den ich ausprobiert habe, wo ich Suchen und Transcodieren verwendet habe, sind diese Audioprobleme aufgetreten, und ich vermute, dass sie während der Transcodierung jedes Segments eingeführt wurden. Ich bin mir nicht sicher, ob dies auf den Ansatz zurückzuführen ist, den ich ausprobiert habe und der mit einem Trim-Filter (oder einem anderen Filter?) Mit nachfolgender Transkodierung vermieden werden kann, aber einen Befehl oder eine Befehlssequenz, die dies erreichen könnte, nicht kennt.


Versuchen Sie diesen Befehl

ffmpeg -i mtb.mp4 -ss 05 -t 5 -c:v libx264 -c:a aac -strict -2 transcoded3.mp4 

Ergibt die folgende Konsolenausgabe

ffmpeg -i mtb.mp4 -ss 05 -t 5 -c:v libx264 -c:a aac -strict -2 transcoded3.mp4 ffmpeg version 2.4.git Copyright (c) 2000-2014 the FFmpeg developers built on Nov 20 2014 12:45:24 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) configuration: --prefix=/home/tobi/ffmpeg_build --extra-cflags=-I/home/tobi/ffmpeg_build/include --extra-ldflags=-L/home/tobi/ffmpeg_build/lib --bindir=/home/tobi/bin --enable-gpl --enable-libass - -enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora -- enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab libavutil 54. 14.100 / 54. 14.100 libavcodec 56. 12.101 / 56. 12.101 libavformat 56. 14.100 / 56. 14.100 libavdevice 56. 3.100 / 56. 3.100 libavfilter 5. 2.103 / 5. 2.103 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 3.100 / 53. 3.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'mtb.mp4': Metadata: major_brand : mp42 minor_version : 1 compatible_brands: mp41mp42isom creation_time : 2014-06-07 13:05:13 Duration: 00:01:40.35, start: 0.263317, bitrate: 3231 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 3027 kb/s, 29.97 fps, 29.97 tbr, 60k tbn, 59.94 tbc (default) Metadata: creation_time : 2014-06-07 13:05:13 handler_name : Core Media Video Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default) Metadata: creation_time : 2014-06-07 13:05:13 handler_name : Core Media Audio [libx264 @ 0x25ec3a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 [libx264 @ 0x25ec3a0] profile High, level 3.1 [libx264 @ 0x25ec3a0] 264 - core 142 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'transcoded3.mp4': Metadata: major_brand : mp42 minor_version : 1 compatible_brands: mp41mp42isom encoder : Lavf56.14.100 Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--1, 29.97 fps, 30k tbn, 29.97 tbc (default) Metadata: creation_time : 2014-06-07 13:05:13 handler_name : Core Media Video encoder : Lavc56.12.101 libx264 Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default) Metadata: creation_time : 2014-06-07 13:05:13 handler_name : Core Media Audio encoder : Lavc56.12.101 aac Stream mapping: Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) Stream #0:1 -> #0:1 (aac (native) -> aac (native)) Press [q] to stop, [?] for help frame= 1 fps=1.0 q=0.0 size= 0kB time=00:00:00.99 bitrate= 0.4kbits/sframe= 24 fps= 16 q=0.0 size= 0kB time=00:00:01.76 bitrate= 0.2kbits/sframe= 42 fps= 17 q=29.0 size= 53kB time=00:00:02.34 bitrate= 186.5kbits/frame= 45 fps= 15 q=29.0 size= 95kB time=00:00:02.46 bitrate= 317.7kbits/frame= 49 fps= 13 q=29.0 size= 131kB time=00:00:02.60 bitrate= 411.1kbits/frame= 51 fps= 12 q=29.0 size= 169kB time=00:00:02.64 bitrate= 523.9kbits/frame= 54 fps= 11 q=29.0 size= 215kB time=00:00:02.76 bitrate= 636.9kbits/frame= 58 fps= 11 q=29.0 size= 247kB time=00:00:02.87 bitrate= 703.6kbits/frame= 61 fps= 10 q=29.0 size= 284kB time=00:00:02.99 bitrate= 776.5kbits/frame= 65 fps=9.8 q=29.0 size= 323kB time=00:00:03.13 bitrate= 844.6kbits/frame= 69 fps=9.5 q=29.0 size= 363kB time=00:00:03.25 bitrate= 913.8kbits/frame= 72 fps=9.2 q=29.0 size= 408kB time=00:00:03.36 bitrate= 993.7kbits/frame= 76 fps=9.1 q=29.0 size= 437kB time=00:00:03.48 bitrate=1028.8kbits/frame= 80 fps=8.9 q=29.0 size= 483kB time=00:00:03.62 bitrate=1092.0kbits/frame= 83 fps=8.7 q=29.0 size= 516kB time=00:00:03.71 bitrate=1137.6kbits/frame= 86 fps=8.5 q=29.0 size= 557kB time=00:00:03.83 bitrate=1190.5kbits/frame= 89 fps=8.2 q=29.0 size= 601kB time=00:00:03.92 bitrate=1254.7kbits/frame= 93 fps=8.2 q=29.0 size= 635kB time=00:00:04.06 bitrate=1279.6kbits/frame= 97 fps=8.0 q=29.0 size= 683kB time=00:00:04.20 bitrate=1331.7kbits/frame= 101 fps=7.9 q=29.0 size= 737kB time=00:00:04.31 bitrate=1397.1kbits/frame= 105 fps=7.8 q=29.0 size= 776kB time=00:00:04.45 bitrate=1426.4kbits/frame= 109 fps=7.7 q=29.0 size= 827kB time=00:00:04.59 bitrate=1473.2kbits/frame= 112 fps=7.6 q=29.0 size= 855kB time=00:00:04.69 bitrate=1492.8kbits/frame= 115 fps=7.5 q=29.0 size= 898kB time=00:00:04.78 bitrate=1538.3kbits/frame= 119 fps=7.5 q=29.0 size= 944kB time=00:00:04.92 bitrate=1570.5kbits/frame= 123 fps=7.5 q=29.0 size= 986kB time=00:00:04.94 bitrate=1633.0kbits/frame= 127 fps=7.4 q=29.0 size= 1040kB time=00:00:04.94 bitrate=1722.5kbits/frame= 131 fps=7.4 q=29.0 size= 1089kB time=00:00:04.94 bitrate=1803.1kbits/frame= 134 fps=7.3 q=29.0 size= 1146kB time=00:00:04.94 bitrate=1898.5kbits/frame= 137 fps=7.2 q=29.0 size= 1189kB time=00:00:04.94 bitrate=1970.1kbits/frame= 140 fps=7.2 q=29.0 size= 1231kB time=00:00:04.94 bitrate=2039.6kbits/frame= 143 fps=7.1 q=29.0 size= 1275kB time=00:00:04.94 bitrate=2112.6kbits/frame= 147 fps=7.1 q=29.0 size= 1326kB time=00:00:04.94 bitrate=2196.8kbits/frame= 150 fps=5.3 q=29.0 Lsize= 2092kB time=00:00:05.01 bitrate=3416.7kbits/s  video:2007kB audio:79kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.283190% [libx264 @ 0x25ec3a0] frame I:1 Avg QP:24.42 size: 53959 [libx264 @ 0x25ec3a0] frame P:123 Avg QP:24.87 size: 15050 [libx264 @ 0x25ec3a0] frame B:26 Avg QP:28.35 size: 5760 [libx264 @ 0x25ec3a0] consecutive B-frames: 70.7% 13.3% 16.0% 0.0% [libx264 @ 0x25ec3a0] mb I I16..4: 3.2% 80.6% 16.1% [libx264 @ 0x25ec3a0] mb P I16..4: 1.7% 8.2% 1.4% P16..4: 44.2% 20.7% 6.6% 0.0% 0.0% skip:17.1% [libx264 @ 0x25ec3a0] mb B I16..4: 0.4% 1.6% 0.3% B16..8: 48.8% 5.7% 0.6% direct: 0.8% skip:41.9% L0:53.1% L1:45.4% BI: 1.5% [libx264 @ 0x25ec3a0] 8x8 transform intra:72.8% inter:76.3% [libx264 @ 0x25ec3a0] coded y,uvDC,uvAC intra: 64.3% 36.4% 1.5% inter: 23.5% 15.1% 0.0% [libx264 @ 0x25ec3a0] i16 v,h,dc,p: 32% 21% 25% 22% [libx264 @ 0x25ec3a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 17% 18% 20% 6% 8% 6% 9% 6% 9% [libx264 @ 0x25ec3a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 21% 14% 7% 10% 8% 11% 6% 8% [libx264 @ 0x25ec3a0] i8c dc,h,v,p: 69% 15% 14% 2% [libx264 @ 0x25ec3a0] Weighted P-Frames: Y:2.4% UV:0.0% [libx264 @ 0x25ec3a0] ref P L0: 77.7% 20.1% 1.6% 0.5% 0.0% [libx264 @ 0x25ec3a0] ref B L0: 99.0% 0.9% 0.1% [libx264 @ 0x25ec3a0] ref B L1: 98.8% 1.2% [libx264 @ 0x25ec3a0] kb/s:3284.53 
3
Ihre Anforderung ist etwas verwirrend. Die vorgeschlagene Lösung, auf die Sie sich beziehen, ** codiert ** jedes Segment. Es war jedoch beabsichtigt, bestimmte Abschnitte aus einem Video zu extrahieren und nicht in Scheiben zu schneiden. Zu Ihrem Zweck können Sie einfach drei separate Transcodes für drei separate Start- und Endpunkte ausführen und dann verketten. Auch sollte es am Anfang keine "Stille" geben, wenn alles korrekt verläuft. Stellen Sie auch die Konsolenausgabe dieses Befehls bereit. Rajib vor 9 Jahren 0
Ich habe gerade ein Stück aus dem Video geschnitten und einen separaten Befehl zum Transkodieren verwendet. Ich habe alle Beispieldateien hier hinzugefügt, wenn Sie einen Blick darauf werfen möchten, https://www.dropbox.com/sh/h09r1pm1f4mv5fh/AABJOg-zfXdJDNtwqiQjhHQEa?dl=0 mit zwei Screenshots, die den Audiostream in Audacity des Abschnitts und von zeigen das Stück nach der Transkodierung. Es scheint, dass am Anfang der transcodierten Datei Stille hinzugefügt wurde, nicht sicher, was ich falsch mache. Das Originalvideo ist mtb.mp4, der Chunk ist chunk1.mp4 und der transcodierte Chunk ist transcoded1.mp4. Ich habe auch eine .txt mit Befehlen und Konsolenausgabe hinzugefügt. Mugba vor 9 Jahren 0
Warum versuchen Sie nicht `ffmpeg -i mtb.mp4 -ss 00 -t 5 -c: v libx264 -c: a aac -strict -2 transcoded1.mp4` auf einmal? (In diesem Fall brauchen Sie jedoch keine Startzeit). Bitte geben Sie auch die Konsolenausgabe hier anstelle von Dropbox an. Rajib vor 9 Jahren 0
danke, ich habe Ihren Befehl mit dem nativen aac anstelle von libfdk_aac ausprobiert, siehe Konsolenausgabe oben. Leider gibt es zu diesem Zeitpunkt immer noch sehr kurze Stille am Anfang jedes Clips, den ich extrahiere und transkodiere, was hörbar ist, wenn ich die Segmente wieder zusammenhalte. Irgendeine Idee, wie das gelöst werden könnte? Mugba vor 9 Jahren 0
@Rajib, hier scheint das Problem, das ich habe, zu beschreiben, obwohl es keine Lösung dafür gibt, https://lists.ffmpeg.org/pipermail/ffmpeg-user/2013-December/019067.html Mugba vor 9 Jahren 0
Als Sie es mit Filterkette und "Setpts" und "Asetpts" versucht haben, ergab das auch die gleiche Lücke? Rajib vor 9 Jahren 0
@Rajib, nein, ich glaube nicht, aber wie kann ich die Transkodierung der einzelnen Segmente in dieser Filterkette so steuern, dass sie einzeln und einzeln transkodiert werden, bevor sie in der Ausgabedatei zusammengefügt werden? Ich meine damit, dass die Reihenfolge der Verarbeitung 1) Slunk Out Chunk1 2) Transcode Chunk1 3) Slice Out Chunk2 4) Transcode Chunk2 5) Concat transcodierte Chunks in die Ausgabe? Grund dafür ist, dass die Chunks in einer verteilten Umgebung transcodiert werden können, bevor sie in der Ausgabedatei wieder zusammengefügt werden. Mugba vor 9 Jahren 0

1 Antwort auf die Frage

1
Rajib

Sie sprechen im Wesentlichen von separaten Kodierungen für separate Videoblocke, die als separate Schritte ausgeführt werden können - wie bei Ihrem Befehl ffmpeg -i mtb.mp4 -ss 05 -t 5 -c:v libx264 -c:a aac -strict -2 transcoded3.mp4.

Um den TrimFilter zu verwenden, um einen Block von etwa 5 bis 10 Sekunden zu schneiden, verwenden Sie diesen Befehl (dies verwendet jedoch setptsund asetpts):

ffmpeg -i mtb.mp4 -filter_complex
"[0: v] trim = start = 05: end = 10, setpts = PTS-STARTPTS [tv]; \
[0: a] atrim = start = 05: end = 10, asetpts = PTS-STARTPTS [ta] "\
-map [tv] -map [ta] segment2.ts

Beachten Sie, dass ich keine Kodierungsparameter (Qualität) angegeben habe.

Wenn Sie ts-Dateien verketten, sollten Sie einfach sagen können:

cat segment1.ts segment2.ts .... segmentn.ts> fullfile.ts

Wenn ich den Trimmfilter wie diesen verwende, hat jedes resultierende Slice am Anfang seines Audiostroms etwas Ruhe, genau wie bei dem Befehl, der Suchen und dann Transkodieren verwendet. Wenn diese zusätzliche Stille nicht verhindert werden kann, ist dies möglicherweise nicht der richtige Weg für meinen Anwendungsfall, da ich Video-Teile herausschneiden, transkodieren und zusammenfügen muss, damit die Ausgabedatei so klingt und aussieht wie Eingabedatei. Danke für die bisherige Hilfe, auf jeden Fall! Mugba vor 9 Jahren 0