当前位置:  开发笔记 > 编程语言 > 正文

使用python将opencv图像传输到ffmpeg

如何解决《使用python将opencv图像传输到ffmpeg》经验,为你挑选了1个好方法。

如何将openCV图像传输到ffmpeg(作为子进程运行ffmpeg)?(我正在使用spyder/anaconda)

我正在从视频文件中读取帧并在每个帧上进行一些处理.

import cv2   
cap = cv2.VideoCapture(self.avi_path)
img = cap.read()
gray = cv2.cvtColor(img[1], cv2.COLOR_BGR2GRAY)
bgDiv=gray/vidMed #background division

然后,为了将处理过的帧传递给ffmpeg,我在一个相关问题中找到了这个命令:

sys.stdout.write( bgDiv.tostring() )

接下来,我试图将ffmpeg作为子进程运行:

cmd='ffmpeg.exe -f rawvideo -pix_fmt gray -s 2048x2048 -r 30 -i - -an -f avi -r 30 foo.avi'
sp.call(cmd,shell=True)

(这也来自上面提到的帖子)然而,这填充了我的IPython控制台与神秘的象形文字然后崩溃它.任何建议?

最终,我想输出4个流并让ffmpeg并行编码这4个流.



1> Ekrem Doğan..:

我有过类似的问题一次.我在Github上打开了一个问题,原来这可能是一个平台问题.

与您的问题相关,您也可以将OpenCV图像传输到FFMPEG.这是一个示例代码:

# This script copies the video frame by frame
import cv2
import subprocess as sp

input_file = 'input_file_name.mp4'
output_file = 'output_file_name.mp4'

cap = cv2.VideoCapture(input_file)
ret, frame = cap.read()
height, width, ch = frame.shape

ffmpeg = 'FFMPEG'
dimension = '{}x{}'.format(width, height)
f_format = 'bgr24' # remember OpenCV uses bgr format
fps = str(cap.get(cv2.CAP_PROP_FPS))

command = [ffmpeg,
        '-y',
        '-f', 'rawvideo',
        '-vcodec','rawvideo',
        '-s', dimension,
        '-pix_fmt', 'bgr24',
        '-r', fps,
        '-i', '-',
        '-an',
        '-vcodec', 'mpeg4',
        '-b:v', '5000k',
        output_file ]

proc = sp.Popen(command, stdin=sp.PIPE, stderr=sp.PIPE)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    proc.stdin.write(frame.tostring())

cap.release()
proc.stdin.close()
proc.stderr.close()
proc.wait()

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有