我想从指定的起点和终点剪辑C ++ OpenCV中的视频。我知道我们可以使用以下VideoCapture属性来实现此目的。
CV_CAP_PROP_POS_MSEC or `CV_CAP_PROP_POS_FRAMES`
但是,如何使用上述任何一种属性精确剪辑视频并将其写入另一个视频文件?我没有找到任何方法从指定的相对位置(毫秒)或相对帧索引读取视频文件。
答案 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代码从源中剪辑视频。
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
:持续时间,以秒为单位