本文已参与「新人创作礼」活动,一起开启掘金创作之路。
需求内容:将摄像头的rtsp视频流进行切分成一定时间长短的视频短,并保存至本地。
需求背景:项目需求中的视频分析算法,是对视频段进行分析,所以需要将摄像头传输过来的rtsp视频切分为视频断,并保存至本地进行。
实现思路:
- 通过open-cv获取到视频的每秒帧率
- 根据每秒帧率计算需要保存的视频中一共有多少帧
- 在循环中,每读取一帧就进行一次计数
- 当计数的数字与需要保存的最后一帧相等时,保存视频
备注: 1.目前存在保存的视频video标签无法播放的问题,但是在播放器和视频分析时并不受影响,怀疑是视频保存前的数据格式问题
示例代码如下
import cv2
import uuid
def test_download():
cap = cv2.VideoCapture("rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov")#读取视频流,该视频流为之前网上找到的,但后期测试该视频流已不可用
# cap = cv2.VideoCapture("rtsp://admin:12345@192.168.1.64/main/Channels/1")
# fourcc = cv2.VideoWriter_fourcc(*'XVID')
frame_s = cap.get(5)#获取视频每秒的帧数
print(frame_s)
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') #设置视频格式
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#设置视频的宽高(该处为获取的视频的原宽高)
ret, frame = cap.read()
time_frame = frame_s*60*5#设置保存时间为五分钟一保存
num = 0
while ret:
if num == 0:
filename = str(uuid.uuid4())+".mp4"#设置保存后的视频名称
video_writer = cv2.VideoWriter(filename, fourcc, frame_s, size, True) # 参数:视频文件名,格式,每秒帧数,宽高,是否灰度
ret, frame = cap.read()
cv2.imshow("frame", frame)
img = cv2.resize(frame,(640,360),interpolation=cv2.INTER_LINEAR)
video_writer.write(frame)
num = num+1
if num == time_frame :
video_writer.release()#将视频保存下来
num = 0
break
# video_writer.release()
cv2.destroyAllWindows()#删除窗口,可通过参数指定具体某个窗口,若不传则是删除所以的窗口
cap.release()#释放视频
if __name__ == '__main__':
test_download()