2015-12-08 28 views
5

Làm cách nào để có thể đưa hình ảnh openCV vào ffmpeg (chạy ffmpeg dưới dạng tiến trình con)? (Tôi đang sử dụng spyder/anaconda)Hình ảnh ống opencv để ffmpeg sử dụng python

Tôi đang đọc khung từ tệp video và thực hiện một số thao tác trên mỗi khung hình.

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

sau đó, để ống khung xử lý để ffmpeg, tôi thấy lệnh này trong một câu hỏi liên quan:

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

hôm sau, tôi đang cố gắng để chạy ffmpeg như một tiến trình con:

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) 

(điều này cũng từ bài viết được đề cập) Tuy nhiên, điều này sẽ điền vào bảng điều khiển IPython của tôi với chữ tượng hình bí ẩn và sau đó treo nó. lời khuyên nào?

cuối cùng, tôi muốn loại bỏ 4 luồng và mã hóa ffmpeg 4 luồng đó song song.

+0

Có lý do nào khiến bạn không muốn sử dụng giao diện OpenWV VideoWriter để ghi video của mình không? Tôi không nghĩ bạn có thể khai thác 4 luồng cùng một lúc. – mirosval

+0

Tôi đã hy vọng điều này sẽ nhanh hơn để lưu video. Tôi nhận thấy rằng ví dụ đọc-viết openCV của tôi ở trên sử dụng VideoWriter mất khoảng gấp đôi mã hóa ffmpeg thuần túy của cùng một video đầu vào (được cấp, mã hóa ffmpeg không bao gồm phân chia nền - đó là lý do tại sao tôi thử dùng OpenCV nơi đầu tiên). Tôi đã hy vọng sử dụng các đường ống có tên ... – jlarsch

Trả lời

8

Tôi đã gặp sự cố tương tự một lần. I opened an issue on Github, hóa ra là có thể là vấn đề nền tảng.

Có liên quan đến câu hỏi của bạn, bạn cũng có thể mở hình ảnh ống OpenCV sang FFMPEG. Dưới đây là mã mẫu:

# 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() 
+0

Tôi gặp lỗi: pipe.proc.stdin.write (frame.tostring()) AttributeError: đối tượng 'Popen' không có thuộc tính 'proc – jlarsch

+0

Khi tôi thay đổi mã của bạn để 'pipe.stdin.write (frame.tostring())', tôi nhận được một lỗi khác: 'pipe.stdin.write (frame.tostring()) IOError: [Errno 22] argumen' không hợp lệ – jlarsch

+0

Đây là python 2.7 code . Phiên bản python của bạn là gì? –

Các vấn đề liên quan