¿Cómo determina el codificador h.264 dónde colocar i-frames?

Estoy leyendo un poco sobre I-frames y sus contrapartes, P-frames y B-frames. Entiendo el uso. Los fotogramas I son la clave para la compresión y los siguientes fotogramas P y B pueden utilizar los datos de los fotogramas I para ahorrar bits.

Sin embargo, lo que me parecería interesante es saber cómo determina el codificador qué fotogramas deben ser fotogramas I y cuáles deben ser P y B y extraer sus datos. ¿Cómo decide el codificador qué fotogramas serán fotogramas I?


Pensamientos secundarios (no tiene que responder, pero estos son interesantes y útiles para mí en el futuro): ¿Son los fotogramas I más fáciles, más rápidos, de encontrar y extraer que extraer cada 30 fotogramas? Si un video es una presentación de diapositivas con audio y sin animaciones de diapositivas, ¿es probable que los fotogramas I coincidan con los cambios de diapositivas? ¿Sería mejor la compresión en un video hecho a partir de imágenes de diapositivas en lugar de las mismas imágenes tomadas a través de una transmisión en tiempo real?

¿Debería haber usado la etiqueta de fotogramas clave ? ¿Debería haber una etiqueta i-frames o debería ser un sinónimo?
Además de la excelente respuesta de @Mulvya, existe el caso de códecs y codificadores más antiguos que colocan fotogramas I a intervalos fijos independientemente de la necesidad. Esta fue la era del 'GOP de longitud fija'.
'fotograma clave' se usa en After Effects y otras aplicaciones de animación para describir un punto en una línea de tiempo donde se establece un valor. 'I-Frame' es más específico
El mismo término se usa dentro del código ffmpeg y x264, y sospecho, la mayoría/todos los demás códecs.

Respuestas (1)

Este es un tema complejo, con el algoritmo exacto único para cada codificador.

A continuación se muestra una explicación del pseudocódigo de un desarrollador x264. Los fotogramas B no se tienen en cuenta, pero la lógica básica debería ser similar.

encode current frame as (a really fast approximation of) a P-frame and an I-frame.

if ((distance from previous keyframe) > keyint) then
    set IDR-frame
else if (1 - (bit size of P-frame) / (bit size of I-frame) < (scenecut / 100) * (distance from previous keyframe) / keyint) then
    if ((distance from previous keyframe) >= minkeyint) then
        set IDR-frame
    else
        set I-frame
else
    set P-frame

encode frame for real.

scenecutes el valor umbral de cambio de escena. 0significa que el cuadro actual es idéntico al cuadro anterior y 100significa que es completamente diferente.

keyintes la distancia máxima permitida entre dos fotogramas clave; minkeyintes el mínimo.

IDRLos fotogramas (actualización instantánea del decodificador) son fotogramas clave tales que ningún fotograma futuro requiere hacer referencia a un fotograma anterior al fotograma IDR para la decodificación. No es necesariamente cierto para I-frames simples.