Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么视频剪辑写入视频文件时帧会发生变化?_Python_Video_Clip_Moviepy - Fatal编程技术网

Python 为什么视频剪辑写入视频文件时帧会发生变化?

Python 为什么视频剪辑写入视频文件时帧会发生变化?,python,video,clip,moviepy,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) 然后,为了检查帧是否已更改,如果已更改,是哪个函数更改了它们,我检索了“clip”、“video”和“video_new.mp4”的第一帧

我编写了以下代码:

from moviepy.editor import *
from PIL import Image
clip= VideoFileClip("video.mp4")
video= CompositeVideoClip([clip])
video.write_videofile("video_new.mp4",fps=clip.fps)
然后,为了检查帧是否已更改,如果已更改,是哪个函数更改了它们,我检索了“clip”、“video”和“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\u videofile负责数组中的更改。但我不知道为什么…有人能给我解释一下这一点,并建议一种在不改变画面的情况下编写剪辑的方法吗

注:我阅读了
'VideoFileClip'
'FFMPEG\u VideoWriter'
'FFMPEG\u VideoReader'
的文档,但找不到任何有用的东西……我需要在编写代码之前阅读准确的帧。请给我一个建议。

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

如果您确实需要能够读回与您编写的帧数据完全相同的帧数据,那么您必须使用不同的文件格式,但请注意:您的文件将非常庞大


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

如果您想分析图像数据并以各种方式对其进行转换,那么使用比GIF更好的颜色支持格式是有意义的,例如PNG图像流,我认为这就是Zulko在回答中提到的。FWIW,有一种与PNG相关的动画格式叫做,但它并没有得到很好的支持或广泛的了解

另一种选择是使用图像流,甚至可能是数据流,这对于某些类型的分析非常有用,如果您确实打算将其编码为MPEG以供最终使用,则使用起来非常方便。PPM格式非常简单,易于使用;YUV有点混乱,因为它是一种没有标题数据的原始格式,所以您必须自己跟踪图像大小和分辨率数据

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

尽管与基于MPEG的文件相比,这些格式占用了大量空间,但在执行图像数据分析和转换时,它们作为中间格式使用时要优越得多,因为每次写回和读回MPEG都会损失一点质量


我假设您打算使用PIL/Pillow进行图像数据分析和转换。但您也可以使用ffmpeg/avconv命令行程序处理PPM&YUV流;ffmpeg系列还可以很好地处理一组单独的图像文件和GIF动画。

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

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

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

这只是我写的一个例子……我正在用我的原始代码合成一个视频剪辑和一个图像剪辑。@Ruchir:我会在我的答案中添加一些信息。