管道FFMPEG不会正确写入帧

时间:2014-11-10 21:46:58

标签: python video ffmpeg pipe

我使用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标志应覆盖任何已存在的文件。有什么想法?

1 个答案:

答案 0 :(得分:0)

我建议您在撰写视频时关注OpenCV tutorial。这是从Python编写视频文件的一种非常常见的方式,因此如果您无法使用某些内容,您可以在互联网上找到许多答案。

请注意,VideoWriter将丢弃(并且不会写入)与初始化时提供的像素大小完全相同的任何帧。