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 -minrate
y -maxrate
no ayuda. La salida es una velocidad de fotogramas constante a 30 FPS. A continuación se muestran ejemplos de parámetros.
-vsync 2 -r 30 -minrate 29.625 -maxrate 30.405
-vsync 2 -r 30.405
También creo que debería usar -crf
o -qp
, pero no estoy seguro de los valores correctos.
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:
Después de leer la respuesta de Gyan , usé el -video_track_timescale
parámetro para establecer un tbn
valor 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 ffprobe
salida 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
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
Se creó una pregunta sobre la concatenación que no funciona con Avidemux y MKVToolNix aquí .
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 tbn
valor 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.). minrate
y maxrate
fijar la tasa de bits, no la tasa de fotogramas.
Diluvio Antum
30 fps, 30 tbr, 90k tbn, 180k tbc
el video producido por mi teléfono. Usé-video_track_timescale 90k
la opción y se muestra el video de salida29.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. ¿ Tienetbc
que coincidir también?Diluvio Antum
ffprobe
resultado de los dos videos.Diluvio Antum
Diluvio Antum
hashim aziz
concat
demuxer para concatenar dos videos en los que todo coincidía excepto el nivel de códec (y SAR/DAR).gian