为什么VideoClip的帧在写入视频文件时会发生变化?

时间:2014-12-13 12:11:39

标签: python video clip moviepy

我写了以下代码:

from moviepy.editor import *
from PIL import Image
clip= VideoFileClip("video.mp4")
video= CompositeVideoClip([clip])
video.write_videofile("video_new.mp4",fps=clip.fps)

然后检查帧是否已经改变,如果改变了,哪个功能改变了它们,我检索了第一帧'剪辑'视频'和' video_new.mp4'并比较了它们:

clip1= VideoFileClip("video_new.mp4")
img1= clip.get_frame(0)
img2= video.get_frame(0)
img3= clip1.get_frame(0)
a=img1[0,0,0]
b=img2[0,0,0]
c=img3[0,0,0]

我发现a = 24,b = 24,但是c = 26 ....实际上在运行数组比较循环时我发现' img1'和' img2'是相同的但是' img3'是不同的。 我怀疑video.write_videofile函数负责更改数组。但我不知道为什么......任何人都可以向我解释这个并且还建议一种不用改变帧来编写剪辑的方法吗?

PS:我读过'VideoFileClip''FFMPEG_VideoWriter''FFMPEG_VideoReader'的文档,但找不到任何有用的内容......我需要在写入之前阅读确切的框架代码我正在努力。求你建议我。

2 个答案:

答案 0 :(得分:1)

与JPEG一样,MPEG-4使用有损压缩,因此从“video_new.mp4”读取的帧与“video.mp4”中的帧不完全相同也就不足为奇了。除了纯粹由有损压缩引起的变化之外,还存在由于编写MPEG数据的程序可以使用的各种编码选项而产生的变化。

如果您真的需要能够回读您编写的完全相同的帧数据,那么您将不得不使用不同的文件格式,但要注意:您的文件将是巨大的!< / p>


视频格式的选择部分取决于图像数据的类型以及您想要使用的内容。如果数据使用256色或更少,并且您不打算对其进行将修改颜色的转换,则简单的GIF动画是一个不错的选择。但请记住,即使是非整数缩放也会修改颜色。

如果你想分析图像数据并以各种方式对其进行转换,那么使用比GIF具有更好色彩支持的格式是有意义的,例如PNG图像流,我假设是Zulko在他的回答中提到了什么。 FWIW,有一种与PNG相关的动画格式称为MNG,但它没有得到很好的支持或广为人知。

另一种选择是使用PPM图像流,或者甚至是YUV数据流,这对于某些类型的分析很有用,如果您打算编码为MPEG,则很方便最终消费。 PPM格式非常简单易用; YUV略显凌乱,因为它是一种没有标题数据的原始格式,因此您必须自己跟踪图像大小和分辨率数据。

PPM或YUV流的文件大小很大,因为它们根本不包含压缩,但当然如果要在将它们保存到磁盘时节省一点空间,可以使用标准压缩技术进行压缩。 OTOH,使用此类流的典型视频处理工作流通常不会将它们写入磁盘:它们是通过管道发送的(可能使用命名管道),因此文件大小(大部分)无关紧要。

虽然与基于MPEG的文件相比,这些格式占用了大量空间,但是在执行图像数据分析和转换时,它们作为中间格式使用起来非常优越,因为每次编写和播放时都会如此。回读MPEG,你会失去一点质量。

我假设您打算使用PIL / Pillow进行图像数据分析和转换。但你也可以使用PPM&amp; YUV流使用ffmpeg / avconv命令行程序;而ffmpeg家族也很乐意使用各种图像文件和GIF动画。

答案 1 :(得分:0)

您可以使用'png'编解码器进行无损压缩:

clip.write_videoclip('clip_new.avi', codec='png')

编辑@PM 2Ring:当你在上面写下这一行时,会产生一个使用png algortihm压缩的视频(我不确定每个帧是png还是更精细)。