马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
首先,确保你已经安装了ffmpeg。
然后再次保证所有ts文件放在同一个文件夹中,而且依次命名为 1.ts 、 2.ts 、 3.ts 、 4.ts 、 4.ts 。。。
Python完备代码如下:(ffmpeg_batch_merge_ts.py文件)
- #!/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');
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |