【发布时间】:2011-05-04 19:45:36
【问题描述】:
我想根据我在 matplotlib 中的 python 脚本中生成的帧创建一个 h264 或 divx 电影。这部电影大约有 100k 帧。
在网络上的例子中[例如。 1],我只见过将每一帧保存为png然后在这些文件上运行mencoder或ffmpeg的方法。就我而言,保存每一帧是不切实际的。有没有办法获取从 matplotlib 生成的绘图并将其直接通过管道传输到 ffmpeg,不生成中间文件?
用 ffmpeg 的 C-api 编程对我来说太难了[例如。 2]。另外,我需要一种具有良好压缩率的编码,例如 x264,否则电影文件对于后续步骤来说太大了。所以坚持使用 mencoder/ffmpeg/x264 会很棒。
有什么可以用管道[3]做的吗?
[1]http://matplotlib.sourceforge.net/examples/animation/movie_demo.html
[2]How does one encode a series of images into H264 using the x264 C API?
【问题讨论】:
-
我还没有想出一种方法来使用当前维护的库来做到这一点......(我过去使用过 pymedia,但它不再维护,并且不会在我使用的任何系统上构建...)如果有帮助,您可以使用
buffer = fig.canvas.tostring_rgb()获取 matplotlib 图形的 RGB 缓冲区,图形的宽度和高度(以像素为单位)使用fig.canvas.get_width_height()(或fig.bbox.width等) -
好的,谢谢。这很有用。我想知道缓冲区的某些转换是否可以通过管道传输到 ffmpeg。 pyffmpeg 有一个复杂的 Cython 包装器,最近更新,用于逐帧读取 avi。但不会写。对于熟悉 ffmpeg 库的人来说,这听起来像是一个可能的起点。即使像 matlab 的 im2frame 这样的东西也会很棒。
-
我正在尝试让 ffmpeg 从输入管道(使用
-f image2pipe选项,以便它需要一系列图像)或本地套接字(例如udp://localhost:some_port)读取并在python中写入套接字......到目前为止,只有部分成功......我觉得我快到了,虽然......我只是对ffmpeg不够熟悉...... -
对于它的价值,我的问题是由于 ffmpeg 接受 .png 流或原始 RGB 缓冲区的问题,(已经提交了一个错误:roundup.ffmpeg.org/issue1854)如果你使用 jpegs 它可以工作. (使用
ffmpeg -f image2pipe -vcodec mjpeg -i - ouput.whatever。你可以打开一个subprocess.Popen(cmdstring.split(), stdin=subprocess.PIPE)并将每一帧写入它的stdin)如果有机会我会发布一个更详细的例子...... -
太好了!我明天试试这个。
标签: python numpy ffmpeg matplotlib x264