问题描述
我有一个可捕获视频流的网络摄像头。 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.avi
和output_1.avi
。每30秒输出将在这些文件之间切换并覆盖早期版本。
您可以使用-segment_wrap 1
并仅输出1个文件,但可能会丢失视频。例如,停止录制32秒将使您获得2秒的视频,而不是30秒的视频+ 2秒的视频。