OpenCV是一個非常好用的計算機視覺庫,功能也非常強大牲距。我們可以基于它的Python接口叮喳,只需要寫不到100行的代碼就能實現(xiàn)從網(wǎng)絡(luò)攝像頭中抓取視頻并保存成標(biāo)準(zhǔn)格式的視頻文件睁宰,當(dāng)然,你也以直接通過它的C++接口來寫嘱么,以下是Python的接口代碼示例狮含,有興趣的同學(xué)可以參考下:
#-*- coding = utf-8 -*-
import time
import cv2
print cv2
RTSP_URL = 'rtsp://admin:admin@192.168.0.111: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要根據(jù)你的實際情況進行修改几迄,另外獲取它的FPS值有點問題,所以直接寫死成25了冰评。
這段代碼有兩個地方需要特別說明下:
- 如果你使用的是'pip install opencv-python'方式安裝CV庫的話映胁,由于GPL協(xié)議的問題,默認(rèn)是不支持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盅惜。 - 因為編碼比較耗性能,所以如果你運行的機器性能不怎么樣的話忌穿,網(wǎng)絡(luò)視頻接受的速度將會大于編碼的速度抒寂,這時候會產(chǎn)生丟幀的現(xiàn)象,推薦的解決方案是實現(xiàn)兩個線程掠剑,其中一個線程負(fù)責(zé)從網(wǎng)絡(luò)攝像機中取視頻流并解碼屈芜,解碼后的圖片發(fā)送到一個隊列中去,另外一個線程負(fù)責(zé)從這個隊列中獲取圖片并進行編碼最后保存成指定封裝格式的視頻文件朴译。