如何使用 ffmpeg 管道从 svg 文件创建视频?

如何使用 ffmpeg 管道从 svg 文件创建视频?

我想从存储在数据库中的 svg 图形创建视频。我的存档程序如下:

  1. 连接到数据库
  2. 创建以管道作为输入的 ffmpeg 命令
  3. 生成 ffmpeg 子进程
  4. 等待进程的输出。

启动另一个线程:对于所有 svg 文件执行以下操作:

  1. 将 svg 从数据库下载到字节缓冲区
  2. 将字节缓冲区写入 ffmpeg 子进程的标准输入

运行我的代码时,将 svg 文件传输到 ffmpeg 时遇到问题。

我使用了ffmpeg -f image2pipe -c:v svg -i - -c:v libx264 -y Downloads/out.mp4。但是 ffmpeg 给出了以下错误:

[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

我发现svg_pipeffmpeg 中有一种格式,所以我尝试了它——但没有成功,错误是一样的。

另一种可能性是将所有 svg 文件下载到临时目录,然后使用不带管道的 ffmpeg,我试过这种方法,成功了。命令如下:ffmpeg -i *.svg -c:v libx264 out.mp4但就我而言,我想避免这种情况。

为什么非管道命令可以工作,而管道命令(如cat sample.svg | ffmpeg -f svg_pipe -i - -c:v libx264 out.mp4:)却失败了?在我的例子中,如何使用管道?

我当前的解决方案: 我使用-f rawvideo参数将图形传输到 ffmpeg。这是一个可行的解决方案,但它假设我需要将 svg 图形转换为原始 RGB 格式。我从这里获取了这个解决方案回答在 Stackoverflow 上。

答案1

经过反复尝试,我终于找到了一组可行的论点:

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


svg_pipe我们可以通过执行以下命令来获取解复用器的选项:
ffmpeg -h demuxer=svg_pipe

输出:

解复用器 svg_pipe [管道 svg 序列]:
svg 解复用器 AVOptions:
-frame_size .D......... 强制帧大小(以字节为单位)(从 0 到 INT_MAX)(默认 0)
-framerate <video_rate> .D......... 设置视频帧速率(默认“25”)
-pixel_format .D......... 设置视频像素格式
-video_size <image_size> .D......... 设置视频大小
-loop .D......... 强制循环输入文件序列(默认 false)

由于某种原因,我们必须将-frame_size参数设置为大于输入文件的大小。


请注意,H.264 编解码器不支持透明度,因此在大多数情况下输出看起来会很奇怪(默认背景颜色为黑色)。
考虑将 SVG 叠加在白色背景上。


示例(在 Ubuntu 18.04 中使用 FFmpeg 版本 n4.3.1):

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

输出:
在此处输入图片描述

相关内容