微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。