Ich habe einen Anwendungsfall, in dem ich ein paar MPEG-4-Dateien nehme, sie zuschneide und zu einer Datei verkette. Ich habe einen zweiten Anwendungsfall, in dem eine dieser Dateien zugeschnitten und auch beschnitten / skaliert wird. Diese Dateien müssen neu codiert werden.
Das Problem mit dem zweiten Anwendungsfall ist, dass ich am Ende eine Mischung aus zwei verschiedenen Dateilayouts habe:
Nur trimmen:
Format : MPEG-4
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings, CABAC : Yes
Format settings, ReFrames : 4 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 28s 17ms
Bit rate : 3 362 Kbps
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Variable
Frame rate : 60.000 fps
Minimum frame rate : 58.824 fps
Maximum frame rate : 62.500 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.061
Stream size : 11.2 MiB (95%)
Color primaries : BT.709
Transfer characteristics : sYCC
Matrix coefficients : BT.709
Zuschneiden + Zuschneiden / Skalieren (neu codieren)
Format : MPEG-4
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High 4:4:4 [email protected]
Format settings, CABAC : No
Format settings, ReFrames : 1 frame
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 29s 0ms
Bit rate : 24.8 Mbps
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 60.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.448
Stream size : 85.7 MiB (99%)
Writing library : x264 core 144 r96 40bb568
Encoding settings : cabac=0 / ref=1 / deblock=0:0:0 / analyse=0:0 / me=dia / subme=0 / psy=0 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=0 / threads=3 / lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=250 / keyint_min=25 / scenecut=0 / intra_refresh=0 / rc=cqp / mbtree=0 / qp=0
Befehl zum Skalieren / Zuschneiden:
ffmpeg -i -ss 05 test.mp4 -c:a copy -vf "crop=w=(in_w/1000)*%d:h=(in_h/566)*%d:x=(in_w/1000)*%d:y=(in_h/566)*%d,scale=in_w:in_h" out-scale-crop.mp4
Auf Anfrage von LordNeckbeard wurde die Ausgabe von FFMPEG hinzugefügt
ffmpeg version N-43527-gb23a866- http://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2015 the FFmpeg developers
built on Jan 13 2015 01:29:05 with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-gpl --enable-version3 --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --disable-ffserver --enable-libass --enable-gnutls --cc=gcc
libavutil 54. 16.100 / 54. 16.100
libavcodec 56. 20.100 / 56. 20.100
libavformat 56. 18.101 / 56. 18.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 7.100 / 5. 7.100
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 '/home/rohan/render_cache/v4033205_745.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.18.101
Duration: 00:00:35.77, start: 0.000000, bitrate: 2143 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2001 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 131 kb/s (default)
Metadata:
handler_name : SoundHandler
[libx264 @ 0x360bd20] using cpu capabilities: MMX2 SSE Cache64
[libx264 @ 0x360bd20] profile High 4:4:4 Predictive, level 3.0, 4:2:0 8-bit
[libx264 @ 0x360bd20] 264 - core 144 r96 40bb568 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, mp4, to '/home/rohan/render_cache/v4033205_745_1_cut.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.18.101
Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 690x384, q=-1--1, 30 fps, 15360 tbn, 30 tbc (default)
Metadata:
handler_name : VideoHandler
encoder : Lavc56.20.100 libx264
Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 131 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 15 fps=0.0 q=0.0 size= 633kB time=00:00:00.55 bitrate=9409.0kbits/sframe= 65 fps= 65 q=0.0 size= 2986kB time=00:00:02.22 bitrate=11002.2kbits/frame= 117 fps= 77 q=0.0 size= 5507kB time=00:00:03.96 bitrate=11380.3kbits/frame= 182 fps= 91 q=0.0 size= 7832kB time=00:00:06.12 bitrate=10476.3kbits/frame= 244 fps= 97 q=0.0 size= 10248kB time=00:00:08.19 bitrate=10250.0kbits/frame= 290 fps= 96 q=0.0 size= 12275kB time=00:00:09.72 bitrate=10342.1kbits/frame= 337 fps= 96 q=0.0 size= 14408kB time=00:00:11.27 bitrate=10464.6kbits/frame= 401 fps= 99 q=0.0 size= 17318kB time=00:00:13.41 bitrate=10575.5kbits/frame= 458 fps=101 q=0.0 size= 20332kB time=00:00:15.31 bitrate=10872.8kbits/frame= 477 fps= 90 q=0.0 size= 21308kB time=00:00:15.94 bitrate=10946.6kbits/frame= 541 fps= 93 q=0.0 size= 24973kB time=00:00:18.08 bitrate=11314.0kbits/frame= 601 fps= 95 q=0.0 size= 28271kB time=00:00:20.07 bitrate=11534.2kbits/frame= 654 fps= 96 q=0.0 size= 31201kB time=00:00:21.84 bitrate=11701.2kbits/frame= 714 fps= 97 q=0.0 size= 34484kB time=00:00:23.86 bitrate=11837.8kbits/frame= 769 fps= 98 q=0.0 size= 37860kB time=00:00:25.69 bitrate=12069.0kbits/frame= 814 fps= 97 q=0.0 size= 40593kB time=00:00:27.18 bitrate=12232.8kbits/frame= 840 fps= 97 q=-1.0 Lsize= 42204kB time=00:00:28.02 bitrate=12338.7kbits/s dup=1 drop=0
video:41726kB audio:453kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.058509%
[libx264 @ 0x360bd20] frame I:4 Avg QP: 0.00 size:132759
[libx264 @ 0x360bd20] frame P:836 Avg QP: 0.00 size: 50474
[libx264 @ 0x360bd20] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0x360bd20] mb P I16..4: 15.1% 0.0% 0.0% P16..4: 40.7% 0.0% 0.0% 0.0% 0.0% skip:44.2%
[libx264 @ 0x360bd20] coded y,uvDC,uvAC intra: 99.5% 98.9% 98.7% inter: 36.3% 39.9% 39.5%
[libx264 @ 0x360bd20] i16 v,h,dc,p: 56% 44% 0% 0%
[libx264 @ 0x360bd20] i8c dc,h,v,p: 0% 44% 55% 0%
[libx264 @ 0x360bd20] kb/s:12207.68
Befehl zum Trimmen:
ffmpeg -i -ss 05 test.mp4 -codec copy trimmed.mp4
ffmpeg version N-43527-gb23a866- http://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2015 the FFmpeg developers
built on Jan 13 2015 01:29:05 with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-gpl --enable-version3 --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --disable-ffserver --enable-libass --enable-gnutls --cc=gcc
libavutil 54. 16.100 / 54. 16.100
libavcodec 56. 20.100 / 56. 20.100
libavformat 56. 18.101 / 56. 18.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 7.100 / 5. 7.100
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 '/home/rohan/render_cache/v4033205_6295.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.18.101
Duration: 00:00:36.02, start: 0.000000, bitrate: 2142 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2001 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 131 kb/s (default)
Metadata:
handler_name : SoundHandler
Output #0, mp4, to '/home/rohan/render_cache/v4033205_6295_0_cut.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.18.101
Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080, q=2-31, 2001 kb/s, 30 fps, 30 tbr, 90k tbn, 90k tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 131 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 841 fps=0.0 q=-1.0 Lsize= 7498kB time=00:00:28.02 bitrate=2192.1kbits/s
Wenn ich eine Reihe von zugeschnittenen Dateien, die zu einer Datei verkettet sind, wiedergebe, scheint alles auf MPC-HC und Youtube korrekt zu funktionieren. Wenn ich jedoch skalierte / beschnittene Dateien hinzufüge und diese zusammen mit den nicht skalierten / beschnittenen Dateien verkette, frieren beide Player ein beim Umschalten auf die nächsten Segmente.
Ich vermute, dass das Umschalten zwischen variabler und konstanter Bildrate der Schuldige ist.
Die einfache Lösung wäre, einfach alles mit der gleichen konstanten Bildrate neu zu codieren, aber ich hoffe, ich muss nicht (Codec: Kopieren ist schnell und behält die Qualität) und die Quelle, von der ich diese Dateien erhalte ab könnte unterschiedliche Frameraten usw. haben
Am liebsten würde ich die Neukodierung des Zuschnitts / Maßstabs mit genau den gleichen Einstellungen wie die Eingabedatei durchführen, damit ich bei der Verkettung nicht auf diese Nichtübereinstimmung in Ausgabedateien stoße. Ist das möglich?
Bearbeiten Sie # 2, @occvtech
Ich verwende in der Tat das concat-Protokoll mit einer merge_list.txt wie folgt:
./ffmpeg -f concat -i merge_list.txt -codec copy output.mp4
Und seine Ausgabe:
ffmpeg version 2.6.2- http://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-gpl --enable-version3 --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --enable-libass --enable-gnutls --enable-libvidstab --enable-libsoxr --cc=gcc-4.9
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, concat, from '/home/rohan/render_cache/merge_list.txt':
Duration: N/A, start: 0.000000, bitrate: 2208 kb/s
Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2076 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 131 kb/s
Output #0, mp4, to '/home/rohan/render_cache/sivhd_final.mp4':
Metadata:
encoder : Lavf56.25.101
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080, q=2-31, 2076 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 131 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[concat @ 0x3204d60] DTS 92955 < 541117 out of order
[mp4 @ 0x322eb80] Non-monotonous DTS in output stream 0:0; previous: 92351, current: 15864; changing to 92352. This may result in incorrect timestamps in the output file. x 2000
frame= 421 fps=0.0 q=-1.0 Lsize= 13507kB time=00:00:14.07 bitrate=7862.8kbits/s
video:13268kB audio:226kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.096110%
Die nicht monotone DTS-Warnung wird ziemlich oft gedruckt (240-mal), aber DTS bezieht sich auf Audio, und das Audio in der Ausgabedatei klingt bis zum beschnittenen / beschnittenen Teil gut.
Ich habe auch versucht, die Framerate (und Kombinationen mit verschiedenen vsync-Parametern) sowohl im Trimm- / Crop-ffmpeg-Schritt als auch im Concat-Schritt zu ändern, aber sie scheinen nur dann wirklich Wirkung zu haben, wenn ich neu codiere, nicht beim Kopieren von Codeccing.
-
Nachdem ich angefangen hatte, diese zweite Bearbeitung zu schreiben, habe ich seit ein paar Stunden jedes vsync, filter: v fps, framerate, -r-Argument ausprobiert und die einzige Lösung, die bisher funktioniert hat, war, alles mit 60 fps neu zu codieren (auch wenn sie nicht beschnitten werden) und darauf eingehen. Mit -preset ultraschnell und -qp 0 fühlt es sich schnell genug an und die Dateigrößen sind ziemlich groß, aber ich behalte die Dateien trotzdem nicht.
Es scheint also, dass Codec-Kopie ein No-Go ist, wenn mindestens eine beschnittene / skalierte Datei vorhanden ist.
Wenn irgendjemand eine Lösung dafür hat, ohne alles neu codieren zu müssen, nehme ich gerne an, dass ich ansonsten die Prämie an @occvtech überweise.
quelle
Antworten:
Ich hatte ähnliche Probleme mit dem Concat-Filter und ich denke, es liegt an den unterschiedlichen Zeitbasen, die für die Eingänge verwendet wurden.
Ich habe es mit der concat- Protokollmethode überwunden .
Ich denke, es zeigt eine variable Framerate für Ihre reine Trimm-Ausgabe, da bei einer Basiszeit von 1/90000 ein 60-Hz-Video alle 1500 Bilder erwartet, der Concat-Filter jedoch möglicherweise zwei Videos zusammen mit einer Lücke von 1530 Zyklen zwischen dem letzten und dem ersten Bild verschmiert hat Frames (58,824 fps) und an anderer Stelle 1440 (62,500 fps). Aus irgendeinem Grund entschied sich ffmpeg, die Ausgabezeitbasis auf 1/15360 zu setzen.
Beim Zuschneiden wurde die Basiszeit für die gesamte Lauflänge der Ausgabe neu bewertet, weshalb Sie die konstante Framerate erhalten. Beachten Sie, dass Ihr erstes Video eine TBN von 15360 zeigt, während das zweite 90.000 ist.
In meinem Fall habe ich festgestellt, dass mit dem Concat-Filter die PTS / DTS-Werte in Bezug auf die Zeitbasis des ersten Eingangs festgelegt wurden, auch wenn die Zeitbasis für die anderen Eingangsvideoströme nicht identisch war. Wenn das erste Video 1/25 und das zweite 1/90000 verwendet, wird dies auf der Ausgabe ausgeführt (die eine neue Zeitbasis von 1/12800 hatte):
Am Übergangspunkt zwischen den Videos passiert Folgendes:
quelle
Sie können keine Codec-Kopie erstellen, wenn Sie einen Filter anwenden.
Außerdem hat Youtube eine maximale Framerate von 60 fps. Wenn dies Ihr Endziel ist, werden Sie ohnehin an einem bestimmten Punkt in der Transcodierungskette Frames aus Ihrer Datei mit variabler Framerate löschen.
Es ist schwierig, bessere Ratschläge zu geben, ohne genauere Kenntnisse über Ihren Dateityp und das gewünschte Endformat zu haben.
Das heißt, wenn du die Datei auf YouTube erhältst, würde ich empfehlen, deine Dateien zu transkodieren und sie in eine statische Framerate zu bringen. Sie können auch den Verkettungsfilter anstelle des Verkettungsprotokolls in einem Schritt verwenden. Auf diese Weise müssen Sie keine Zwischendateien erstellen.
ffmpeg -i [INPUT1] -i [INPUT2] -filter_complex "[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" ... [OUTPUT]
Wenn Qualität Ihr Hauptziel ist und Sie Ihre zwischengeschalteten Dateien nicht aufbewahren, bevor Sie zu YouTube wechseln, können Sie sie mit in ein unkomprimiertes Format umcodieren
-c:v rawvideo
. Die Dateigrößen werden viel größer sein - also bin ich mir nicht sicher, ob unkomprimiert die beste Option für Sie ist, ohne Ihr Endziel genauer zu kennenquelle