Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 管道FFMPEG-won';无法正确写入帧_Python_Video_Ffmpeg_Pipe - Fatal编程技术网

Python 管道FFMPEG-won';无法正确写入帧

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

我正在使用Python的图像模块加载JPEG并修改它们。在我有一个修改过的图像后,我想将该图像加载到视频中,在视频中使用更多修改过的图像作为帧

为此,我编写了3个程序: ImEdit(我编写的图像编辑模块) VideoWriter(使用FFMPEG写入mp4文件)和 VideoMaker(我用来做任何事情的文件)

我的录像机看起来像这样

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感到非常失望。