如何使用python通过ffmpeg传递输出?

时间:2019-03-05 10:58:31

标签: python opencv ffmpeg pipe

我正在尝试通过 Python FFmpeg 输出输出。我正在从视频采集卡读取图像,并且已成功使用dshow从命令行将其读取到输出文件。我正在尝试将图像从卡中抓取到我的OpenCv代码中,以便能够进一步处理数据。不幸的是,当我输出图像时,我只是得到了视频的显示,如链接所示:

  

链接:s000.tinyupload.com/?file_id = 15940665795196022618。

我使用的代码如下所示:

import cv2
import subprocess as sp
import numpy
import sys
import os
old_stdout=sys.stdout
log_file=open("message.log","w")
sys.stdout=log_file

FFMPEG_BIN = "C:/ffmpeg/bin/ffmpeg.exe"
command = [ FFMPEG_BIN, '-y',
            '-f', 'dshow', '-rtbufsize', '100M',
            '-i', 'video=Datapath VisionAV Video 01' ,
             '-video_size', '640x480',
              '-pix_fmt', 'bgr24', '-r','25',  
          '-f', 'image2pipe', '-' ]    
pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=10**8)

while True:
    # Capture frame-by-frame
    raw_image = pipe.stdout.read(640*480*3)
      # transform the byte read into a numpy array
    image =  numpy.frombuffer(raw_image, dtype='uint8')
    print(image)
    image = image.reshape((480,640,3))          
    if image is not None:
        cv2.imshow('Video', image)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    pipe.stdout.flush()
sys.stdout=old_stdout
log_file.close()
cv2.destroyAllWindows()

请为我提供一些解决此问题的指示。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我在控制台应用程序FFmpeg上苦苦挣扎了更长的时间,最终放弃了。 使用此扩展程序更容易:

pip install ffmpeg-python

Karl Kroening在这里发布了FFmpeg与Python的很好集成。 通过这些示例,应该可以找到一种解决方案: https://github.com/kkroening/ffmpeg-python

答案 1 :(得分:0)

调用sp.Popen后,您便可以与其通信。您可以使用以下代码:

try:    
    pipe = sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT, universal_newlines=True)`

    ffmpeg_output, _ = pipe.communicate()

except  sp.CalledProcessError as err:
     print("FFmpeg stdout output on error:\n" + err.output)

最后,您可以打印输出以确保上述命令有效:

print(ffmpeg_output)

上面的语句将显示与进程通信返回的输出。