Velocidad mínima de fotogramas de trabajo para el códec H264

Al hacer un video a partir de archivos de una sola imagen, mientras que cada archivo de imagen debe estar visible durante aproximadamente un segundo, tiene sentido codificar un video con una velocidad de fotogramas extremadamente baja, como 1 fotograma por segundo. Para este tipo de aplicación, cada velocidad de fotogramas superior a esta sería un desperdicio de recursos.

Me pregunto si el códec H264 (o cualquier implementación específica, como x264) tiene un límite inferior para la velocidad de fotogramas por debajo del cual se producen problemas técnicos o algún tipo de inestabilidad. En caso de que no haya problemas con la codificación, ¿podemos esperar que los reproductores de video manejen adecuadamente una velocidad de cuadros tan inusualmente baja?

¡Gracias por compartir tu experiencia!

Respuestas (4)

Estoy con AJ. A menos que conozca las características de cada jugador que podría ver esto, no sería prudente confiar en una pequeña muestra de los resultados de las pruebas. El uso de una velocidad de fotogramas estándar como 24 fps con un intervalo de fotogramas clave de 24 fotogramas le dará esencialmente lo mismo sin comprometer la compatibilidad. Los cuadros intermedios serán mínimamente pequeños porque no habrá cambios detectables para codificar.

sí, un marco de bits idénticos solo toma alrededor de 15 bytes. Todos los macrobloques = omitir, y CABAC comprime muy bien el patrón de bits repetido.
Sin embargo, solo me preocuparía por los reproductores de hardware que asumen que emitirán una señal de TV de 60 o 50 Hz. h.264 no se preocupa por el tiempo, son solo cuadros, incluso en un video VFR. Las marcas de tiempo del marco son un problema del contenedor. Los formatos de contenedores son muy flexibles. Es posible mostrar fácilmente un solo cuadro durante 1 minuto, luego 150 fps durante varios cuadros, luego mostrar otro cuadro durante un tiempo, o lo que quieras. Almacenar video VFR en mkv, mp4 y algunos otros contenedores modernos es un problema resuelto.

No estoy seguro de cómo se comportará a velocidades de cuadro muy bajas, pero vale la pena señalar que esto también limitaría sus opciones sobre cómo y cuándo podría cambiar los cuadros, ya que tendrían que seguir los ciclos del reloj. Lo que es más probable que funcione en este caso es un intervalo largo de fotogramas clave. La mayoría de los cuadros en una compresión como H.264 solo almacenan los cambios del cuadro anterior. En el caso de una imagen fija, las relaciones de compresión serán enormes porque se produce muy poco (ningún) cambio entre cuadros. No estoy seguro de que realmente obtenga suficientes ahorros al reducir la velocidad de fotogramas para que valga la pena perder el control sobre cuándo puede realizar un cambio en el fotograma.

Lo mejor sería probarlo con sus medios y ver los resultados. La compresión depende en gran medida del contenido y la mejor calidad y compresión para cualquier clip en particular dependerá mucho de la naturaleza de ese clip, por lo que la prueba sigue siendo la mejor manera de probarlo.

Hay una desventaja de compresión más allá de lo que decía mi comentario anterior sobre otra respuesta: si hay mucha redundancia entre las diferentes imágenes (es decir, sigue siendo un video, no una presentación de diapositivas), el relleno con imágenes idénticas hará que sea más difícil para el codificador encontrar y explotar eso. Dependiendo de la configuración de codificación, el codificador solo conservará una cierta cantidad de fotogramas antiguos como posibles referencias para nuevos fotogramas y solo podrá buscar dentro de un GOP (por ejemplo, 250 fotogramas predeterminados para x264). Si todos esos candidatos son la misma imagen, eso no le da múltiples opciones para encontrar una mejor referencia para cada bloque...
... por ejemplo, después de que un objeto de primer plano se mueva frente a algún detalle de fondo, el codificador puede ahorrar bits al hacer referencia a cómo se veía en un marco anterior antes de que se oscureciera. h.264 puede elegir marcos de referencia por bloque. Este es un efecto relativamente pequeño; los buenos codificadores h.264 funcionan bien con solo 1 marco de referencia, pero aún es algo dañino para la eficiencia de compresión
Claro, aún necesita la configuración de codificación adecuada, pero puede aumentar el tamaño de su GOP en lugar de reducir su velocidad de cuadros si las cosas son tan estáticas. Si no lo son, para empezar, reducir la velocidad de fotogramas no es una buena opción. Me pregunto si ha habido algún trabajo en un formato GOP variable.
Creo que las imágenes repetidas todavía van a reducir la oportunidad de una útil pirámide B y múltiples opciones de marcos P de referencia. Pero supongo que un codificador puede mantener un marco P antiguo desde cualquier lugar dentro del GOP, por lo que perder marcos B de referencia es probablemente todo en teoría, pero IDK en la práctica.
¡ La mayoría de los formatos son GOP variables, y cualquier codificador bueno usará eso! El valor predeterminado de x264 es finalizar los GOP de manera oportunista en la detección de cortes de escena, insertando un marco IDR. ( keyint=250es la longitud máxima de GOP. keyint_min=25es el intervalo mínimo, por lo que no insertará otro fotograma clave incluso si cree que ve otro corte de escena; hay opciones de ajuste para el sesgo de corte de escena, etc.) x26 5 incluso tiene un parámetro adicional de anticipación de GOP para extendiendo de manera oportunista un Partido Republicano. x265.readthedocs.io/en/default/cli.html#cmdoption-gop-lookahead . Y, por supuesto, las decisiones de fotogramas B adaptables están activadas de forma predeterminada.
Genial, increíble lo mucho que han avanzado desde la última vez que entré en el verdadero meollo de los codificadores. Mantengo una visión general de alto nivel, pero mi última inmersión profunda extrema fue la era mpeg 2 ... Sin embargo, podría ser el momento de hacer otra inmersión profunda en h265.
Los buenos codificadores MPEG-2 pueden tomar decisiones de fotogramas clave basadas en cortes de escenas y decisiones de fotogramas P vs B basadas en el contenido. El codificador de :P ffmpeg mpeg2videoenumera una -sc_thresholdopción y una -b_strategyopción para controlar la estrategia de selección de I/P/B. Pero de todos modos, h.265 es ordenado, con hasta 32x32 bloques DCT y unidades de predicción muy grandes de 64x64 que pueden dividirse en bloques más pequeños si es necesario. sonnati.wordpress.com/2014/06/20/h265-part-i-technical-overview . frente a macrobloques h.264 16x16 con solo bloques DCT de 4x4 u 8x8 (solo perfil alto). También forum.doom9.org/showthread.php?t=167081

He jugado un poco convirtiendo un montón de fotos fijas en una presentación de diapositivas h.264, principalmente para comparar la eficiencia de compresión de JPG frente a h.264. Recibí algunas respuestas útiles sobre las implicaciones técnicas de esto de los desarrolladores x264 en doom9. Por ejemplo, fuerce a x264 a no usar marcos B para esto, porque las imágenes no muy relacionadas necesitarán muchos macrobloques I, y codificarlos en marcos B es más costoso.

El comportamiento del reproductor de software con video de bajo fps no es ideal, en el pasado. Creo que un jugador mayor solo comprobaba la entrada del teclado cuando mostraba un cuadro. Entonces hubo un retraso entre la entrada del usuario y la respuesta del jugador. mplayer2 y mpv no tienen este problema. Además, los jugadores que solo pueden buscar fotogramas clave buscarán en fragmentos realmente grandes (¡2 minutos más o menos!) si no reduce el intervalo de fotogramas clave. x264 no insertará IDR (límites GOP) por todas partes si las imágenes están relacionadas entre sí.

uso x264 -tune stillimage_ Aumenta las optimizaciones de psy , porque la estabilidad temporal no es un problema para este caso de uso. Más resultados de búsqueda: de google .

Estoy de acuerdo con otras sugerencias de tener algunos marcos duplicados, para aumentar el FPS a al menos 5 o algo así, en caso de malos jugadores. Sin embargo, los teléfonos inteligentes / tabletas no deberían tener problemas para reproducir videos de FPS variable, ya que generalmente graban de esa manera cuando los niveles de luz bajan. Dado que los videos de FPS variable de los teléfonos ahora están disponibles, se debe esperar la compatibilidad con el reproductor de hardware para ellos. No esperaría problemas, pero tampoco me sorprendería si al menos hay algunos reproductores de hardware antiguos que no lo manejan bien.

Un marco de todos los macrobloques de "salto" solo toma alrededor de 20 bytes a 1080p, IIRC. Sin embargo, una de las razones por las que no me gustan los cuadros duplicados es que interfiere con un solo paso para pasar las imágenes manualmente.


Sin embargo, hay una desventaja de compresión en la duplicación de cuadros : si hay mucha redundancia entre las diferentes imágenes (es decir, sigue siendo un video, no una presentación de diapositivas), el relleno con imágenes idénticas hará que sea más difícil para el codificador encontrarlo y explotarlo.

Según la configuración de codificación, el codificador solo conservará una cierta cantidad de fotogramas antiguos como posibles referencias para fotogramas nuevos y solo podrá buscar dentro de un GOP (por ejemplo, 250 fotogramas predeterminados para x264). Si todos esos candidatos son la misma imagen, eso no le da múltiples opciones para encontrar una mejor referencia para cada bloque.

Por ejemplo, después de que un objeto de primer plano se mueva frente a algún detalle de fondo, el codificador puede ahorrar bits haciendo referencia a cómo se veía en un marco anterior antes de que se oscureciera. h.264 puede elegir marcos de referencia por bloque. Este es un efecto relativamente pequeño; los buenos codificadores h.264 funcionan bien con solo 1 marco de referencia, pero aún es algo dañino para la eficiencia de compresión y una pérdida de energía / vida útil de la batería / tiempo de CPU en el lado de la descompresión para copiar la memoria alrededor de la decodificación y mostrar marcos adicionales.


La recuperación de VFR después de un NLE obliga a todos sus clips a una velocidad de fotogramas alta:

FFmpeg tiene un mpdecimatefiltro que descarta fotogramas similares. Puede establecer límites sobre la cantidad de fotogramas seguidos que puede soltar. Con un umbral de similitud ajustado, debe hacer que solo elimine los duplicados reales.

por ejemplo ffmpeg -i input.mp4 -vf mpdecimate=max=9:hi=400 -c:a copy -c:v libx264 -preset veryslow -tune film output_vfr.mkv, cae hasta 9 fotogramas seguidos, y solo si el bloque más diferente era diferente en "400" y (predeterminado): no más del 33% de los bloques eran diferentes en "320" unidades. IIRC, es básicamente un SAD de 8x8 en componentes de píxeles.

(Sin embargo, FFmpeg tiene como valor predeterminado CFR para .mp4las salidas, así que utilícelo para la salida -vsync 2de velocidad de fotogramas variable.mp4 . Creo que es seguro: Problemas con la velocidad de fotogramas en la conversión de video usando ffmpeg con libx264 )

La mayoría de los NLE le permitirán importar una imagen fija en la forma de cuánto tiempo desea que aparezca en la línea de tiempo, suponiendo que haya establecido las propiedades del proyecto en alguna velocidad de cuadro estándar, como 30 fps o 24 fps, etc.

En Vegas Pro, puedo configurar el tiempo que debe aparecer una imagen fija en la línea de tiempo, desde una fracción de segundo hasta varios segundos. Si configuro esto en 1 segundo, cuando arrastre y suelte una imagen fija en la línea de tiempo, Vegas generará suficientes fotogramas para satisfacer mi solicitud. Usualmente edito con videos de 30 fps, y cuando agrego una imagen fija, estoy mezclando una línea de tiempo con un video de 30 fps que ya está allí (AVCHD 1080p).

Para darle una respuesta específica, necesitaría saber qué NLE está usando.

Solo aplico un software de codificación sin procesar como ffmpego avconv, por lo que no es necesario hablar sobre ningún NLE. Creo que la pregunta se responde prácticamente con "Simplemente siga una velocidad de fotogramas estándar que todos los jugadores puedan manejar correctamente. No hay un 'desperdicio de recursos' real, porque el esquema de codificación es lo suficientemente bueno como para tratar de manera eficiente con imágenes fijas".