¿Cómo crear un video a partir de archivos svg usando una tubería con ffmpeg?

¿Cómo crear un video a partir de archivos svg usando una tubería con ffmpeg?

Quiero crear un video a partir de gráficos svg almacenados en una base de datos. Mi procedimiento sería el siguiente para archivar eso:

  1. conectarse a la base de datos
  2. crear comando ffmpeg que toma una tubería como entrada
  3. generar el proceso hijo ffmpeg
  4. Espere el resultado del proceso.

Inicie otro hilo: Para todos los archivos svg, haga:

  1. descargue el svg de la base de datos en un búfer de bytes
  2. escriba el búfer de bytes en la entrada estándar del proceso secundario ffmpeg

Al ejecutar mi código, encuentro un problema al canalizar los archivos svg a ffmpeg.

Solía ffmpeg -f image2pipe -c:v svg -i - -c:v libx264 -y Downloads/out.mp4​​. Pero luego ffmpeg me da el siguiente error:

[image2pipe @ 0x562ebd74c300] Could not find codec parameters for stream 0 (Video: svg (librsvg), none): unspecified size
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options

Descubrí que hay un svg_pipeformato en ffmpeg, así que lo intenté, sin éxito, el mismo error.

Otra posibilidad sería descargar todos los archivos svg a un directorio temporal y luego usar ffmpeg sin tubería, lo cual funcionó cuando lo probé. El comando sería así: ffmpeg -i *.svg -c:v libx264 out.mp4Pero en mi caso me gustaría evitar esto.

¿Por qué el comando no canalizado funciona y el comando canalizado (como cat sample.svg | ffmpeg -f svg_pipe -i - -c:v libx264 out.mp4:) falla? ¿Y cómo puedo utilizar una pipa en mi caso?

Mi solución actual: Utilizo el -f rawvideoargumento para canalizar mis gráficos a ffmpeg. Esa es una solución que funciona, pero presupone que necesito convertir los gráficos svg al formato RGB sin formato. Tomé esta solución de esto.respuestaen Stackoverflow.

Respuesta1

Con algo de prueba y error logré encontrar un conjunto de argumentos que funcionan:

cat sample.svg | ffmpeg -f svg_pipe -frame_size 1000000000 -video_size 100x100 -i - -c:v libx264 -y out.mp4


Podremos obtener las opciones de svg_pipedemuxer ejecutando el siguiente comando:
ffmpeg -h demuxer=svg_pipe

Producción:

Demuxer svg_pipe [secuencia de svg canalizada]:
svg demuxer AVOptions:
-frame_size .D......... forzar el tamaño del fotograma en bytes (de 0 a INT_MAX) (predeterminado 0)
-framerate <video_rate> .D... ...... establecer la velocidad de fotogramas del vídeo (predeterminado "25")
-pixel_format .D......... establecer el formato de píxeles del vídeo
-video_size <tamaño_imagen> .D......... establecer tamaño de vídeo
-loop .D......... forzar bucle sobre la secuencia del archivo de entrada (falso predeterminado)

Por alguna razón, tenemos que configurar -frame_sizeel argumento para que sea mayor que el tamaño del archivo de entrada.


Tenga en cuenta que el códec H.264 no admite transparencia, por lo que en la mayoría de los casos la salida tendrá un aspecto extraño (el color de fondo predeterminado es negro).
Considere superponer el SVG sobre un fondo blanco.


Ejemplo (usando FFmpeg versión n4.3.1 en Ubuntu 18.04):

Aporte:
https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/atom.svg

Producción:
ingrese la descripción de la imagen aquí

información relacionada