FFMPEG / libx264: ¿Cómo especificar una velocidad de cuadro variable pero con un máximo?


16

En lugar de proporcionar una velocidad de cuadro fija a FFMPEG / libx264 (-r / -framerate), me gustaría especificar una velocidad de cuadro variable con un valor MÁXIMO, y permitir que libx264 reduzca la velocidad de cuadro como mejor le parezca. La idea aquí es obtener una compresión adicional cuando hay algo como un fotograma extendido (que sucede MUCHO en mis videos fuente).

Me doy cuenta de que un cuadro MPEG predictivo o bidireccional se comprimirá muy bien, pero también es posible que la velocidad de fotogramas de origen sea menor a la que pretendo transcodificar (¡posiblemente resultando en un flujo MÁS GRANDE!).


1
¿Dónde (o cómo) le dice a x264 que use VFR?
slhck

Esa es mi pregunta
Mark Gerolimatos

2
Su pregunta era cómo especificar VFR con un máximo . Ni siquiera conozco ninguna forma de especificar la codificación VFR, usando x264. (Tampoco estoy hablando de ffmpeg en este momento, porque es otra capa entre su fuente y x264.)
slhck

@ MarkGerolimatos ¿Encontraste tu respuesta?
Dr.jacky

No, nunca lo hice.
Mark Gerolimatos

Respuestas:


19

Frustrado porque tampoco había encontrado una respuesta, al menos iba a responder las preguntas de otras personas sobre cómo habilitar la salida VFR (no V B R) de FFMPEG.

La respuesta a eso es la -vsyncopción con un nombre extraño . Puede configurarlo con algunas opciones diferentes, pero la que desea es '2' o vfr. Desde la página del manual:

-vsync parámetro
Método de sincronización de video. Por razones de compatibilidad, los valores antiguos se pueden especificar como números. Los valores recién agregados deberán especificarse siempre como cadenas.

  • 0, paso a través

    • Cada fotograma se pasa con su marca de tiempo desde el demuxer al muxer.
  • 1, cfr

    • Los fotogramas se duplicarán y soltarán para lograr exactamente la velocidad de fotogramas constante solicitada.
  • 2, vfr

    • Los cuadros se pasan con su marca de tiempo o se caen para evitar que 2 cuadros tengan la misma marca de tiempo.
  • soltar

    • Como traspaso pero destruye todas las marcas de tiempo, haciendo que el silenciador genere nuevas marcas de tiempo basadas en la velocidad de cuadros.
  • -1, auto

    • Elige entre 1 y 2 dependiendo de las capacidades de muxer. Este es el método por defecto.

Tenga en cuenta que las marcas de tiempo pueden ser modificadas por el muxer, después de esto. Por ejemplo, en el caso de que la opción de formato evitar_negativos_ts esté habilitada.

Con -map puede seleccionar de qué transmisión deben tomarse las marcas de tiempo. Puede dejar el video o el audio sin cambios y sincronizar las transmisiones restantes con las sin cambios.

Sin embargo, no tengo suficiente reputación como para publicar un comentario para responder a esa 'subpregunta' que todo el mundo parece estar teniendo. Pero tenía algunas ideas sobre las que sinceramente no era muy optimista ... Pero la primera que probé realmente funcionó . Entonces.

¡Simplemente necesita combinar la -vsync 2opción con la -r $maxfpsopción, por supuesto, donde la reemplace $maxfpscon la velocidad de fotogramas máxima que desea! ¡Y funciona! ¡No duplica fotogramas de un archivo fuente, pero dejará caer fotogramas que harán que el archivo supere la velocidad de fotogramas máxima!

Por defecto, parece que -r $maxfpspor sí solo hace que duplique / suelte fotogramas para lograr una velocidad de fotogramas constante, y -vsync 2por sí mismo hace que tire de los fotogramas directamente sin afectar realmente los valores de PTS.

No era optimista sobre esto porque ya sabía que eso lo -r $maxfpscoloca a una velocidad de fotogramas constante. Sinceramente, esperaba un error o que simplemente obedeciera lo que ocurriera primero o último o lo que sea. El hecho de que hace exactamente lo que quería me satisface bastante con los desarrolladores de FFMPEG.

Espero que esto te ayude a ti oa alguien más más adelante si ya no necesitas saber esto.


3
-copytspuede ser útil también
rogerdpack

1

Me gustaría especificar una velocidad de cuadros variable con un valor MÁXIMO, y permitir que libx264 reduzca la velocidad de cuadros como mejor le parezca. La idea aquí es obtener una compresión adicional cuando hay algo así como un marco fijo extendido

En mi opinión, esto puede ser posiblemente de una manera relativamente torpe, pero no es deseable por algunas razones complejas y contrarias a la intuición.

Aunque una transmisión x264 tiene una o más velocidades de fotogramas, la velocidad de fotogramas es más un problema de nivel de contenedor que un códec.

En una codificación VFR passthrough, habrá esencialmente un archivo de texto que detalla cuál es la velocidad de cuadros sobre qué cuadros / tiempos, y al codificar una fuente, una función como tcfile-in o tcfile-out pasa las marcas de tiempo a la codificación , para mapear las ubicaciones de tarifas y mantener el video subjetivamente consistente desde la fuente.

La idea de baja velocidad de fotogramas es lógica, pero no funciona por varias razones. Aunque x264 es compatible con VFR con algunas capacidades, no creo que haya una función de análisis que varíe la velocidad de fotogramas con respecto al movimiento para reducir el tamaño del archivo (de una manera análoga a los muchos controles de velocidad de bits).

La fuente también es un problema: las fuentes VFR conservarán por defecto su variabilidad de trama, pero aparentemente codificar un archivo CFR a una tasa de bits variable (una buena idea a veces, especialmente cuando se necesita telecine) simplemente producirá el mismo CFR.

Esto significa que probablemente tendría que volver a escribir la tasa de bits a mano (es decir, marcas de tiempo de escenas lentas mezcladas en el archivo), o recurrir a un algoritmo de decimación de cuadros como dup, dedup y exactDedup para avisynth . Si su video tiene un movimiento extremadamente bajo, algunos cuadros (¿incluso la mitad?) Se eliminarán. El problema es que estos algoritmos no son avanzados y no toman buenas decisiones con imágenes de la "vida real" en cuanto a qué contribuirá a la mejor codificación.

Además, la eliminación de cuadros que contienen elementos como los cuadros I y B reduce la cantidad de detalles disponibles con el tiempo, lo que hace que el movimiento se vea "escalonado" y puede interferir con los otros parámetros básicos de video y causar artefactos como el alias.

Y debido a la forma en que funcionan los cuantificadores, x264 en realidad disminuirá la tasa de bits de manera desproporcionada en estas escenas de movimiento bajo. A menos que tenga una presentación de diapositivas de imágenes idénticas, habrá movimiento (aunque solo sea grano y otros artefactos) y habrá una pérdida de calidad que no se vería sin cambios drásticos en la tasa de bits.

Y, por último, la razón por la que no hay muchas opciones para hacer lo que desea es que x264 es realmente bueno en la gestión de la tasa de bits simplemente usando la compresión temporal (grabación de cambios en fotogramas parciales). Ir a 1/2 framerate no reducirá el tamaño del archivo a la mitad; El 10% es probablemente una ganancia realista para esperar de movimiento bajo o animación.

En resumen, dejar caer la tasa de bits de sus escenas estáticas hará muy poco para el tamaño de su archivo, pero agregará una gran cantidad de problemas de calidad y sincronización, sin mencionar la incompatibilidad con el software de edición de video.

Si desea probar un decimador, puede limitar la velocidad máxima de fotogramas nuevos utilizando las opciones de niveles , cada una de las cuales tiene una resolución y velocidad de fotogramas máximas. Desafortunadamente, es probable que tenga que trabajar a resoluciones muy bajas para obtener el tipo de velocidad de fotogramas que desea, utilizando perfiles. Vuelve a editar las velocidades a mano, ya sea completamente o para corregir las velocidades de fotogramas que crees que son demasiado altas. De cualquier manera, será necesario hacer malabarismos para mantener el sonido sincronizado con las nuevas velocidades de cuadros si se realizan modificaciones después del proceso de codificación cuando se conserva el archivo tc.

La conclusión es que pasar tiempo optimizando las muchas configuraciones de velocidad de bits producirá mucho más en cuanto a la gestión del tamaño de archivo y mejorará la calidad de su video, en lugar de causar complicaciones con poca ganancia. Preservar el FPS original es probablemente la mejor idea a menos que esté buscando estándares de transmisión o medios. Los reproductores son capaces de reproducir velocidades de bits variables (a diferencia de los editores), y cuantos más cuadros haya en su video, más suave será la reproducción y quizás más pequeño el tamaño del archivo, debido a los pequeños cambios en el movimiento entre cuadros.

Aquí hay una colección de enlaces a información sobre estándares y debates en foros que deberían ayudar con este aspecto confuso de la codificación:

- herramientas de decimación avisynth

- conmutadores fps y -r
- x264 General (tcfile, fps)
- estándares de archivo de código de tiempo
- Niveles y perfiles
- Resumen breve y claro de configuración CFR / VFR (sección "framerate")

doom9, videohelp, & c debates teóricos
1 2 3 4 5 6 7

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.