12

i have a small question. Is it possible to add (append) new frames to an existing .avi video file using OpenCV, without overwriting the whole file ? I am using OpenCV2.4.2 on Windows7, with QT.

Adrian
  • 178
  • 2
  • 10
  • 5
    Nope. You have to load all the video with VideoCapture, and rewrite everything, then add your frames. For more efficient ways to do it, have a look at ffmpeg. It's a command line utility that can split, merge extract frames from video, transcode, etc – Sam Aug 30 '12 at 10:53
  • "OpenCV4adnroid doesn’t support video reading and writing. Save a sequence of images then encode a video from this sequence from java" http://stackoverflow.com/questions/21546906/how-to-open-cvvideowriter-in-android – profimedica Dec 04 '15 at 00:59
  • 1
    Here's how to do it with ffmpeg https://stackoverflow.com/questions/18452058/ffmpeg-concat-videos-and-images – sziraqui Jan 30 '18 at 09:01

2 Answers2

0

If you want to use OpenCV, you have to read and write all the data content.

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.")
SolessChong
  • 2,997
  • 7
  • 38
  • 63
-3

Have a look at the VideoWriter class.

flix
  • 611
  • 4
  • 9