Escribí un script de python que genera un comando de filtro complejo xstack. Las entradas de video son una mezcla de varios formatos descritos aquí:
Tengo 2 comandos generados, uno para el filtro xstack y otro para la mezcla de audio.
Aquí está el comando de pila: (¡lo siento, el texto no se ajusta!)
'c:/ydl/ffmpeg.exe', '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-filter_complex', '[0]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf0];[rsclbf0]fps=24[rscl0];[1]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf1];[rsclbf1]fps=24[rscl1];[2]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf2];[rsclbf2]fps=24[rscl2];[3]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf3];[rsclbf3]fps=24[rscl3];[4]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf4];[rsclbf4]fps=24[rscl4];[5]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf5];[rsclbf5]fps=24[rscl5];[6]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf6];[rsclbf6]fps=24[rscl6];[7]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf7];[rsclbf7]fps=24[rscl7];[8]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf8];[rsclbf8]fps=24[rscl8];[9]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf9];[rsclbf9]fps=24[rscl9];[10]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf10];[rsclbf10]fps=24[rscl10];[11]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf11];[rsclbf11]fps=24[rscl11];[12]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf12];[rsclbf12]fps=24[rscl12];[13]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf13];[rsclbf13]fps=24[rscl13];[14]scale=480:270:force_original_aspect_ratio=decrease,pad=480:270:(ow-iw)/2:(oh-ih)/2, setsar=1[rsclbf14];[rsclbf14]fps=24[rscl14];[rscl0][rscl1][rscl2][rscl3][rscl4]concat=n=5[cct0];[rscl5][rscl6][rscl7]concat=n=3[cct1];[rscl8][rscl9][rscl10]concat=n=3[cct2];[rscl11][rscl12][rscl13][rscl14]concat=n=4[cct3];[cct0][cct1][cct2][cct3]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0', 'output.mp4',
Aquí está el comando mix_audio:
'c:/ydl/ffmpeg.exe', '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-i', 'inputX.mp4' '-filter_complex', '[0:a][1:a][2:a][3:a][4:a]concat=n=5:v=0:a=1[cct_a0];[5:a][6:a][7:a]concat=n=3:v=0:a=1[cct_a1];[8:a][9:a][10:a]concat=n=3:v=0:a=1[cct_a2];[11:a][12:a][13:a][14:a]concat=n=4:v=0:a=1[cct_a3];[cct_a0][cct_a1][cct_a2][cct_a3]amix=inputs=4[all_aud]', '-map', '15:v', '-map', '[all_aud]', '-c:v', 'copy', 'output.mp4',
Por supuesto, esos son comandos de muestra, en realidad uso muchos más videos como entrada, esta muestra es más corta por el bien de la legibilidad.
Aquí están los videos que uso, con datos relevantes de ffprobe, en alguna tabla HTML:
Estoy recibiendo esta advertencia:
[swscaler @ 0000020bac5a19c0] Warning: data is not aligned! This can lead to a speed loss
Creo que esto no está relacionado con la desincronización de audio, estos datos no alineados se trata de resoluciones x264 que son múltiplos de 16, pero mi filtro ya tiene esto en cuenta.
Hay una desincronización de audio perceptible, que es el principal problema que tengo. FFMPEG no parece tener otros errores. ¿Es porque uso 2 comandos para mezclar el audio después? ¿Cómo podría proceder al escenario xstack y la mezcla de audio en un solo escenario?
Estoy un poco confundido sobre cómo FFMPEG maneja diversas velocidades de cuadro. Me dijeron que recodificara todas las entradas de video antes de realizar la etapa xstack, pero crearía una sobrecarga de disco, por lo que preferiría hacerlo en un solo trabajo de ffmpeg si es posible.
Estoy un poco confundido sobre cómo FFMPEG maneja diversas velocidades de cuadro
No lo hace, lo que causaría una desalineación en su caso. La gran mayoría de los filtros (cualquiera que se ocupe de varias fuentes y haga uso de fotogramas, esencialmente), incluido el filtro Concatenar , requiere que las fuentes tengan la misma velocidad de fotogramas.
Para que funcione el filtro concat, las entradas deben tener las mismas dimensiones de cuadro (p. ej., 1920⨉1080 píxeles) y deben tener la misma velocidad de cuadro.
(énfasis añadido)
La documentación también agrega:
Por lo tanto, es posible que al menos deba agregar un filtro scale o scale2ref antes de concatenar videos. Un puñado de otros atributos también tienen que coincidir, como la relación de aspecto de la transmisión. Consulte la documentación del filtro para obtener más información.
Primero debe convertir sus fuentes a la misma velocidad de fotogramas.