Python 管道FFMPEG-won';无法正确写入帧
我正在使用Python的图像模块加载JPEG并修改它们。在我有一个修改过的图像后,我想将该图像加载到视频中,在视频中使用更多修改过的图像作为帧 为此,我编写了3个程序: ImEdit(我编写的图像编辑模块) VideoWriter(使用FFMPEG写入mp4文件)和 VideoMaker(我用来做任何事情的文件) 我的录像机看起来像这样Python 管道FFMPEG-won';无法正确写入帧,python,video,ffmpeg,pipe,Python,Video,Ffmpeg,Pipe,我正在使用Python的图像模块加载JPEG并修改它们。在我有一个修改过的图像后,我想将该图像加载到视频中,在视频中使用更多修改过的图像作为帧 为此,我编写了3个程序: ImEdit(我编写的图像编辑模块) VideoWriter(使用FFMPEG写入mp4文件)和 VideoMaker(我用来做任何事情的文件) 我的录像机看起来像这样 import subprocess as sp import os import Image FFMPEG_BIN = "ffmpeg" class Vide
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()
getIm()返回Python图像对象的实例
这段代码的工作范围是,我可以将一帧加载到视频中,无论我再调用多少次writeFrame,视频最终都只有一帧长。我还有其他的代码,可以用单帧制作视频,这些代码和这个代码几乎相同。我不知道有什么区别,尽管这使得这段代码不能像其他代码那样工作
我的问题是。。。
如何修改VideoWriter类,以便传入Python图像对象的实例并将该帧写入输出文件?我也希望能够写一个以上的视频帧
我已经花了5个小时或更多的时间来调试这个,在互联网上没有发现任何有用的东西,所以如果我错过了任何可以为我指明正确方向的StackOverflow问题,我将不胜感激
编辑:
经过更多的调试后,问题可能是我试图写入一个已经存在的文件,但是,这对于commandWriter中的-y标志没有多大意义。-y标志应覆盖任何已存在的文件。有什么想法吗?我建议您在编写视频时遵循OpenCV。这是从Python编写视频文件的一种非常常见的方法,因此,如果某些事情无法正常工作,您应该在internet上找到许多答案
请注意,VideoWriter将丢弃(并且不会写入)任何与初始化时给出的像素大小不完全相同的帧。我已经尝试了很多次使用OpenCV,但从未让它工作过。我不知道为什么不行,但就是不行。我来检查一下沟通方法。我不知道它是否对我有效,因为它关闭了文件,但我还没有详细讨论你提供的其他问题。哦,我错过了,所以我的答案是完全错误的。很抱歉我明天把它取下来。也许你应该试着让OpenCV工作到底。通常只需安装一个软件包。即使您在Windows上,在遵循文档(将预构建的python文件复制到正确的目录)时,您也应该让它工作。您是否检查了ffmpeg进程中的stdout和stderr,以了解可能发生的情况?也许OpenCV可以工作,但我的问题是,我根本看不懂视频。frameCap始终返回false,因此我的视频永远不会打开。没有尝试过用OpenCV写任何视频,因为我甚至无法打开任何东西。至于代码中的另一个问题,将同一帧写入输出文件将不起作用。如果我处理一个返回image1的图像,然后写入它,然后用另一个输入参数处理同一个图像,最终返回与image1完全相同的像素,对视频的第二次写入还没有完成……从开始到结束,我必须做些什么才能摆脱OpenCV并重新开始?在这一点上,我完全可以再次尝试它,因为我对ffmpeg感到非常失望。