python通过openvc将rtsp视频切分成5分钟一段的视频段

483 阅读2分钟

​ 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

需求内容:将摄像头的rtsp视频流进行切分成一定时间长短的视频短,并保存至本地。

需求背景:项目需求中的视频分析算法,是对视频段进行分析,所以需要将摄像头传输过来的rtsp视频切分为视频断,并保存至本地进行。

实现思路:

  1. 通过open-cv获取到视频的每秒帧率
  2. 根据每秒帧率计算需要保存的视频中一共有多少帧
  3. 在循环中,每读取一帧就进行一次计数
  4. 当计数的数字与需要保存的最后一帧相等时,保存视频

备注: 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()