为了删除图中的帧,我写了
frameon=False
Run Code Online (Sandbox Code Playgroud)
与之完美搭配pyplot.figure,但只有matplotlib.Figure它才能消除灰色背景,框架保持不变.另外,我只想显示线条,图中所有其余部分都是透明的.
使用pyplot我可以做我想做的事情,我想用matplotlib来做这件事有一个长期的原因我宁愿不提及我的问题.
如何使用x264 C API将RBG图像编码为H264帧?我已经创建了一系列RBG图像,我现在如何将该序列转换为H264帧序列?特别是,如何将这个RGB图像序列编码为H264帧序列,该帧由单个初始H264关键帧后跟依赖H264帧组成?
我们目前正在使用HTML5 websockets开发聊天+(文件共享+)视频会议应用程序.为了使我们的应用程序更易于访问,我们希望使用以下序列实现Adaptive Streaming:
那么..我们如何用Python分割我们的音频/视频数据?
我们知道Microsoft已经构建了Expression Encoder 2,它支持Adaptive Streaming,但它只支持Silverlight,而这不是我们想要的.
编辑:
还有一个名为FFmpeg的解决方案(对于Python和PyFFmpeg包装器),但它只支持Apple Adaptive Streaming.
所以,这应该是对这个帖子的评论,但它显然已经关闭了,所以就这样了.我已经用matplotlib和numpy和mencoder成功地玩了,正如这里所建议的那样.我已经采用了Voki Codder缓冲区到stdin解决方案,这大大加快了整个过程.问题是,我在命令的-format ="bgra"部分找不到任何文档.这意味着字节是从右到左的蓝绿色红色alpha,右边.他们必须是uint32,或其他什么.问题是我正在绘制花车的彩色图,所以我试图将它们转换为灰度,但是我得到了许多奇怪的模式让我坚信我做错了什么.我写了这个函数来从一个范围内的浮点数转换为uint32.但结果并不是我预期的原因,我做了一件非常愚蠢的事情吗?
def grayscale(x, min, max):
return np.uint32((x-min)/(max-min)*0xffffff)
Run Code Online (Sandbox Code Playgroud) 我已经缩小到这个电话:
fig.canvas.tostring_argb() #fig=matplotlib.pyplot.figure()
Run Code Online (Sandbox Code Playgroud)
AttributeError当我将代码作为python脚本运行时,此函数引发了一个问题.
AttributeError: 'FigureCanvasGTKAgg' object has no attribute 'renderer'
但是,如果在ipython --pylab命令行中运行,此代码可以正常工作.
据我所知,文档中的Agg渲染器应该可以正常工作.
上下文是我试图从数字制作电影,而不是将帧保存到磁盘; 按照这个问题.我正在使用流式传输像素数组的方法ffmpeg(作为一个单独的进程运行)来执行此操作,我需要argb帧中的值数组.
我是否可以通过一些配置设置让matplotlib在脚本中正常工作?
编辑use('Agg')根据评论
尝试; 仍然失败; 这是一个最小的工作示例.
[dave@dave tools]$ python -c "import matplotlib; matplotlib.use('Agg'); import matplotlib.pyplot; fig=matplotlib.pyplot.figure(); fig.canvas.tostring_argb()"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 416, in tostring_argb
return self.renderer.tostring_argb()
AttributeError: FigureCanvasAgg instance has no attribute 'renderer'
Run Code Online (Sandbox Code Playgroud) 在 Raspbian(Raspberry Pi 2)上,从我的脚本中删除的以下最小示例正确生成了一个 mp4 文件:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
def anim_lift(x, y):
#set up the figure
fig = plt.figure(figsize=(15, 9))
def animate(i):
# update plot
pointplot.set_data(x[i], y[i])
return pointplot
# First frame
ax0 = plt.plot(x,y)
pointplot, = ax0.plot(x[0], y[0], 'or')
anim = animation.FuncAnimation(fig, animate, repeat = False,
frames=range(1,len(x)),
interval=200,
blit=True, repeat_delay=1000)
anim.save('out.mp4')
plt.close(fig)
# Number of frames
nframes = 200
# Generate data
x = np.linspace(0, 100, num=nframes)
y = np.random.random_sample(np.size(x)) …Run Code Online (Sandbox Code Playgroud) 我有一个4D numpy电影帧阵列.我正在寻找一个函数,以给定的帧速率将它们写入电影.我在我的操作系统上安装了FFMPEG,正如我从这些答案中看到的,最有效的方法是通过管道.
但是,我使用管道的经验很少,上面链接中的解释对我来说没什么意义.此外,很少有答案似乎实际上实现了管道,并且确实使用了mencoder,而不是FFMPEG.我对FFMPEG相对缺乏经验,所以我不确定如何修改mencoder答案中的命令字符串以使其在FFMPEG中工作.
我想要的是什么:
以下形式的功能:
animate_np_array(4d_array,framerate) - > output.mp4(或其他视频编解码器)
它实现了一个接一个地将帧发送到FFMPEG的管道,并且我可以将其复制粘贴到我现有的代码中.
此外,绝对有必要这个函数永远不会实际绘制任何帧,因为对matplotlib.imshow()函数的调用(正如我最常见的那样)会大大减慢速度.