¿Cómo forzar que el primer fotograma sea un fotograma clave?

¿Cómo forzar que el primer fotograma sea un fotograma clave?

Quiero codificar después de buscar una posición determinada y quiero convertir el primer fotograma en un fotograma clave. Este es el comando que utilicé:

ffmpeg -ss 300  -i howimet.mp4 -acodec libfaac -ar 48000 -ab 128k -ac 2  -vcodec libx264 -vf "scale=480:270" -f mpegts -force_key_frames 300 -t 120 howimet2.ts

-force_key_frames está configurado para buscar la posición para crear un fotograma clave allí. Utilizo el siguiente script (deaquí) para comprobar si el primer fotograma es un fotograma clave

ffprobe -show_frames -v quiet howimet2.ts | awk -F= '   /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } 
  /pkt_pts_time/ { if (i && ($2 >= 0)) print $2; }  
' | head -n 1

El resultado muestra que el primer fotograma clave no está ubicado en el segundo 0.

Supongo que mi comando no es correcto. ¿Qué me estoy perdiendo?

Respuesta1

Al codificar vídeo, el primer fotogramatieneser un fotograma clave. Será el primero completamente codificado y los fotogramas posteriores podrán utilizarlo para la predicción entre fotogramas. Además, al comienzo de la secuencia de video codificada, tendrá una unidad de acceso H.264 que le indica al decodificador que se actualice.

Entonces, independientemente de lo que esté haciendo: a menos que simplemente copie el flujo de bits, estará recodificando el video y su primer fotograma tiene que ser un fotograma clave.

Ahora, por alguna razón, tu transmisión tiene un desplazamiento en su hora de inicio. Esto significa que todas las marcas de tiempo de presentación también se desplazan según este desplazamiento. Si inspecciona el encabezado de la ffprobe -show_framessalida, verá que el fotograma 0 será de hecho un fotograma clave, pero con un PTS diferente.

Para compensar esto, puedes restar la hora de inicio de todos los PTS.

Respuesta2

Como se mencionó, el primer cuadro de su video debe ser un I-Frame. Su problema no proviene de la codificación (o copia si ese es su gusto) sino de la decodificación. Tener -ss antes de la entrada es inexacto, por lo que ffmpeg está haciendo lo mejor que puede para llevarlo a donde desea. Ffmpeg pasó esa ubicación y, por lo tanto, le indica una primera marca de tiempo distinta de cero.

Recomendaría probar un segundo -ss después de -i. En la línea -ss 299 -i input -ss 1.

Esto dice: vaya a la ubicación que deseaba, luego decodifique durante 1 segundo antes de procesar. No estoy seguro de si esto solucionará su problema de pts, pero espero que lo lleve en la dirección correcta.

Para señalar, no creo que el comando force_key_frames esté haciendo lo que usted cree. Si está haciendo algo, probablemente solo le diga que agregue un fotograma clave en la salida cada 300 segundos, pero eso es solo una suposición. Lo que significa que solo el primer fotograma de su salida sería un fotograma clave (t=120).

https://ffmpeg.org/ffmpeg.html

Respuesta3

Establezca el tamaño del GOP con "-g"

Sólo para demostrar precisión, aquí hay segmentos de 1 segundo.

ffmpeg -i  in.mkv -g 30  -hls_time 1 -hls_list_size 0 index.m3u8

Así es como se ve el m3u8:

    #EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:1.001000,
index0.ts
#EXTINF:1.001000,
index1.ts
#EXTINF:1.001000,
index2.ts
#EXTINF:1.001000,
index3.ts
#EXTINF:1.001000,
index4.ts
#EXTINF:1.001000,
index5.ts
#EXTINF:1.001000,
index6.ts
#EXTINF:1.001000,
index7.ts
#EXTINF:1.001000,
index8.ts
#EXTINF:1.001000,
index9.ts
#EXTINF:1.001000,
index10.ts
#EXTINF:1.001000,
index11.ts
#EXTINF:1.001000,
index12.ts
#EXTINF:1.001000,
index13.ts
#EXTINF:1.001000,
....

información relacionada