使用 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)
这是我的问题。
当使用 url 作为参数时,cv2.VideoCapture
究竟是如何工作的?它是否从 cap = cv2.VideoCapture(url)
部分的 url 立即下载(在内存中)整个视频?或者它是否像来自 url 的视频流一样工作?
换句话说,如果网络在视频处理部分断开连接,其余代码是否有效?
(我测试了几次[在视频处理部分断开网络连接],并且有效。但我不能 100% 确定它可以安全使用。)
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)
我目前正在处理一个 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)
这是我的问题。
当使用 url 作为参数时,
cv2.VideoCapture
究竟是如何工作的?它是否从cap = cv2.VideoCapture(url)
部分的 url 立即下载(在内存中)整个视频?或者它是否像来自 url 的视频流一样工作?换句话说,如果网络在视频处理部分断开连接,其余代码是否有效?
(我测试了几次[在视频处理部分断开网络连接],并且有效。但我不能 100% 确定它可以安全使用。)
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)