以指定的时间间隔录制视频,然后将它们保存到文件 OpenCv Python

Posted

技术标签:

【中文标题】以指定的时间间隔录制视频,然后将它们保存到文件 OpenCv Python【英文标题】:Recording video in specified time intervals and then saving them into file OpenCv Python 【发布时间】:2019-08-20 00:44:40 【问题描述】:

这是我的目标。

    连续捕捉视频直到'q;被按下 每隔十秒将视频保存在创建的目录文件中 继续第二步,直到按下“q”

我正在执行以下代码。但是在创建文件时,它会创建 6kb 的文件并说无法播放。我对opencv和python相当陌生。不知道我错过了什么。使用 Python 3.6 在 pycharm 上运行此代码。还有

cv2.imshow('frame',frame)

十秒后停止,但正在后台进行录制并创建文件。

import numpy as np
import cv2
import time
import os
import random
import sys


fps=24
width=864
height=640
video_codec=cv2.VideoWriter_fourcc('D','I','V','X')

name = random.randint(0,1000)
print (name)
if (os.path.isdir(str(name)) is False):
    name = random.randint(0,1000)
    name=str(name)

name = os.path.join(os.getcwd(), str(name))
print('ALl logs saved in dir:', name)
os.mkdir(name)


cap = cv2.VideoCapture(0)
ret=cap.set(3, 864)
ret=cap.set(4, 480)
cur_dir = os.path.dirname(os.path.abspath(sys.argv[0]))


start=time.time()
video_file_count = 1
video_file = os.path.join(name, str(video_file_count) + ".avi")
print('Capture video saved location : '.format(video_file))


while(cap.isOpened()):
    start_time = time.time()
    ret, frame = cap.read()
    if ret==True:
        cv2.imshow('frame',frame)
        if (time.time() - start > 10):
            start = time.time()
            video_file_count += 1
            video_file = os.path.join(name, str(video_file_count) + ".avi")
            video_writer = cv2.VideoWriter(video_file,video_codec, fps,(int(cap.get(3)),int(cap.get(4))))
            time.sleep(10)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

我想要包含录制视频的文件。文件已生成,但大小为 6kb,并且没有记录任何内容。

【问题讨论】:

在***.com/questions/56759785/…查看nathancy的回答 【参考方案1】:

你快到了!鉴于我了解您的目标是什么,并且对您的代码所做的更改最少,这对我有用。

这将每十秒写入一个新的视频文件,同时将每一帧记录到当前视频中。

import numpy as np
import cv2
import time
import os
import random
import sys


fps = 24
width = 864
height = 640
video_codec = cv2.VideoWriter_fourcc("D", "I", "V", "X")

name = random.randint(0, 1000)
print(name)
if os.path.isdir(str(name)) is False:
    name = random.randint(0, 1000)
    name = str(name)

name = os.path.join(os.getcwd(), str(name))
print("ALl logs saved in dir:", name)
os.mkdir(name)


cap = cv2.VideoCapture(0)
ret = cap.set(3, 864)
ret = cap.set(4, 480)
cur_dir = os.path.dirname(os.path.abspath(sys.argv[0]))


start = time.time()
video_file_count = 1
video_file = os.path.join(name, str(video_file_count) + ".avi")
print("Capture video saved location : ".format(video_file))

# 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)))
)

while cap.isOpened():
    start_time = time.time()
    ret, frame = cap.read()
    if ret == True:
        cv2.imshow("frame", frame)
        if time.time() - start > 10:
            start = time.time()
            video_file_count += 1
            video_file = os.path.join(name, str(video_file_count) + ".avi")
            video_writer = cv2.VideoWriter(
                video_file, video_codec, fps, (int(cap.get(3)), int(cap.get(4)))
            )
            # No sleeping! We don't want to sleep, we want to write
            # time.sleep(10)

        # Write the frame to the current video writer
        video_writer.write(frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

【讨论】:

非常感谢。让这段代码工作,现在也发现了问题。非常感谢! 我用过这段代码。我只想保存最新的 30 秒视频。假设视频长度为 31 秒,那么它应该只保存视频的 sec2 到 sec 31。我怎样才能做到这一点。 @安德烈亚斯【参考方案2】:

表示正在以 6 kb 接收视频,这是编解码器出错。需要下载opencv_ffmpeg.dll,放到Python3.2.1文件夹下,重命名为opencv_ffmpeg321.dll

这解决了我的问题,在此之前,无论我做什么,都会创建 5.6 kb 的视频。但问题比看起来更深,它仍然可能与流和录制的分辨率不匹配有关。

对于 OpenCV 版本 X.Y.Z opencv_ffmpeg.dll ==> opencv_ffmpegXYZ.dll

对于 64 位版本的 OpenCV X.Y.Z opencv_ffmpeg.dll ==> opencv_ffmpegXYZ_64.dll

【讨论】:

以上是关于以指定的时间间隔录制视频,然后将它们保存到文件 OpenCv Python的主要内容,如果未能解决你的问题,请参考以下文章

以 mp4 格式录制、保存和/或转换视频?

如何将音频文件复制到另一个文件

以字节格式录制和播放视频

如何将 UIImage 保存到文档目录?

如何在视频中添加音频?

在 Flutter 中将视频文件保存到设备