¿Cómo especificar diferentes banderas para entradas con FFMPEG?

Puede especificar múltiples entradas a FFMPEG y mezclarlas en una sola salida. Entiendo los conceptos básicos de esto, por ejemplo:

ffmpeg -i vid1.mp4 -i vid2.mp4 [commands] output.mp4

Lo que no puedo entender es cómo puedo especificar diferentes comandos para cada entrada. Por ejemplo, tengo lo siguiente que estoy tratando de hacer:

 ffmpeg -i vid1.m2t -i vid2.mp4 -map 0:a -filter_complex "[0:v:0][1:v:0]vstack=inputs=2" -crf 24 -c:a aac -b:a 128k -ac 1 -movflags +faststart output.mp4

vid1.m2tes un flujo mpeg hdv anamórfico de 1440, y vid2.mp4es un h.264 normal de 1920. Estoy -filter_complex "[0:v:0][1:v:0]vstack=inputs=2"tratando de apilar vid1 encima de vid2, pero aparece el error que dice que no puede continuar porque los dos videos no tienen el mismo ancho. Bueno, sí, excepto en la pantalla , el m2t tiene en realidad 1920 de ancho, no 1440.

Cuando estoy convirtiendo solo el hdv, lo uso -filter_complex "scale=1920:1080,setsar=1"para asegurar píxeles cuadrados. Sé que funciona bien, pero ¿cómo puedo incorporar eso en este comando vstack? Si lo pongo con el otro me sale errores. Probé una variedad de formas diferentes, incluso antes de la entrada (pensando que eso haría que ffmpeg lo aplicara solo a la entrada antes de enviarlo a los otros comandos para la salida), pero todos cometen errores.

Además, me pregunto si el -crf 24comando se puede especificar para cada entrada. Cuando se convierte individualmente, el m2t debe estar en 24 o menos, o se ve mal, mientras que el mp4 puede estar tan alto como 30. Podría estar malinterpretando lo que hace vstack, pero creo que si puedo decirle a ffmpeg que preste atención diferente a la calidad de cada entrada reduciría el tamaño del archivo.


Tengo el mismo problema con hstack. FFMPEG generará la salida, pero el archivo m2t tiene un ancho de 1440, por lo tanto, sesgado. Entonces, el ancho total del video es 3360 de ancho, en lugar de 3840.


Quizás más específico para este problema exacto, ¿cómo puedo usar vstack o hstack cuando las entradas tienen diferentes dimensiones?

Respuestas (1)

Supongamos que una transmisión de video es de 1440x1080 con una relación de aspecto de muestra/píxel de 1,333, lo que genera una visualización de 1920x1080. Tenga en cuenta que la resolución real de la transmisión y lo que está almacenado en el archivo es 1440x1080. El indicador de relación de aspecto le dice a la aplicación consumidora (reproductor/editor...) que la proporción de visualización deseada es diferente a la proporción sin procesar de ancho a alto y que debe usar la relación de aspecto para cambiar la escala del video para producir una visualización precisa. FFmpeg no creará automáticamente un video de píxeles cuadrados, ya que es posible que el usuario no quiera eso.

Los filtros de pila requieren que todos los flujos tengan el mismo tamaño en la interfaz en la que se unen: para hstack, esa es la altura y para vstack, esa es la anchura. Solo importa el tamaño sin procesar, la relación de aspecto es solo una bandera informativa.

Por lo tanto, deberá volver a escalar la primera entrada antes de apilar.

Usar

ffmpeg -i vid1.m2t -i vid2.mp4 -filter_complex "[0:v:0]scale=iw*sar:ih,setsar=1[vid1];[vid1][1:v:0]vstack=inputs=2" -map 0:a -crf 24 -ac 1 -c:a aac -b:a 128k -movflags +faststart output.mp4

En lo que respecta al codificador, solo se presenta con una secuencia de 1920x2160: se pierde la procedencia histórica y la composición. Ahora, si desea aplicar diferentes niveles de compresión a partes del cuadro, eso se llama codificación de región de interés . El mes pasado se aplicaron algunos parches iniciales para permitir esto para x264 y x265, pero aún no está operativo. Actualizaré esta respuesta cuando sea así, pero por ahora, solo puede asignar un único valor CRF para todo el marco.

Gracias, Gian. Funciona como se esperaba. También tuve la necesidad de ajustar el brillo y la saturación en el m2t, pero no en el mp4, así que jugué con eso y se me ocurrió -filter_complex "[0:v:0]scale=iw*sar:ih,setsar=1,eq=brightness=0.2:saturation=1.5[vid1];[vid1][1:v:0]vstack=inputs=2". Estoy muy contento de que funcione, pero no entiendo la sintaxis de este comando. ¿ Puedes explicar un poco cómo funcionan los , ;y aquí?[vid1]
Respondiendo a mi propia pregunta aquí: filtros separados con un ,. Una cadena de ,filtros separados se denomina cadena de filtros. Separe las cadenas de filtros con un ;. Una cadena de ;cadenas de filtro separadas se denomina gráfico de filtro. Entradas de referencia con [x]al principio de la cadena. A [y]al final de la cadena se puede enviar por el gráfico de filtro a otra cadena. [0:v:0]llama a la primera entrada (específicamente solo a la primera transmisión de video). Los filtros se aplican en la cadena, luego esa salida se denomina [vid1]. [vid1]luego se llama inmediatamente como si fuera una entrada en la siguiente cadena de filtros.