python 批量ts合并成一个mp4

首先,确保你已经安装了ffmpeg

然后再次保证所有ts文件放在同一个文件夹中,并且依次命名为 1.ts 、 2.ts 、 3.ts 、 4.ts 、 4.ts 。。。

Python完整代码如下:(ffmpeg_batch_merge_ts.py文件)

python 复制代码
#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import os


# # 设置包含.ts文件的目录。
# ts_directory = '/path/to/ts/files';

# # 遍历目录中的所有.ts文件。
# for filename in os.listdir(ts_directory):
#     if filename.endswith('.ts'):
#         # 构建源文件和目标文件的路径。
#         source_path = os.path.join(ts_directory, filename);
#         target_path = os.path.join(ts_directory, os.path.splitext(filename)[0] + '.mp4');
#
#         # 构建ffmpeg命令并运行。
#         ffmpeg_command = f'ffmpeg -i "{source_path}" "{target_path}"';
#         os.system(ffmpeg_command);


def is_no_ignore(ignore_id_tuple, the_id):
    for x in ignore_id_tuple:
        if x == the_id: return False;
    return True;


# 定义函数。
def file_copy(source_path, target_path):
    print('file_copy');
    with open(source_path, "rb") as source_file:
        with open(target_path, "wb") as target_file:
            target_file.write(source_file.read());


# 设置包含.ts文件的目录。
# ts_directory = '/path/to/ts/files';
ts_directory = '';
while len(ts_directory) == 0:
    # 在Python中, 你可以使用input()函数来获取键盘输入。
    ts_directory = input('请输入ts文件所在的目录: ');
os.system(f'cd "{ts_directory}" && pwd');
# 由于ffmpeg一次合并的ts数量不能过大, 否则合并失败, 因此需要限制。
ts_number_per_group = 100;
ts_count = 0;
while ts_count <= 0:
    try:
        ts_count = int(input('请输入ts的数量: '));
    except ValueError:
        print('[Error] 您输入的数量不是整数!')
# ts_ignore_id_list = [120, 121, 122, 123, 124, 455, 456, 457, 458, 459];
# ts_ignore_id_tuple = (120, 121, 122, 123, 124, 455, 456, 457, 458, 459);
ts_ignore_id_tuple = ();
if ts_count > ts_number_per_group:
    ts_group_count = (ts_count + ts_number_per_group - 1) // ts_number_per_group;
    print('分组组数:', ts_group_count);
    final_ffmpeg_input = '';
    for group_index in range(ts_group_count):
        group_id = group_index + 1;
        print('第', group_id, '组开始');
        ts_start_id = ts_number_per_group * group_index + 1;
        ts_end_id = ts_number_per_group * (group_index + 1);
        if ts_end_id > ts_count: ts_end_id = ts_count;
        ffmpeg_input = '';
        for ts_id in range(ts_start_id, ts_end_id):
            # print(group_id, ts_id);
            if is_no_ignore(ts_ignore_id_tuple, ts_id):
                ffmpeg_input += f'{ts_id}.ts|';
            else:
                print('Ignore_id', ts_id);
        else:
            if is_no_ignore(ts_ignore_id_tuple, ts_id):
                ffmpeg_input += f'{ts_end_id}.ts';
            else:
                ffmpeg_input = ffmpeg_input[0:len(ffmpeg_input) - 1];
        print(ffmpeg_input);
        if ffmpeg_input.find('|') != -1:
            # 一个组内ts合并。
            os.system(f'cd "{ts_directory}" && ffmpeg -i "concat:{ffmpeg_input}" -c copy temp_{group_id}.mp4');
            # 把 一个组内ts合并的mp4 转成 temp.ts 。
            os.system(
                f'cd "{ts_directory}" && ffmpeg -i temp_{group_id}.mp4 -codec copy -vbsf h264_mp4toannexb temp_{group_id}.ts');
        else:
            file_copy(f'{ts_directory}/{ffmpeg_input}', f'{ts_directory}/temp_{group_id}.ts');
        final_ffmpeg_input += f'temp_{group_id}.ts|';
        print('第', group_id, '组结束');

    final_ffmpeg_input = final_ffmpeg_input[0:len(final_ffmpeg_input) - 1];
    print(final_ffmpeg_input);
    # 把 合成的组temp.ts 再次合并。
    os.system(f'cd "{ts_directory}" && ffmpeg -i "concat:{final_ffmpeg_input}" -c copy target.mp4');
else:
    print('only one group');
    ffmpeg_input = '';
    for ts_id in range(1, ts_count):
        # print(group_id, ts_id);
        if is_no_ignore(ts_ignore_id_tuple, ts_id):
            ffmpeg_input += f'{ts_id}.ts|';
        else:
            print('Ignore_id', ts_id);
    ffmpeg_input += f'{ts_count}.ts';
    print(ffmpeg_input);
    # 一个组内ts合并。
    os.system(f'cd "{ts_directory}" && ffmpeg -i "concat:{ffmpeg_input}" -c copy target.mp4');

print('track_main_exit');
相关推荐
蔷薇のぬ5 分钟前
Python 使用pandas库实现Excel字典码表对照自动化处理
python·pandas
奔跑吧邓邓子8 分钟前
从0到1学PHP(三):PHP 流程控制:掌控程序的走向
开发语言·php·流程控制
青衫客3610 分钟前
LLM—— 基于 MCP 协议(SSE 模式)的工具调用实践
python·大模型·llm
Ly2020Wj13 分钟前
pytorch入门:利用pytorch进行线性预测
人工智能·pytorch·python
R-G-B17 分钟前
【31】C# WinForm入门到精通 ——保存文件SaveFileDialog 【属性、方法、事件、实例、源码】
开发语言·c#·c# winform·c#保存文件·savefiledialog
啊阿狸不会拉杆26 分钟前
《Java 程序设计》第 11 章 - 泛型与集合
java·开发语言·jvm·数据结构·算法
懒大王爱吃狼36 分钟前
PyCharm功能及安装使用教程
ide·python·pycharm·python基础·python教程·pycharm安装·pycharm使用
芷栀夏42 分钟前
如何通过IT-Tools与CPolar构建无缝开发通道?
网络·人工智能·python
小白要加油努力1 小时前
C++-STL-String重点知识
开发语言·c++
OKkankan3 小时前
string类的模拟实现
开发语言·数据结构·c++·算法