Python - 如何保存我的 USB 摄像头正在直播的*精确*视频流?

问题描述

我使用 OpenCV 4.5.0 通过 OpenCV 的 VideoCapture 方法从 USB 网络摄像头流式传输视频。这是我如何读取帧、处理它们然后将它们写入文件的片段。

import cv2
import numpy as np
dev_id = 0
stream = cv2.VideoCapture(dev_id,cv2.CAP_V4L2)
fourcc = cv2.VideoWriter_fourcc(*'FMP4')
vpath = 'test.mp4'
writer = cv2.VideoWriter(vpath,fourcc,30,(640,480),isColor=True)

if stream.isOpened():
    rval,frame = stream.read()
else:
    print('Could not open the stream for reading')
if not writer.isOpened():
    print('Could not open the file for writing')

i = 0
while rval:
    i += 1
    with open('frame_{}.pkl'.format(i),'wb') as fout:
        np.save(fout,frame)

    writer.write(frame)

    rval,frame = stream.read()
    key = cv2.waitkey(1)
    if key == 27: # ESC
        break 

writer.release()

我的目标是然后读取上面写的视频文件并重现我在直播期间获得的完全相同的帧。我一直无法找到将实时视频流写入文件方法,以便从写入的视频文件提取的帧与存储在 numpy 数组中的帧完全匹配。除了 FMP4 作为 FourCC,我还尝试了 MJPG、MP4V、XVID、LAGS、H264、MPG4。到目前为止没有运气。我做错了什么?

这是我阅读视频和比较帧的方式:

vc = cv2.VideoCapture(vpath)
if vc.isOpened():
    rval,frame_read = vc.read()
else:
    print('Could not read video from the file')

j = 0
while rval:
    j += 1
    with open('frame_{}.pkl'.format(j),'rb') as fin:
        frame_orig = np.load(fin)
    if np.array_equal(frame_read,frame_orig):
        print('same')
    else:
        print('different')

    rval,frame_read = vc.read()

我还测试了这是否仅仅是视频编写器和视频阅读器之间的索引不匹配。它不是。这看起来真的很像用于将帧写入文件的编解码器造成的差异。是否没有编解码器写入与 VideoCapture.read() 发出的完全相同的帧?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)