Cómo especificar la configuración de calidad CRF para diferentes programas de codificación

¿Hay alguna forma de especificar una configuración de calidad para h.264 que no dependa del software?

Estoy tratando de ayudar a un colega a crear una especificación para contratistas externos cuando nos entregan videos para usarlos en nuestro sitio web como archivos mp4 comprimidos con h.264. Podemos especificar una tasa de bits, pero eso no funciona tan bien si queremos una compresión de tasa de bits variable/calidad constante (CRF).

Si supiera que usarían libx264 para hacer la compresión, podría darles un rango para la -crfconfiguración, pero usarán todo tipo de software para hacer la compresión. Entonces, ¿cómo especifico la calidad, excepto diciendo algo vago como "visualmente sin pérdidas" o "buena calidad"?

Para VBR, ¿no puede especificar tanto la tasa de bits promedio como el nivel de calidad (esencialmente, la tasa de bits mínima)? Si tiene que cumplir con un objetivo específico, es posible que deba usar CBR.
Eso será un desafío porque no todos los codificadores son iguales, e incluso los "profesionales de video" no siempre saben lo que están haciendo, por lo que sus resultados probablemente variarán enormemente. ¿Puede requerir un formato intermedio sin pérdida (o con pérdida de calidad aceptable) y puede volver a codificar según sus especificaciones?
Eso es lo que he estado sugiriendo. Nunca he tenido que contactar a un contratista para que me proporcione un mp4 porque solo tengo un maestro ProRes, pero lo contrario es bastante común.
Pero solo como un ejercicio académico, ¿sería suficiente especificar un perfil + nivel? Usualmente codifico el perfil principal para compatibilidad, ¿podría especificar el nivel 3 o superior?
Depende de los dispositivos que desee admitir si el video va directamente del contratista al cliente, y se pueden encontrar límites de nivel según el nivel elegido y los parámetros de salida (Ejemplo. Consulte las advertencias en: ffmpeg -f lavfi -i testsrc=s=hd720:d=5,format=yuv420p -c:v libx264 -level 3 output.mp4)
Solo uso explícitamente el perfil y el nivel si el dispositivo de reproducción lo requiere. De lo contrario, simplemente dejo x264elegir.
El perfil y el nivel serían lo mismo que especificar una tasa de bits, con restricciones adicionales en rez/fps y en marcos de referencia. Además, por amor a la ciencia, haz que la gente use Perfil alto a menos que realmente quieras que los videos se reproduzcan en teléfonos viejos u otros reproductores de hardware. 8x8dct ayuda mucho, especialmente. en HD rez. (Sin embargo, probablemente ayuda menos a tasas de bits muy altas, por lo que para los maestros de tasa de bits muy, muy alta, tal vez no pierda tanta calidad).
Además, el nivel es solo un límite superior en la tasa de bits. Establecer un límite de nivel para x264 solo asegura que no lo exceda; No le dice que desea maximizar la tasa de bits tanto como sea posible dentro de ese nivel. Supongo que otros codificadores tendrían una configuración de nivel separada de los objetivos de calidad/tasa de bits.

Respuestas (1)

Cualquier codificador decente puede alcanzar una tasa de bits objetivo (con 2 pases), pero aun así gastar los bits de manera inteligente para lograr una calidad similar en todo el archivo. x264 2pass determina qué CRF dará la tasa de bits deseada (pass1) y luego la usa (pass2). (fuente: Dark Shikari. cf. los enlaces que desenterré para mi respuesta a esta pregunta sobre la transmisión VBR ).

Solo obtiene CBR con x264 si vbv-maxrate= bitrate, e incluso entonces puede ser VBR dentro del tamaño del búfer. (h.264 nunca va a ser estrictamente CBR como mp3 o algo así, a menos que tus marcos I se vean HORRIBLES: P)

Sin embargo, probablemente quiso decir variable entre clips, en lugar del significado habitual dentro de un archivo, porque CFR como objetivo de calidad es claramente mucho mejor que establecer ciegamente una tasa de bits objetivo para muchas fuentes diferentes.

(¿Existe una palabra para esto? ¿tasa de bits flexible? Aparte de la calidad del objetivo, a diferencia de la tasa de bits del objetivo. CRF tiene como objetivo una heurística para la calidad, no estrictamente un objetivo de calidad).

De todos modos, en ese caso, no tengo idea de qué admiten otros codificadores. Lossless h.264 es probablemente el mejor formato para enviar archivos. Es significativamente más pequeño que huffyuv o utvideo y puede admitir hasta 10 bits. (En realidad, creo que FFmpeg puede decodificar profundidades de bits más altas, pero x264 solo puede producir archivos de hasta 10 bits). O supongo que podría hacer que le envíen archivos pro-res con poca pérdida, si eso es mucho más fácil para sus flujos de trabajo.

LordNeckBeard plantea la cuestión de si está entregando estos archivos directamente a los clientes. Si ese es el caso, probablemente debería requerir que codifiquen con x264 con al menos preset = más lento, por lo que puede darles un valor crf si ya necesita x264. La compensación entre la distorsión de la velocidad es importante para los archivos finales que va a transmitir muchas veces.

Oh, un proxy independiente del codificador para la calidad es el cuantificador promedio. Si usan x264, podrían usar un CRF por debajo de su QP promedio requerido. (psy / AQ aumentan los cuantificadores, pero ganan calidad visual percibida). x264 con subme muy bajo puede verse peor con el mismo QP promedio (pero esto también afecta a CRF). De todos modos, si necesita eso, y NO usan x264, podría ser un inconveniente para ellos incluso averiguarlo. El decodificador h.264 de ffmpeg no mantiene estadísticas para imprimir QP promedio, pero puede exportar QP por cuadro para que pueda usar -vf codecview.
Si no usan x264, podrían encontrar algún modo de calidad objetivo si lo hay, o tal vez un modo QP fijo (que probablemente sería peor RD, pero al menos de calidad conocida). Asegúrese de poner su razonamiento junto con cualquier requisito de este tipo. es decir, "QP promedio < 14. (Use una configuración de codificador que sea mucho más que transparente visualmente, ya que volveremos a codificar esto. Para x264, crf = 12 sería ideal)." Siempre y cuando sepan el motivo de su regla , sabrán que el QP real no es lo que le importa, sino la calidad visual.
además, nvm, codecviewes para visualizar vectores de movimiento y showinfono imprime QP promedio por cuadro. Revisé toda la lista de filtros de video de ffmpeg, y ninguno de ellos imprimirá valores QP:/
Gracias por tu respuesta. Creo que el mensaje final es que si queremos tener un control de calidad para nuestro video web, le pedimos a los contratistas que entreguen los maestros y que hagamos la codificación nosotros mismos.
Sí, si el espacio de almacenamiento para archivar los maestros no es un problema, es MUCHO más útil tenerlos. En el futuro, puede regresar y producir codificaciones a diferentes velocidades de bits, o con VP9/HEVC, o para diferentes escenarios de transmisión, o hacer cualquier otra cosa. O simplemente cambie su configuración para codificaciones nuevas, sin tener que pedirles a sus contratistas que actualicen su configuración. Si hizo que sus contratistas hicieran las codificaciones, siempre podría mirar la cadena de configuración x264 que incrusta en la cadena h.264, para asegurarse de que usaron subme lo suficientemente alto y otras configuraciones.