使用OpenCV将帧附加到现有视频(.avi)文件

kqhtkvqz  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(133)

是否可以使用OpenCV向现有的.avi视频文件添加(追加)新帧,而不会覆盖整个文件?
我在Windows 7Qt上使用OpenCV 2.4.2。

9w11ddsr

9w11ddsr1#

如果你想使用OpenCV,你必须读写所有的数据内容。

import cv2
import os

# this two lines are for loading the videos.
# in this case the video are named as: cut1.mp4, cut2.mp4, ..., cut15.mp4
# videofiles = [n for n in os.listdir('.') if n[0]=='c' and n[-4:]=='.mp4']
# videofiles = sorted(videofiles, key=lambda item: int( item.partition('.')[0][3:]))

videofiles = [n for n in os.listdir('.') if n[0]=='c' and n[-4:]=='.avi']
videofiles = sorted(videofiles, key=lambda item: int( item.partition('.')[0][3:]))

video_index = 0
cap = cv2.VideoCapture(videofiles[0])

# video resolution: 1624x1234 px
# out = cv2.VideoWriter("video.avi", 
#                       cv2.cv.CV_FOURCC('F','M','P', '4'), 
#                       15, (1624, 1234), 1)

# fourcc = cv2.VideoWriter_fourcc(*'MP4V')
# out = cv2.VideoWriter('cutout.mp4', fourcc, 20, (640, 480))

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('cutout.avi', fourcc, 20.0, (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if frame is None:
        print ("end of video " + str(video_index) + " .. next one now")
        video_index += 1
        if video_index >= len(videofiles):
            break
        cap = cv2.VideoCapture(videofiles[ video_index ])
        ret, frame = cap.read()
    cv2.imshow('frame',frame)
    out.write(frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

print ("end.")

字符串

tzdcorbm

tzdcorbm2#

使用“cv2.VideoCapture”打开现有视频文件。使用不同名称的“cv2.VideoWriter”创建新视频文件。使用“www.example.com()"从现有视频文件中读取帧cap.read。使用writer.write(frame)"将帧写入新视频文件。写入所有现有帧后,将新帧附加到新视频文件。

def append_frames_to_video(existing_video_path, new_frames):
    cap = cv2.VideoCapture(existing_video_path)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    new_video_path = 'appended_video.avi'
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    writer = cv2.VideoWriter(new_video_path, fourcc, fps, (width, height))
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        writer.write(frame)
    for new_frame in new_frames:
        writer.write(new_frame)
    cap.release()
    writer.release()
    os.remove(existing_video_path)
    os.rename(new_video_path, existing_video_path)
existing_video_path = 'existing_video.avi'
new_frames = []
append_frames_to_video(existing_video_path, new_frames)

字符串

zd287kbt

zd287kbt3#

看看VideoWriter类。

相关问题