使用OpenCV的Python接口获取网络摄像头视频并保存

OpenCV是一个非常好用的计算机视觉库,功能也非常强大。我们可以基于它的Python接口,只需要写不到100行的代码就能实现从网络摄像头中抓取视频并保存成标准格式的视频文件,当然,你也以直接通过它的C++接口来写,以下是Python的接口代码示例,有兴趣的同学可以参考下:

#-*- coding = utf-8 -*-
import time
import cv2

print cv2
RTSP_URL    = 'rtsp://admin:[email protected]:554/h264/ch1/sub/av_stream'   # your camera's rtsp url
DURATION    = 30   # how many time in seconds you want to capture
OUTPUT_FILE = 'capture_video.mp4'

cap         = cv2.VideoCapture(RTSP_URL)
#fourcc      = cv2.VideoWriter_fourcc('h','2','6','4')
fourcc      = 0x21
#fps         = cap.get(cv2.CAP_PROP_FPS)
fps         = 25
size        = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
saver       = cv2.VideoWriter(OUTPUT_FILE, fourcc, fps, size)

print "rtsp_url = %s, fps = %d, size = %s"%(RTSP_URL, fps, size)

got_first_frame = False
frame_count = 0
while True:
    ret, frame = cap.read()
    if not(ret):
        continue
    frame_count += 1
    print "%s: frame %d received" % (time.time(), frame_count)
    if got_first_frame == False:
        start_time = time.time()
        got_first_frame = True

    saver.write(frame)
    now = time.time()
    if int(now - start_time) > DURATION:
        break

我拿的是海康萤石的摄像头测试是可以work的,其中的rtsp url要根据你的实际情况进行修改,另外获取它的FPS值有点问题,所以直接写死成25了。

这段代码有两个地方需要特别说明下:

  • 如果你使用的是'pip install opencv-python'方式安装CV库的话,由于GPL协议的问题,默认是不支持H.264编码的,所以你需要自己手动重新编译opencv库,并把h264的编码功能加上去,详见:https://stackoverflow.com/questions/33134985/cv2-videowriter-will-not-write-file-using-fourcc-h-264-with-logitech-c920-pyth
    说明。
  • 即使你重新编译了OpenCV库,并把H264 Encoding的功能加上去后,还有一个坑是在fourcc赋值时不能写成cv2.VideoWriter_fourcc('h','2','6','4'),这好像是OpenCV库的一个BUG,详见:https://stackoverflow.com/questions/34024041/writing-x264-from-opencv-3-with-ffmpeg-on-linux
    说明,解决办法是直接写成fourcc=0x21。
  • 因为编码比较耗性能,所以如果你运行的机器性能不怎么样的话,网络视频接受的速度将会大于编码的速度,这时候会产生丢帧的现象,推荐的解决方案是实现两个线程,其中一个线程负责从网络摄像机中取视频流并解码,解码后的图片发送到一个队列中去,另外一个线程负责从这个队列中获取图片并进行编码最后保存成指定封装格式的视频文件。

你可能感兴趣的:(使用OpenCV的Python接口获取网络摄像头视频并保存)