前言
为了把处理完的视频帧写入视频真是让我挠破了头,cv2.VideoWriter没法选择编码器(只能选编码),PyAV没法设置vtag和许多FFmpeg的可用参数。偶然间看到了FFmpeg还有Pipe这种神奇的通信方式,那就赶紧开始吧。
正文
可以去看一下我GitHub上完整的代码示例iBobbyTS/FFmpeg-Pipe-Python。此篇博文只是对关键步骤进行详解,完整脚本以GitHub上的为准
读取
- 先定义好命令
command = ['ffmpeg', '-i', 'in_v.mov', '-f', 'rawvideo', '-pix_fmt', 'bgr24', '-']
输出格式-f/-format需要是rawvideo,即完整的RGB或YUV信息;-pix_fmt像素格式为bgr24,可以被转换为numpy.uint8,看自己需求通道顺序,rgb24也可以;输出是-代表管道。 - 通过
pipe = subprocess.Popen(command, stdout=sp.PIPE, bufsize=10 ** 8)
打开管道,后两个参数不要动。 - 读取brg数据
raw_image = pipe.stdout.read(width * height * 3)
width
和