OpenCV 能够读取流但 VLC 不能

问题描述 投票:0回答:0

我正在尝试将我的网络摄像头帧流式传输到 UDP 地址。这是我的发件人代码。

cmd = ['ffmpeg', '-y', '-f', 'rawvideo', '-pixel_format', 'bgr24', '-video_size', f'{width}x{height}', 
       '-i', '-', '-c:v', 'mpeg4','-preset', 'ultrafast', '-tune', 'zerolatency','-b:v', '1.5M',
       '-f', 'mpegts', f'udp://@{ip_address}:{port}']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
camera = cv2.VideoCapture(0)
while True:
    ret, frame = camera.read()
    cv2.imshow("Sender",frame)
    if not ret:
        break
    p.stdin.write(frame.tobytes())
    p.stdin.flush()
    if cv2.waitKey(1) & 0xFF == ord('q'):
            break

这段Python代码可以成功制作流。我可以用这个接收器代码读取流。

q = queue.Queue()
def receive():
    cap = cv2.VideoCapture('udp://@xxx.x.xxx.xxx:5000')
    ret, frame = cap.read()
    q.put(frame)
    while ret:
        ret, frame = cap.read()
        q.put(frame)
def display():
    while True:
        if q.empty() != True:
            frame = q.get()
            cv2.imshow('Receiver', frame)
        k = cv2.waitKey(1) & 0xff
        if k == 27:  # press 'ESC' to quit
            break
tr = threading.Thread(target=receive, daemon=True)
td = threading.Thread(target=display)
tr.start()
td.start()
td.join()

但是我无法从 VLC 观看流。我要去媒体->打开网络流-> udp://@xxx.x.xxx.xxx:5000 观看流。几秒钟后,位于 VLC 左下角的计时器开始增加,但屏幕上没有帧,只有 VLC 图标。

我检查了防火墙规则,打开了所有端口到 UDP 连接。我正在使用我的 IP 地址发送帧并观看它们。 此外,我还尝试了其他视频编解码器,如 h264、hvec、mpeg4、rawvideo。 此外,我尝试使用 Windows Media Player 观看流,但它没有用。

我应该怎么做才能解决这个问题?

python windows opencv ffmpeg vlc
© www.soinside.com 2019 - 2024. All rights reserved.