So erstellen Sie ein kompatibles AVC-Video zum Muxen ohne Neucodierung

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& -maxratehilft nicht. Die Ausgabe ist eine konstante Bildrate bei 30 FPS. Es folgen Parameterbeispiele.

  • Gibt konstante Rate bei 30 fps aus:
    -vsync 2 -r 30 -minrate 29.625 -maxrate 30.405
    
  • Gibt variable Rate @ 29.970 aus:
    -vsync 2 -r 30.405
    

-crfIch glaube auch, dass ich or verwenden sollte -qp, bin mir aber nicht sicher, welche Werte korrekt sind.

Bearbeiten:

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:

Bearbeiten (6.11.2020 23:40 UTC):

Nachdem ich Gyans Antwort gelesen hatte , habe ich den -video_track_timescaleParameter 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 ffprobejetzt 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

Bearbeiten (7.11.2020 00:05 UTC):

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

Bearbeiten:

Hier wurde eine Frage zur nicht funktionierenden Verkettung mit Avidemux & MKVToolNix erstellt .

Antworten (1)

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 tbnWert, 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. minrateund maxrateKlemmbitrate, nicht Framerate.

Okay, ffmpeg-Shows 30 fps, 30 tbr, 90k tbn, 180k tbcfür das von meinem Telefon produzierte Video. Ich habe -video_track_timescale 90kdie Option verwendet und das Ausgabevideo zeigt 29.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. Muss tbcauch passen?
ffprobeIch habe meine Frage aktualisiert, um die Ausgabe der beiden Videos anzuzeigen .
Neue Info: Nachdem Sie Ihrer Antwort gefolgt sind, funktioniert das Verketten mit FFmpeg. Danke schön. Wenn ich jedoch ein anderes Dienstprogramm zum Muxen verwende, z. B. Avidemux oder MKVToolNix , wird das verkettete Video nicht korrekt angezeigt. Irgendeine Idee, woran das liegen könnte?
Stimmt der Codec-Level noch? Ich konnte den concatDemuxer verwenden, um zwei Videos zu konkatieren, für die alles übereinstimmte, mit Ausnahme des Codec-Levels (und SAR / DAR).
Streng genommen sollten Level und Profil weiterer Dateien die der ersten Datei nicht überschreiten, um Fehler bei hardwarebeschränkten Decodern zu vermeiden.