
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:
- conectarse a la base de datos
- crear comando ffmpeg que toma una tubería como entrada
- generar el proceso hijo ffmpeg
- Espere el resultado del proceso.
Inicie otro hilo: Para todos los archivos svg, haga:
- descargue el svg de la base de datos en un búfer de bytes
- 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_pipe
formato 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.mp4
Pero 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 rawvideo
argumento 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_pipe
demuxer 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_size
el 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