使用python从网络摄像头修剪从中删除帧实时视频

问题描述

我有一个可捕获视频流的网络摄像头。 30秒后,我想从一开始就删除1秒的视频,并继续捕获视频流,依此类推。简而言之,我只想保存直播视频的最近30秒。

OpenCV不提供视频处理

ffmpeg修剪视频,但创建一个新的输出文件,我不想保留副本。

#Create a video write before entering the loop
#Create a video write before entering the loop
video_writer = cv2.VideoWriter(
    video_file,video_codec,fps,(int(cap.get(3)),int(cap.get(4)))
)

#video_file is the file being saved

start = time.time()
i=0
seconds='1'
while cap.isOpened():


    ret,frame = cap.read()
    if ret == True:
        cv2.imshow("frame",frame)
        if time.time() - start > 10:
            print('video > 10 sec')
        
            subprocess.call(['ffmpeg','-i',video_file,'-ss',seconds,'output.avi'])
            break

    # Write the frame to the current video writer
    video_writer.write(frame)
    if i%24 == 0:
        cv2.imwrite('image'+str(i)+'.jpg',frame)
    i+=1
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
else:
    break
cap.release()
cv2.destroyAllWindows()

我要寻找的是如何使实时视频跳闸并继续保存将来的帧,以便视频不超过30秒并保持最新的帧。

解决方法

您可以使用segment muxer

ffmpeg -i input -f segment -segment_time 30 -segment_wrap 2 -reset_timestamps 1 output_%d.avi

这将创建两个文件:output_0.avioutput_1.avi。每30秒输出将在这些文件之间切换并覆盖早期版本。

您可以使用-segment_wrap 1并仅输出1个文件,但可能会丢失视频。例如,停止录制32秒将使您获得2秒的视频,而不是30秒的视频+ 2秒的视频。