Cómo crear video AVC compatible para muxing sin volver a codificar

Quiero codificar un video que sea compatible con los videos creados por mi teléfono. De esa manera puedo mezclar el nuevo video con el original sin volver a codificar el video original. Uso FFmpeg con el codificador libx264 . Las siguientes son las especificaciones de MediaInfo del video original creado por mi teléfono:

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

Hasta ahora, he descubierto lo siguiente, que creo que me ha acercado:

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

Tengo problemas para configurar la velocidad de fotogramas. Debe ser variable a 30 fps. Encontré esta pregunta con respecto a la velocidad de fotogramas variable. Pero no tiene respuesta. Configuración -minratey -maxrateno ayuda. La salida es una velocidad de fotogramas constante a 30 FPS. A continuación se muestran ejemplos de parámetros.

  • Emite tasa constante a 30 fps:
    -vsync 2 -r 30 -minrate 29.625 -maxrate 30.405
    
  • Salidas tasa variable @ 29.970:
    -vsync 2 -r 30.405
    

También creo que debería usar -crfo -qp, pero no estoy seguro de los valores correctos.

Editar:

El comando que se muestra arriba da como resultado las siguientes especificaciones:

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

¿Hay algo más que se muestra aquí que no sea compatible con el video original?


Fuentes que me ayudaron:

Editar (2020-11-6 23:40 UTC):

Después de leer la respuesta de Gyan , usé el -video_track_timescaleparámetro para establecer un tbnvalor que coincidiera con el video original. Pero el video concatenado aún no se muestra correctamente. ¿Me perdí algo que debería coincidir? Estoy mirando la ffprobesalida ahora.

Vídeo original:

$ 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

Vídeo codificado en FFmpeg:

$ 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

Editar (2020-11-7 00:05 UTC):

Hice algunas pruebas más y descubrí que cuando concateno el video usando FFmpeg, funciona. Pero si concateno usando un muxer diferente, como Avidemux o MKVToolNix , no lo hace. Creo que esta pregunta ha sido respondida por Gyan, pero la mantendré abierta un poco más para ver si hay alguna información sobre por qué el video no funciona con los otros muxers, ya que prefiero usarlos.

Últimos parámetros de ffmpeg utilizados:

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

los parámetros keyint y scenecut de -x264-params y framerate no son necesarios

Editar:

Se creó una pregunta sobre la concatenación que no funciona con Avidemux y MKVToolNix aquí .

Respuestas (1)

Para concatenar varios archivos para la reproducción esperada en reproductores comunes, las siguientes propiedades deben coincidir para

video: códec, perfil de códec, nivel de códec, resolución, número de referencias, formato de píxel, base de tiempo /escala de tiempo.
audio: códec, perfil de códec, recuento y diseño de canales, formato de muestra y frecuencia de muestreo.

Los jugadores avanzados pueden tolerar cambios a mitad de camino en algunos de los parámetros anteriores.

Mediainfo no le mostrará la escala de tiempo, es el tbnvalor que muestra ffmpeg para la transmisión. No es necesario que las tasas de fotogramas coincidan ni sean constantes para ningún flujo constituyente dado. El tamaño de GOP o la cadencia de fotogramas clave no tienen por qué coincidir. Tampoco es necesario que coincidan el valor de la tasa de bits o el modo (CRF, VBR, etc.). minratey maxratefijar la tasa de bits, no la tasa de fotogramas.

Bien, ffmpeg muestra 30 fps, 30 tbr, 90k tbn, 180k tbcel video producido por mi teléfono. Usé -video_track_timescale 90kla opción y se muestra el video de salida 29.89 fps, 30 tbr, 90k tbn, 60 tbc. Pero el video concatenado aún no se muestra correctamente en VLC ni en MPlayer. Todo lo demás que describiste coincide. ¿ Tiene tbcque coincidir también?
Actualicé mi pregunta para mostrar el ffproberesultado de los dos videos.
Nueva información: después de seguir su respuesta, la concatenación con FFmpeg funciona. Gracias. Sin embargo, si uso una utilidad diferente para mux, como Avidemux o MKVToolNix , el video concatenado no se muestra correctamente. ¿Alguna idea de por qué puede ser esto?
¿El nivel de códec sigue siendo cierto? Pude usar el concatdemuxer para concatenar dos videos en los que todo coincidía excepto el nivel de códec (y SAR/DAR).
Estrictamente hablando, para evitar fallas con los decodificadores restringidos por hardware, el nivel y el perfil de los archivos adicionales no deben exceder los del primer archivo.