gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:58 25 4
gpt4 key购买 nike

我写了下面的代码:

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_videofile 负责数组的更改。但我不知道为什么...谁能给我解释一下,并建议一种在不改变帧的情况下编写剪辑的方法?

PS:我阅读了 'VideoFileClip''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 动画。

关于python - 为什么 VideoClip 的帧在写入视频文件时会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27458622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com