背景
深度学习项目中使用python-opencv获取视网络频流出错,找替代方案.要求能得到numpy格式的图片,供opencv和深度模型使用。
方案选型
据我所知道的方法,在python中访问网络视频流(rtsp 或者http视频流)有以下工具:opencv、pyav、imageio和python-vlc.
imageio和python-vlc的资料少,没找到完美的例子,放弃。
opencv是最简单的,网上也有很多例子,推荐使用。
**但是**opencv在我的docker里运行有错误,所以选择pyav。
libav是部分ffmpeg开发人员出走后另外成立的项目,功能和ffmpeg基本一致。pyav是对libav的python语言binding。
libav的官网:https://libav.org/
libav播放rtsp的例子:https://github.com/mikeboers/PyAV/issues/300
代码
参考例子,自己写的代码如下:
import av
import cv2
#video = av.open('rtsp://admin:ts123456@10.21.38.241:554', 'r')
video = av.open('http://10.11.20.104:8554/48/64', 'r')
print("format:" + video.dumps_format())
print('after open')
index = 0
try:
for frame in video.decode():
# Do something with `frame`
index += 1
print("frame:{}".format(index))
img = frame.to_nd_array(format='bgr24')
#cv2.imshow("Test", img)
cv2.imwrite("Test{}.jpg".format(index), img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except Exception as e:
print('fate erro:{}'.format(e))
cv2.destroyAllWindows()
安装pyav请参考 https://mikeboers.github.io/PyAV/installation.html#dependencies