从指定的起点和终点剪切C ++ OpenCV中的视频

时间:2017-06-09 15:30:47

标签: opencv video ffmpeg

我想从指定的起点和终点剪辑C ++ OpenCV中的视频。我知道我们可以使用以下VideoCapture属性来实现此目的。

CV_CAP_PROP_POS_MSEC or `CV_CAP_PROP_POS_FRAMES`

但是,如何使用上述任何一种属性精确剪辑视频并将其写入另一个视频文件?我没有找到任何方法从指定的相对位置(毫秒)或相对帧索引读取视频文件。

3 个答案:

答案 0 :(得分:0)

创建视频文件的VideoCapture后,您可以使用属性CV_CAP_PROP_FPS并轻松计算要剪切的剪辑的开始和结束时间的帧编号。

只需使用VideoWriter属性set创建CV_CAP_PROP_POS_FRAMES初始时间的帧编号,然后开始向VideoWriter添加帧,直至到达第二个帧编号你之前计算过的。

答案 1 :(得分:0)

我最近正在研究一些这样的简单工具。它为我构建和运行没有任何问题。你走了:

Column

答案 2 :(得分:0)

注意

使用CAP_PROP_POS_MSEC可能更人性化。

我编写以下Python代码从源中剪辑视频。

Python代码

import cv2 as cv
import argparse

def parse_args():
    parser = argparse.ArgumentParser(description="Video clip")
    parser.add_argument('--input', required=True, type=str, help="Input video")
    parser.add_argument('--output', required=True, type=str, help="Output Video")
    parser.add_argument('--start', required=True, type=float, help="Start time in seconds")
    parser.add_argument('--duration', required=True, type=float, help="Duration time in seconds")
    args = parser.parse_args()
    return args


def video_clip(args):
    vid = cv.VideoCapture(args.input)
    target_fps = vid.get(cv.CAP_PROP_FPS)
    target_width = round(vid.get(cv.CAP_PROP_FRAME_WIDTH))
    target_height = round(vid.get(cv.CAP_PROP_FRAME_HEIGHT))
    frame_count = round(vid.get(cv.CAP_PROP_FRAME_COUNT))
    # # Notice: This is not actually length of video, this might be longer
    # # Check v1.set(cv.CAP_PROP_POS_AVI_RATIO, 0 or 1) for more information
    video_length = frame_count / target_fps

    out = cv.VideoWriter(args.output, cv.VideoWriter_fourcc(*'mp4v'), target_fps, (target_width, target_height))

    time_start = max(0, args.start)
    time_stop = min(args.duration + time_start, video_length) * 1000

    vid.set(cv.CAP_PROP_POS_MSEC, time_start * 1000)
    while vid.get(cv.CAP_PROP_POS_MSEC) < time_stop :
        ret, frame = vid.read()
        out.write(frame)
    vid.release()
    out.release()


if __name__ == "__main__":
    args = parse_args()
    video_clip(args)

用法

要剪辑视频,只需使用以下命令:

python video_clip.py --input input.mp4 --output output.mp4 --start 10 --duration 10
  • --input:输入视频
  • --output:输出视频
  • --start:以秒为单位的开始时间
  • --duration:持续时间,以秒为单位