Python 3.x 如何使用ffmpeg提取帧序列并使用subprocess.Popen获取它

Python 3.x 如何使用ffmpeg提取帧序列并使用subprocess.Popen获取它,python-3.x,ffmpeg,extract,frames,Python 3.x,Ffmpeg,Extract,Frames,由于读取单个帧有点慢,我尝试一次提取多个帧。现在我遇到了一个问题,ffmpeg不返回一个列表,而是返回一堆字节。 操作系统:win10 python版本3.7.4 ffmpeg从mp4中提取帧 command=[self.FFMPEG\u二进制文件, “-loglevel”,“fatal”, '-ss',str(datetime.timedelta(seconds=frame\u index/self.\u fps)), '-i',os.path.join(self.\u路径,self.\u文件

由于读取单个帧有点慢,我尝试一次提取多个帧。现在我遇到了一个问题,ffmpeg不返回一个列表,而是返回一堆字节。 操作系统:win10 python版本3.7.4 ffmpeg从mp4中提取帧

command=[self.FFMPEG\u二进制文件,
“-loglevel”,“fatal”,
'-ss',str(datetime.timedelta(seconds=frame\u index/self.\u fps)),
'-i',os.path.join(self.\u路径,self.\u文件名),
'-threads',str(self.THREAD_NUM),
“-vf”,“比例=%d:%d%”(自分辨率[0],自分辨率[1]),
'-vframes',str(num_frames),
“-f”、“image2pipe”,
“-pix_fmt”,“rgb24”,
“-vcodec”、“rawvideo”和“-”]
pipe=subprocess.Popen(命令,stderr=subprocess.pipe,stdout=subprocess.pipe)
tmplist=[]
对于范围内的u(num_帧):
输出,err=pipe.communicate()
tmplist.append(输出)
如果错误:打印('error',err);不返回任何值;
pygame.image.frombuffer(输出,自分辨率,“RGB”)
返回tmplist
预期:pygame曲面列表
Get:ValueError:缓冲区长度不等于格式和分辨率大小

管道不能返回列表,只能返回流。您需要使用像yuv4mpegpupe这样的格式,然后解析出帧。或者使用预计算每个帧的大小并读取该字节数


例如,rgb24将是宽度乘以高度时间3字节

谢谢,这是有意义的。解决方案:raw=pipe.stdout.read(分辨率[0]*分辨率[1]*3)这会计算缓冲区大小