2014-12-13 90 views
3

我写以下代码:为什么VideoClip的帧在写入视频文件时会发生变化?

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] 

我发现,= 24,b = 24,但C = 26 .... INFACT上运行的阵列比较循环我发现, 'IMG1' 和 'IMG2'是相同的,但'img3'是不同的。 我怀疑是功能video.write_videofile负责阵列的变化。但我不知道为什么...有人可以向我解释这一点,也建议一种方法来写剪辑而不改变其框架?

PS:我读的'VideoFileClip''FFMPEG_VideoWriter''FFMPEG_VideoReader'的文档,但无法找到任何有用的......我需要阅读的确切框架,因为它是在我工作的一个代码编写之前。请给我一个方法。

回答

1

与JPEG相似,MPEG-4使用有损压缩,因此从“video_new.mp4”中读取的帧与“video.mp4”中的帧不完全相同也就不足为奇了。和以及变化纯粹由有损压缩引起的也有出现的由于各种各样的编码选项可以由该写入MPEG数据的程序一起使用的变化。

如果你真的需要能够读回你写的完全相同的帧数据,那么你将不得不使用不同的文件格式,但会被警告:你的文件将是巨大的!


视频格式的选择部分取决于图像数据是什么样的,以及你想用它做什么。如果数据使用256个色或更少,而且你不打算对其执行转换,将修改颜色,简单的GIF动画是一个不错的选择。但请记住,即使像非整数缩放这样的东西也会修改颜色。

如果要分析图像数据并以各种方式对其进行转换,则使用比GIF更好的颜色支持的格式,例如PNG图像流,这是Zulko提到的他的回答。 FWIW,有相关的PNG格式的动画称为MNG,但它不能很好地支持或广为人知。

另一种选择是使用一串PPM图像,或者甚至可以使用一串YUV数据,这对于某些类型的分析非常有用,而且如果您打算将其编码为MPEG以供最终消费使用,这种方法很方便。 PPM格式非常简单,易于使用;由于YUV是一种没有标题数据的原始格式,所以你必须自己跟踪图像大小和分辨率数据。

PPM或YUV的文件大小流很大,因为它们包含不压缩,但他们当然可以使用标准的压缩技术,如果你想将它们保存到磁盘时节省一点空间被压缩。 OTOH,使用这些流典型的视频处理工作流程往往不打扰他们写入到磁盘:他们是在管道发送(可能使用命名管道),所以文件大小为(主要)无关。

尽管与基于MPEG的文件相比,这种格式占用了大量空间,但在执行图像数据分析和转换时,它们远远优于用作中间格式的格式,因为每次您写回&回读MPEG时,一点点的质量。

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

+0

我应该使用哪些文件格式? – Ruchir 2014-12-13 14:29:06

+0

@Ruchir:我会为我的回答添加一些信息。 – 2014-12-14 08:08:49

0

你可以有无损压缩与“PNG”编解码器:

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

编辑@PM 2Ring:当你写上面的线,它使正在使用PNG algortihm压缩的视频(我不确定每个帧是png还是更微妙)。

+0

那只是我写的一个例子......我在我的原始代码中合成视频剪辑和图像剪辑。 – Ruchir 2014-12-13 15:29:27

+0

感谢您的答案。 – Ruchir 2014-12-13 15:37:11

相关问题