ffmpeg——同时剪辑多个视频并合并

基本语法

所用的ffmpeg的语法:

1.剪辑单个视频

ffmpeg -i [2021-11-24-1-2.mp4] -vcodec copy -acodec copy -ss [00:00:00] -to [00:00:05] [output/p3.mp4][ ]中三个参数依次为:剪辑视频源文件;第一个时间为剪辑的起始时间;第二个时间为视频持续的时间长度; 剪辑好的文件名

2.合并视频片段

ffmpeg -f concat -safe 0 -i [cutfiles.txt] -c copy [output_all.mp4]参数一为合并文件的目录txt,参数二为合并后的文件名。

功能需求

本次记录如何使用ffmpeg对多路视频按照不同时刻区间进行一次性快速剪辑,同时合成剪辑片段。

首先准备好要剪辑的视频文件:

以及需要剪辑的时间片段,采用以下形式:

其中times的value可以是xx:xx:xx-xx:xx:xx或者 xx:xx-xx:x

代码实现

test.py:

# coding=utf-8
import os, re

#剪辑参数,时间可以为4:25-4:29 或者00:04:25-00:04:29 注意字符格式
v1 = {
    'name': '2728',
    'times': ['4:25-4:29' , '13:28-13:37',]
}

v2 = {
    'name': '2906',
    'times': ['4:50-4:55' , '10:37-10:42',]
}

v3 = {
    'name': '2915',
    'times': ['1:38-1:54' , '5:00-5:06' , '6:32-6:39', '8:36-8:43', '12:00-12:06', ]
}

v4 = {
    'name': '3100',
    'times': ['1:40-1:46','4:23-4:26', '5:29-5:34', '7:10-7:17', '9:54-10:03','12:00-12:07',]
}

v5 = {
    'name': '3101',
    'times': ['15:14-15:20',]
}

# 剪辑单个视频
def cut_video(source_file, begin, continuous, output_file):
    # []中三个参数依次为: 剪辑视频源文件  第一个时间为剪辑的起始时间  第二个时间为视频持续的时间长度 剪辑好的文件名
    # ffmpeg -i [2021-11-24-1-2.mp4] -vcodec copy -acodec copy -ss [00:00:00] -to [00:00:05] [output/p3.mp4]
    ffmpeg_com = 'ffmpeg -i ' + source_file + ' -vcodec copy -acodec copy -ss ' + begin + ' -t ' + continuous + ' ' + output_file
    os.system(ffmpeg_com)

# 循环剪辑一个视频中的不同片段
def cut_videos(videos_info):
    #剪切时间
    time_lines = videos_info['times']
    #所属视频文件名
    file_name = videos_info['name']
    for i in range(len(time_lines)):
        time_line = time_lines[i]
        begin, continuous = get_time_parm(time_line)
        #剪切的初始视频     路径要对应上自己的文件路径!
        source_file = './'+file_name + '.mp4'
        #输出的视频文件(存入文本中,后续用于合成该文本那种的所有文件对应的片段)
        output_file = './output/' + file_name + '-p' + str(i) + '.mp4'
        f1 = open('cutfiles.txt', 'a+')
        f1.write('file ' + "'"+output_file+"'" + '\n')
        f1.close()
        cut_video(source_file, begin, continuous, output_file)

# 将时间格式转换为秒数    02:48->168 或 2:48->168 或 01:12:11->4331 或 1:12:11->4331
def time_str_2_seconds(time_str):
    # print('time_str_2_seconds get time_str->',time_str)
    time_list = time_str.split(':')
    if len(time_list)==2:
        return int(time_list[0]) * 60 + int(time_list[1])
    elif len(time_list)==3:
        return int(time_list[0]) * 3600 + int(time_list[1]) * 60 + int(time_list[2])

# 输入秒数转换成标准的时间参数  30 -> 00:00:30   8126->02:15:26
def seconnds_2_time(seconds):
    h=int(seconds/3600)
    if h>=0 and h<10:
        H="0"+str(h)
    else:
        H=str(h)
    a=seconds%3600
    m=int(a/60)
    if m>=0 and m<10:
        M="0"+str(m)
    else:
        M=str(m)
    s=a%60
    if s>=0 and s<10:
        S="0"+str(s)
    else:
        S=str(s)
    return H+":"+M+":"+S

# 将输入的 2:48-2:55格式的时间 --》 转换成ffmpeg所需的 开始时间00:02:28 和持续时间00:00:07的格式
def get_time_parm(time_parm):
    # 1 拆分  2:48-2:55 =》   2:48 和  2:55
    m = re.match(r'^([0-9]*:[0-9]*)-([0-9]*:[0-9]*)', time_parm)
    begin_parm = m.group(1)  # 2:48
    end_parm = m.group(2)  # 2:55

    # 2 计算持续时间   2:48 和  2:55 =》 00:00:07
    # 2.1 全换成秒
    begin_int = time_str_2_seconds(begin_parm)  # 168
    end_int = time_str_2_seconds(end_parm)  # 175
    print(begin_int,end_int)
    # 2.2 7秒 =》 00:00:07
    continuous_int = end_int - begin_int  # 7
    continuous = seconnds_2_time(continuous_int)  # 00:00:07
    # 3 2:48=>00:02:48
    # 3.1 2:48=>168
    seconds_begin = time_str_2_seconds(begin_parm)
    # 3.2 168=>00:02:48
    begin = seconnds_2_time(seconds_begin)
    return [begin, continuous]

#合并剪辑好的视频
def concat_videos():#参数一为合并文件的目录txt,参数二为合并后的文件名
    ffmpeg_command = 'ffmpeg -f concat -safe 0 -i cutfiles.txt -c copy output_all.mp4'
    os.system(ffmpeg_command)

if __name__ == "__main__":
    #建立文件夹存放剪辑结果
    outpath='./output/'
    if not os.path.exists(outpath):
        os.mkdir(outpath)

    #循环剪辑多路视频
    list=[v1, v2, v3, v4, v5,]
    for v in list:
        print(v)
        cut_videos(v)
    #合并视频
    concat_videos()

效果展示

原文 ffmpeg--同时剪辑多个视频并合并_ffmpeg合并多个视频_小屋*的博客-CSDN博客

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/130649918