5

我写了以下代码:

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'

4

2 回答 2

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 动画。

于 2014-12-13T12:33:09.273 回答
1

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

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

编辑@PM 2Ring:当您编写上面的行时,它会制作一个使用 png 算法压缩的视频(我不确定每个帧是 png 还是更微妙)。

于 2014-12-13T14:53:24.527 回答