Ich möchte ein Video codieren, das mit Videos kompatibel ist, die mit meinem Telefon erstellt wurden. Auf diese Weise kann ich das neue Video mit dem Original muxen, ohne das Originalvideo neu zu codieren. Ich verwende FFmpeg mit dem libx264 Encoder. Im Folgenden sind die MediaInfo- Spezifikationen des Originalvideos aufgeführt, das von meinem Telefon erstellt wurde:
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Baseline@L3.1
Format settings : 1 Ref Frames
Format settings, CABAC : No
Format settings, Reference frames : 1 frame
Format settings, GOP : M=1, N=30
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 52 s 369 ms
Bit rate : 10.0 Mb/s
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Variable
Frame rate : 30.000 FPS
Minimum frame rate : 29.625 FPS
Maximum frame rate : 30.405 FPS
Standard : NTSC
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.362
Stream size : 62.4 MiB (98%)
Title : VideoHandle
Language : English
Encoded date : UTC 2020-10-27 19:43:55
Tagged date : UTC 2020-10-27 19:43:55
Color range : Limited
Color primaries : BT.709
Transfer characteristics : BT.709
transfer_characteristics_Original : BT.601
Matrix coefficients : BT.709
mdhd_Duration : 52369
Codec configuration box : avcC
Bisher habe ich Folgendes herausgefunden, was mich meiner Meinung nach nahe gebracht hat:
ffmpeg -i in.mp4 -c:v libx264 -profile:v baseline -level:v 3.1 -refs 1 \
-vsync 2 -filter:v scale="-1:720",pad="1280:720:720/2+ow/2",format="yuv420p" \
-x264-params keyint="30":scenecut="0" -c:a copy out.mp4
Ich habe Probleme beim Einstellen der Framerate. Es sollte bei 30 fps variabel sein. Ich habe diese Frage in Bezug auf die variable Bildrate gefunden. Aber es hat keine Antwort. Einstellung -minrate
& -maxrate
hilft nicht. Die Ausgabe ist eine konstante Bildrate bei 30 FPS. Es folgen Parameterbeispiele.
-vsync 2 -r 30 -minrate 29.625 -maxrate 30.405
-vsync 2 -r 30.405
-crf
Ich glaube auch, dass ich or verwenden sollte -qp
, bin mir aber nicht sicher, welche Werte korrekt sind.
Der oben gezeigte Befehl führt zu den folgenden Spezifikationen:
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Baseline@L3.1
Format settings : 1 Ref Frames
Format settings, CABAC : No
Format settings, Reference frames : 1 frame
Format settings, GOP : M=1, N=30
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 8 s 700 ms
Duration_FirstFrame : 33 ms
Bit rate : 2 606 kb/s
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 30.000 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.094
Stream size : 2.69 MiB (95%)
Title : VideoHandle
Writing library : x264 core 160
Encoding settings : cabac=0 / ref=1 / deblock=1:0:0 / analyse=0x1:0x111 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=6 / lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=30 / keyint_min=3 / scenecut=0 / intra_refresh=0 / rc_lookahead=30 / rc=crf / mbtree=1 / crf=23.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
Language : English
Codec configuration box : avcC
Wird hier noch etwas gezeigt, das nicht mit dem Originalvideo kompatibel ist?
Quellen, die mir geholfen haben:
Nachdem ich Gyans Antwort gelesen hatte , habe ich den -video_track_timescale
Parameter verwendet, um einen Wert festzulegen tbn
, der dem Originalvideo entspricht. Aber das verkettete Video wird immer noch nicht richtig angezeigt. Habe ich etwas übersehen, das zusammenpassen sollte? Ich schaue mir ffprobe
jetzt die Ausgabe an.
Originalvideo:
$ ffprobe -hide_banner -i VID_20201027_124301.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'VID_20201027_124301.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2020-10-27T19:43:55.000000Z
location : +42.5418-122.5700/
location-eng : +42.5418-122.5700/
com.android.version: 7.1.2
Duration: 00:00:52.40, start: 0.000000, bitrate: 10187 kb/s
Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/smpte170m), 1280x720, 10002 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
creation_time : 2020-10-27T19:43:55.000000Z
handler_name : VideoHandle
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
creation_time : 2020-10-27T19:43:55.000000Z
handler_name : SoundHandle
FFmpeg-kodiertes Video:
$ ffprobe -hide_banner -i VID_20201027_124914-encoded.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'VID_20201027_124914-encoded.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Duration: 00:00:08.70, start: 0.000000, bitrate: 2732 kb/s
Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 2596 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandle
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandle
Habe weitere Tests durchgeführt und festgestellt, dass es funktioniert, wenn ich das Video mit FFmpeg verkette. Aber wenn ich mit einem anderen Muxer wie Avidemux oder MKVToolNix verkette , ist dies nicht der Fall. Ich denke, diese Frage wurde von Gyan beantwortet, aber ich werde sie noch ein wenig offen lassen, um zu sehen, ob es irgendwelche Eingaben gibt, warum das Video nicht mit den anderen Muxern funktioniert, da ich diese lieber verwende.
Ultimative verwendete ffmpeg-Parameter:
ffmpeg -i in.mp4 -c:v libx264 -profile:v baseline -level:v 3.1 \
-refs 1 -r 30 -video_track_timescale 90k \
-filter:v scale="-1:720",pad="1280:720:720/2+ow/2",format="yuv420p" \
-x264-params keyint="30":scenecut="0" -c:a copy out.mp4
die Keyint- und Scenecut -Parameter von -x264-Params und Framerate sind nicht erforderlich
Hier wurde eine Frage zur nicht funktionierenden Verkettung mit Avidemux & MKVToolNix erstellt .
Um mehrere Dateien für die erwartete Wiedergabe in gängigen Playern zu verketten, müssen die folgenden Eigenschaften übereinstimmen
Video: Codec, Codec-Profil, Codec-Level, Auflösung, Referenzanzahl, Pixelformat, Zeitbasis /Zeitskala.
Audio: Codec, Codec-Profil, Kanalanzahl und -layout, Abtastformat und Abtastrate.
Fortgeschrittene Spieler können Mid-Stream-Änderungen einiger der oben genannten Parameter tolerieren.
Mediainfo zeigt Ihnen keine Zeitskala an, es ist der tbn
Wert, der von ffmpeg für den Stream angezeigt wird. Frameraten müssen für einen gegebenen konstituierenden Strom weder übereinstimmen noch konstant sein. GOP-Größe oder Keyframe-Kadenz müssen nicht übereinstimmen. Weder müssen der Bitratenwert noch der Modus (CRF, VBR usw.) übereinstimmen. minrate
und maxrate
Klemmbitrate, nicht Framerate.
AntumSintflut
30 fps, 30 tbr, 90k tbn, 180k tbc
für das von meinem Telefon produzierte Video. Ich habe-video_track_timescale 90k
die Option verwendet und das Ausgabevideo zeigt29.89 fps, 30 tbr, 90k tbn, 60 tbc
. Aber verkettete Videos werden in VLC oder MPlayer immer noch nicht korrekt angezeigt. Alles andere, was Sie skizziert haben, passt. Musstbc
auch passen?AntumSintflut
ffprobe
Ich habe meine Frage aktualisiert, um die Ausgabe der beiden Videos anzuzeigen .AntumSintflut
AntumSintflut
Hashim Aziz
concat
Demuxer verwenden, um zwei Videos zu konkatieren, für die alles übereinstimmte, mit Ausnahme des Codec-Levels (und SAR / DAR).Gyan