使用 url 作为参数时,opencv videocapture 如何工作?

how does opencv videocapture work when using url as a parameter?

我目前正在处理一个 python 项目,该项目必须处理网络上的许多视频。让这些视频列表url_list,即

url_list = ['sample_url1.mp4', ..., 'sample_url_n.mp4']

出于性能原因,我决定使用 ThreadPool 来异步获取视频。 代码是这样的:

from concurrent.futures import ThreadPoolExecutor
import cv2

def get_video(url):
    cap = cv2.VideoCapture(url)
    if hasattr(cap, 'isOpened') and cap.isOpened():
        return cap


with ThreadPoolExecutor() as executor:
    caps = executor.map(get_video, url_list)

# video processing section
for cap in caps:
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            do_something_with(frame)

这是我的问题。

  1. 当使用 url 作为参数时,cv2.VideoCapture 究竟是如何工作的?它是否从 cap = cv2.VideoCapture(url) 部分的 url 立即下载(在内存中)整个视频?或者它是否像来自 url 的视频流一样工作?

    换句话说,如果网络在视频处理部分断开连接,其余代码是否有效?

    (我测试了几次[在视频处理部分断开网络连接],并且有效。但我不能 100% 确定它可以安全使用。)


  1. cv2.VideoCapture 与多线程和多处理一起使用安全吗?

提前致谢!

编辑 我正在使用 ffmpeg 作为后端。

编辑2

我测试了一个大尺寸的 mp4 文件,但它没有通过连接测试。所以我假设 VideoCapture 不会读取整个视频,而只会读取其中的一部分。它将在 cap.read() 中读取其余部分。如有不妥,欢迎指正。

OpenCV4 videoio 模块使用 multi-platform 库,例如 ffmpeg, gstreamer, Media SDK,平台特定的 WINRT, AVFOUNDATION, MSMF/DSHOW, V4L/V4L2 作为后端来操作文件或 urls .当打开一个file/url(VideoCapture::open)时,会循环遍历所有注册的后端,直到打开成功。以FFMPEG为例,如果实现了响应协议(如RTMP),可以从url、hls中读取。

cv2.VideoCapture一样使用多线程,但注意只在主线程中显示帧。这是一个例子:How to capture Multi camera with Opencv Multi threading (python)