我使用Python的Image模块加载JPEG并修改它们。在我修改了图像之后,我想将该图像加载到视频中,使用更多修改后的图像作为视频中的帧。
我有3个程序来执行此操作: ImEdit(我写的我的图像编辑模块) VideoWriter(使用FFMPEG写入mp4文件)和 VideoMaker(我用来做所有事情的文件)
我的VideoWriter看起来像这样......
import subprocess as sp
import os
import Image
FFMPEG_BIN = "ffmpeg"
class VideoWriter():
def __init__(self,xsize=480,ysize=360,FPS=29,
outDir=None,outFile=None):
if outDir is None:
print("No specified output directory. Using default.")
outDir = "./VideoOut"
if outFile is None:
print("No specified output file. Setting temporary.")
outFile = "temp.mp4"
if (outDir and outFile) is True:
if os.path.exists(outDir+outFile):
print("File path",outDir+outFile, "already exists:",
"change output filename or",
"overwriting will occur.")
self.outDir = outDir
self.outFile = outFile
self.xsize,self.ysize,self.FPS = xsize,ysize,FPS
self.buildWriter()
def setOutFile(self,fileName):
self.outFile = filename
def setOutDir(self,dirName):
self.outDir = dirName
def buildWriter(self):
commandWriter = [FFMPEG_BIN,
'-y',
'-f', 'rawvideo',
'-vcodec','mjpeg',
'-s', '480x360',#.format(480,
'-i', '-',
'-an', #No audio
'-r', str(29),
'./{}//{}'.format(self.outDir,self.outFile)]
self.pW = sp.Popen(commandWriter,
stdin = sp.PIPE)
def writeFrame(self,ImEditObj):
stringData = ImEditObj.getIm().tostring()
im = Image.fromstring("RGB",(309,424),stringData)
im.save(self.pW.stdin, "JPEG")
self.pW.stdin.flush()
def finish(self):
self.pW.communicate()
self.pW.stdin.close()
ImEditObj.getIm()返回Python Image对象的实例
这段代码的工作范围是我可以将一帧加载到视频中,无论我多少次调用writeFrame,视频中的每一行最终都是一帧长。我有其他代码可以使用单帧制作视频,并且该代码几乎与此代码完全相同。我不知道有什么不同,但是这使得这些代码在其他代码可行的情况下无法正常工作。
我的问题是...... 如何修改我的VideoWriter类,以便我可以传入Python的Image对象的实例并将该帧写入输出文件?我也希望能够为视频写一个以上的帧。
我花了5个小时或更长时间尝试调试这个,但没有在互联网上找到任何有用的东西,所以如果我错过了任何会指向正确方向的StackOverflow问题,那么我们将不胜感激......
编辑: 经过一些调试后,问题可能是我试图写入已经存在的文件,但是,这对我的commandWriter中的-y标志没有多大意义。 -y标志应覆盖任何已存在的文件。有什么想法?
答案 0 :(得分:0)
我建议您在撰写视频时关注OpenCV tutorial。这是从Python编写视频文件的一种非常常见的方式,因此如果您无法使用某些内容,您可以在互联网上找到许多答案。
请注意,VideoWriter将丢弃(并且不会写入)与初始化时提供的像素大小完全相同的任何帧。