การจับภาพหน้าจอแบบกลิ้งด้วย ffmpeg บน windows

ฉันมีรหัสต่อไปนี้เพื่อจับภาพวิดีโอสตรีมจากเว็บแคมของฉัน ฉันใช้ 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()

person gap210    schedule 10.12.2020    source แหล่งที่มา
comment
ฉันขอแนะนำให้ใช้แพ็คเกจ d3dshot pypi.org/project/d3dshot   -  person Christoph Rackwitz    schedule 11.12.2020
comment
ปัญหาของคุณเกิดจากการที่ windows ไปป์ทำการแปลงขึ้นบรรทัดใหม่อัตโนมัติ เว้นแต่จะเปิดเป็นไบนารี่อย่างชัดเจน นั่นคือสาเหตุที่ข้อมูลวิดีโอของคุณสูญเสีย/ได้รับจำนวนไบต์และม้วน   -  person Christoph Rackwitz    schedule 11.12.2020
comment
นี่ไม่ใช่ปัญหาของ OpenCV จริงๆ ดังนั้นกรุณาแก้ไขแท็ก   -  person Christoph Rackwitz    schedule 11.12.2020
comment
@ChristophRackwitz คุณจะเปิดไบนารี่ไพพ์อย่างชัดเจนบน windows ใน python ได้อย่างไร   -  person gap210    schedule 11.12.2020
comment
stackoverflow.com/questions/28943943/   -  person Christoph Rackwitz    schedule 12.12.2020
comment
หากคุณเพียงแค่จับภาพหน้าจอเดสก์ท็อป ฉันขอแนะนำอย่างยิ่งว่าอย่าใช้กระบวนการย่อยและส่งข้อมูลจำนวนมหาศาลไปรอบๆ ที่ต้องใช้ทรัพยากร (CPU) d3dshot ถูกกว่ามาก หากคุณกำลังอ่านจากเว็บแคม ฉันขอแนะนำอีกครั้งว่าอย่าใช้งานผ่านไพพ์ แต่ใช้ VideoCapture ของ OpenCV เพื่อเปิดอุปกรณ์   -  person Christoph Rackwitz    schedule 12.12.2020
comment
ประเด็นก็คือ ฉันต้องการจับภาพหน้าจอเกมที่ 'ดับ' โดยซอฟต์แวร์ป้องกันการโกงเมื่อจับภาพด้วย d3dshot, mss ฯลฯ ดังนั้นฉันจึงใช้สิ่งเหล่านี้ไม่ได้ ฉันสามารถใช้ opencv ได้ แต่ไม่สามารถคืนค่าได้มากกว่า 5 fps ที่ 1080p ซึ่งถือว่าน้อยเกินไปสำหรับฉัน   -  person gap210    schedule 12.12.2020
comment
ทุกอย่างทำงานได้ตามที่ตั้งใจไว้หลังจากเปิดไบนารีไปป์อย่างชัดเจน ขอบคุณ!   -  person gap210    schedule 12.12.2020