gpt4 book ai didi

python - 管道 FFMPEG 无法正确写入帧

转载 作者:行者123 更新时间:2023-12-04 23:03:57 30 4
gpt4 key购买 nike

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

最佳答案

我建议你关注 OpenCV tutorial在写视频。这是从 Python 编写视频文件的一种非常常见的方法,因此如果您无法使某些事情正常工作,您应该在互联网上找到很多答案。

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

关于python - 管道 FFMPEG 无法正确写入帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26853582/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com