ฉันมีรหัสต่อไปนี้เพื่อจับภาพวิดีโอสตรีมจากเว็บแคมของฉัน ฉันใช้ ffmpeg เพื่อเขียนไปยัง windows pipe ที่มีชื่อ จากนั้นอ่านด้วย python และแสดงผลด้วย opencv ประเด็นก็คือสตรีม opencv กำลัง 'กำลังดำเนินการ' ดังที่แสดงไว้ที่นี่ https://www.youtube.com/watch?v=H78TRo3DZIo
หากฉันจับเอาต์พุตเป็นวิดีโอแทนที่จะเป็นไปป์ด้วยคำสั่ง:
ffmpeg -f dshow -video_size 1920x1080 -framerate 60 -i video="USB Video" -c:v copy out.avi
ทุกอย่างดูดี ฉันควรเปลี่ยนแปลงอะไรเพื่อให้ได้ผลตามที่ต้องการ? (กระแสไม่ไหล)
รหัสของฉันด้านล่าง:
import cv2
import time
import subprocess
import numpy as np
w, h = 800, 600
# Get frame generator
gen = ffmpegGrab()
# Get start time
start = time.time()
# Read video frames from ffmpeg in loop
nFrames = 0
cmd = 'C:/Users/......./Downloads/ffmpeg-4.3.1-2020-11-19-full_build/bin/ffmpeg.exe -f dshow -framerate 60 -video_size 800x600 -i video="USB Video" -pix_fmt bgr24 -vcodec rawvideo -f image2pipe -'
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, bufsize=10**9)
while True:
# Read next frame from ffmpeg
frame = proc.stdout.read(w * h * 3)
frame = np.frombuffer(frame, dtype=np.uint8).reshape((h, w, 3))
cv2.imshow('screenshot', frame)
if cv2.waitKey(1) == ord("q"):
break
fps = nFrames / (time.time() - start)
print(f'FPS: {fps}')
cv2.destroyAllWindows()