Twitch tiene una publicación sobre esto. Explican que decidieron usar su propio programa por varias razones; Una de ellas fue que ffmpeg no le permite ejecutar diferentes instancias x264 en diferentes subprocesos, sino que dedica todos los subprocesos especificados a un cuadro en una salida antes de pasar a la siguiente salida.
Si no estás haciendo streaming en tiempo real, tienes más lujo. La forma 'correcta' es probablemente codificar en una resolución con solo el tamaño de GOP especificado con -g, y luego codificar las otras resoluciones forzando fotogramas clave en los mismos lugares.
Si desea hacer eso, puede usar ffprobe para obtener los tiempos de fotogramas clave y luego usar un script de shell o un lenguaje de programación real para convertirlo en un comando ffmpeg.
Pero para la mayoría del contenido, hay muy poca diferencia entre tener un fotograma clave cada 5 segundos y dos fotogramas clave cada 5 segundos (uno forzado y otro de corte de escena). Esto es aproximadamente el tamaño promedio de I-frame versus el tamaño de P-frames y B-frames. Si usa x264 con configuraciones típicas (la única razón por la que creo que debería hacer algo para afectarlas es si configura -qmin, como una forma pobre de evitar que x264 use bitrate en contenido fácil; esto limita todos los tipos de cuadros al mismo valor , Creo) y obtener un resultado como el tamaño promedio del cuadro I de 46 kB, cuadro P 24 kB, cuadro B 17 kB (la mitad de frecuente que los cuadros P), luego un cuadro I adicional cada segundo a 30 fps es solo un aumento del 3% en el tamaño del archivo La diferencia entre h264 y h263 podría estar compuesta por un montón de disminuciones del 3%, pero una sola no es muy importante.
En otros tipos de contenido, los tamaños de los cuadros serán diferentes. Para ser justos, se trata de la complejidad temporal y no de la complejidad espacial, por lo que no se trata solo de contenido fácil frente a contenido duro. Pero en general, los sitios de transmisión de video tienen un límite de velocidad de bits, y el contenido con fotogramas I relativamente grandes es un contenido fácil que se codificará en alta calidad sin importar cuántos fotogramas clave adicionales se agreguen. Es un desperdicio, pero este desperdicio generalmente no se notará. El caso más derrochador es probablemente un video que es solo una imagen estática que acompaña a una canción, donde cada fotograma clave es exactamente el mismo.
Una cosa de la que no estoy seguro es de cómo los fotogramas clave forzados interactúan con el limitador de velocidad establecido con -maxrate y -bufsize. Creo que incluso YouTube ha tenido problemas recientes al configurar correctamente los ajustes del búfer para brindar una calidad constante. Si solo está utilizando la configuración de velocidad de bits promedio como puede verse en algunos sitios (ya que puede inspeccionar las opciones de x264 en el encabezado / mov atom? Con un editor hexadecimal), entonces el modelo de búfer no es un problema, pero si Al ofrecer contenido generado por el usuario, la tasa de bits promedio alienta a los usuarios a agregar una pantalla en negro al final de su video.
La opción -g de Ffmpeg, o cualquier otra opción de codificador que utilice, se asigna a la opción específica del codificador. Entonces '-x264-params keyint = GOPSIZE' es equivalente a '-g GOPSIZE'.
Un problema con el uso de la detección de escenas es si prefiere fotogramas clave cerca de números específicos por cualquier razón. Si especifica fotogramas clave cada 5 segundos y utiliza la detección de escena, y hay un cambio de escena en 4.5, entonces debería detectarse, pero el siguiente fotograma clave será en 9.5. Si el tiempo se acelera de esta manera, podría terminar con fotogramas clave en 42.5, 47.5, 52.5, etc., en lugar de 40, 45, 50, 55. Por el contrario, si hay un cambio de escena en 5.5, habrá un fotograma clave en 5 y 5.5 será demasiado temprano para otro. Ffmpeg no le permite especificar "hacer un fotograma clave aquí si no hay cambio de escena en los próximos 30 fotogramas". Sin embargo, alguien que entienda C podría agregar esa opción.
Para el video de velocidad de cuadro variable, cuando no está transmitiendo en vivo como Twitch, debería poder usar los cambios de escena sin convertir permanentemente a una velocidad de cuadro constante. Si usa el filtro 'select' en ffmpeg y usa la constante 'escena' en la expresión, entonces la salida de depuración (-v debug o presione '+' varias veces mientras codifica) muestra el número de cambio de escena. Esto es probablemente diferente y no tan útil como el número utilizado por x264, pero aún podría ser útil.
El procedimiento, entonces, probablemente sería hacer un video de prueba que sea solo para cambios de fotogramas clave, pero tal vez podría usarse para datos de control de velocidad si se usa 2 pasos. (No estoy seguro de si los datos generados son útiles para diferentes resoluciones y configuraciones; los datos del árbol de macrobloques no lo serán). Conviértalo a video de velocidad de fotogramas constante, pero vea este error sobre la tartamudez de salida al reducir a la mitad la velocidad de fotogramas si alguna vez decide usar el filtro fps para otros fines. Ejecútelo a través de x264 con el fotograma clave deseado y la configuración de GOP.
Luego, solo use estos tiempos de fotogramas clave con el video original de velocidad de cuadro variable.
Si permite contenido generado por el usuario completamente loco con un espacio de 20 segundos entre fotogramas, entonces para la codificación de velocidad de fotogramas variable, podría dividir la salida, usar el filtro fps, de alguna manera usar el filtro select (tal vez construir una expresión realmente larga que tenga cada tiempo de fotograma clave) ... o tal vez podría usar el video de prueba como entrada y decodificar solo fotogramas clave, si esa opción ffmpeg funciona, o usar el filtro de selección para seleccionar fotogramas clave. Luego escale al tamaño correcto (incluso hay un filtro scale2ref para esto) y superponga el video original en él. Luego use el filtro de intercalación para combinar estos fotogramas clave destinados a ser forzados con el video original. Si esto resulta en dos cuadros separados por 0.001 segundos que el filtro de intercalación no previene, entonces resuelva este problema usted mismo con otro filtro de selección. Tratar con los límites de la memoria intermedia de trama para el filtro intercalado podría ser el principal problema aquí. Todo esto podría funcionar: use algún tipo de filtro para amortiguar el flujo más denso (¿filtro de quince?); consulte el archivo de entrada varias veces para que se decodifique más de una vez y los marcos no tengan que almacenarse; use el filtro 'streamselect', que nunca he hecho, exactamente en el momento de los fotogramas clave; mejorar el filtro de intercalación cambiando su comportamiento predeterminado o agregando una opción para generar el marco más antiguo en un búfer en lugar de soltar un marco. que nunca he hecho, exactamente en los tiempos de los fotogramas clave; mejorar el filtro de intercalación cambiando su comportamiento predeterminado o agregando una opción para generar el marco más antiguo en un búfer en lugar de soltar un marco. que nunca he hecho, exactamente en los tiempos de los fotogramas clave; mejore el filtro de intercalación cambiando su comportamiento predeterminado o agregando una opción para generar el fotograma más antiguo en un búfer en lugar de soltar un fotograma.