Neucodierung in FFMPEG mit genau den gleichen Einstellungen wie die Eingabedatei


4

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                 : Main@L4.1
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 Predictive@L3.2
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.


Sie sollten die vollständige Konsolenausgabe von jedem Befehl anzeigen.
Logan

Die Ausgabe wurde hinzugefügt!
Rohan

Ich weiß wesentlich weniger darüber als Sie, aber Sie finden das vielleicht interessant: rainnic.altervista.org/content/… .
Joe

Es gibt verschiedene Möglichkeiten, FFmpeg zu verketten. Ich vermute, dass Sie das verkettete Protokoll verwenden, da Sie Codec-Kopie verwenden, aber es würde helfen, sicher zu wissen. Können Sie bitte auch den Befehl und die Konsole für diesen Prozess angeben? Angenommen, Sie verwenden das Protokoll. Ich halte Ihre Einschätzung für richtig, dass FFmpeg Probleme beim Umschalten von variabler Framerate auf konstante Framerate hat. Das heißt, wenn Ihr Endziel das Hochladen auf Youtube ist, beträgt die maximale Bildrate 60 Bilder pro Sekunde. Alles, was darüber liegt, lässt Frames fallen und reduziert sich trotzdem auf 60 fps. Warum also nicht einfach die Framerate innerhalb von FFmpeg ändern?
Occvtech

Vielleicht möchten Sie eine Antwort auf @occvtech aufschreiben, damit ich das Kopfgeld zuschreibe.
Rohan

Antworten:


3

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):

ffprobe -hide_banner -show_frames -i output.mp4 2>&1 | grep -A 21 video | grep ts=

Am Übergangspunkt zwischen den Videos passiert Folgendes:

pkt_pts=253952
pkt_dts=253952
pkt_pts=254464
pkt_dts=254464
pkt_pts=254976
pkt_dts=254976
pkt_pts=255488
pkt_dts=255488
pkt_pts=256000
pkt_dts=923443200
pkt_pts=925286400
pkt_dts=925286400
pkt_pts=923443200
pkt_dts=1045094400
pkt_pts=952934400
pkt_dts=1046937600
pkt_pts=954777600
pkt_dts=1048780800
pkt_pts=956620800
pkt_dts=1050624000

Sie hatten die ganze Zeit recht!
Rohan,

1

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 kennen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.