Как передать вывод из ffmpeg, используя python? - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь передать данные из FFmpeg в Python . Я читаю изображения с карты видеозахвата, и мне удается прочитать это в выходной файл из командной строки, используя 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()

Пожалуйста, предоставьте мне несколько советов, чтобы решить эту проблему. Помощь очень ценится.

1 Ответ

0 голосов
/ 05 марта 2019

После вызова 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)

Приведенный выше оператор будет отображать выходные данные, возвращаемые связью с процессом.

...