Ruc*_*hir 5 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)
Run Code Online (Sandbox Code Playgroud)
然后为了检查帧是否已更改以及如果更改,哪个函数更改了它们,我检索了“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]
Run Code Online (Sandbox Code Playgroud)
我发现 a=24,b=24,但 c=26....事实上,在运行数组比较循环时,我发现“img1”和“img2”相同,但“img3”不同。我怀疑函数 video.write_videofile 负责数组的更改。但我不知道为什么......任何人都可以向我解释这一点,并建议一种在不改变帧的情况下编写剪辑的方法吗?
'VideoFileClip'PS:我阅读了,的文档'FFMPEG_VideoWriter','FFMPEG_VideoReader'但找不到任何有用的东西...我需要在编写我正在处理的代码之前阅读确切的框架。请给我建议一个方法。
如 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 动画集。