Python合并多个ts视频文件
HDUZN

其实用的还是ffmpeg,之前已经写过笔记了:用ffmpeg合并多个ts视频文件

但是,如果有好多好多的ts文件的话,我又懒得整理这个file.txt(包含每一个ts文件的路径)文件。

于是,想到了用Python来生成这个file.txt文件。

话说,是今天用腾讯视频,发现猫抓出来没有m3u8文件的路径,全部是ts文件。于是,就索性全部下载下来,合并一下算了。(别的下载方法可能还有很多,这个就是可以用来合并多个ts文件的)

Python读取文件夹中所有文件的绝对路径,都很简单的。

比如用Python可以生成这个file.txt如下图所示,然后不管是用Python直接执行下ffmpeg或者用ffmpeg直接执行一条命令就行了。

1.Python获取文件夹中所有ts文件的路径列表

1
2
3
4
file_dir=r'F:\3'
ts_files_dir = file_dir + '\\' + '*.*'
ts_file_path_list = glob.glob(ts_files_dir)
print(len(ts_file_path_list), ts_file_path_list)

这里就有了一个问题,你会发现,ts_file_path_list这个列表中这些文件名想要的顺序并不是你想要的顺序,回头按照这个顺序拼接出来的视频就会有问题了。

直接用列表的sort()方法排序就是默认的排序方法,也是不行的,要用这篇笔记中的方法,给带数字的字符串进行一个排序先:Python 带数字的字符串排序

修改后的代码应该是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
import glob
# 'F:\3\00_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1.ts'
# 因为是绝对路径,所以ts文件前面的字符串是固定的长度,建议放个简单的位置,我这从第5个坐标开始的
def customeSort(arr):
# 查看第一个'_'的位置
i = arr.index('_') # 5
return int(arr[5:i]), arr[i:]

file_dir=r'F:\3'
ts_files_dir = file_dir + '\\' + '*.*'
ts_file_path_list = glob.glob(ts_files_dir)
ts_file_path_list.sort(key=customeSort)
print(len(ts_file_path_list), ts_file_path_list)

这样排序出来就没啥问题了。

2.写入file.txt文件

有了ts_file_path_list后,按照ffmpeg合并多个ts视频文件的file.txt文件样式,直接写入就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
# 把ts文件路径写入file.txt
def write_file_path_to_txt(file_name, ts_file_path_list):
with open(file_name, "w") as f:
for ts_path in ts_file_path_list:
f.write('file ' + "'" + ts_path + "'")
f.write('\n')

ts_file_path_list = [] # 这里先表示一下
file_dir=r'F:\3'
txt_file = file_dir + '\\' + 'file.txt'
# 如果文件存在,删除
if(os.path.exists(txt_file)):
os.remove(txt_file)

# 把ts文件路径写入file.txt
write_file_path_to_txt(txt_file, ts_file_path_list)

3.Python中执行ffmpeg命令

os.system(dos_command)就可以执行命令了。
以下代码就在’F:\3’这个ts文件目录中生成了合并好的视频:a.mp4

1
2
3
4
5
6
7
8
9
import os
file_dir=r'F:\3'
mp4_fie_name='a.mp4'
mp4_fie = file_dir + '\\' + mp4_fie_name
# 用ffmpeg合并全部ts文件为mp4文件,当然这个ffmpeg肯定是添加到系统环境变量了的
# 原命令:ffmpeg.exe -f concat -safe 0 -i file.txt -c copy output.mp4
dos_command = 'ffmpeg.exe -f concat -safe 0 -i ' + txt_file + ' -c copy ' + mp4_fie
print(dos_command)
os.system(dos_command)

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import os, glob

# 把ts文件路径写入file.txt
def write_file_path_to_txt(file_name, ts_file_path_list):
with open(file_name, "w") as f:
for ts_path in ts_file_path_list:
f.write('file ' + "'" + ts_path + "'")
f.write('\n')

# 'F:\3\00_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1.ts'
def customeSort(arr):
# 查看第一个'_'的位置
i = arr.index('_') # 5
return int(arr[5:i]), arr[i:]

# 用ffmpeg合并全部ts文件为mp4文件
def main(file_dir, mp4_fie_name):
txt_file = file_dir + '\\' + 'file.txt'
# 如果文件存在,删除
if(os.path.exists(txt_file)):
os.remove(txt_file)
mp4_fie = file_dir + '\\' + mp4_fie_name

ts_files_dir = file_dir + '\\' + '*.*'
ts_file_path_list = glob.glob(ts_files_dir)
ts_file_path_list.sort(key=customeSort)
print(len(ts_file_path_list), ts_file_path_list)

# 把ts文件路径写入file.txt
write_file_path_to_txt(txt_file, ts_file_path_list)

# 用ffmpeg合并全部ts文件为mp4文件
# 原命令:ffmpeg.exe -f concat -safe 0 -i file.txt -c copy output.mp4
dos_command = 'ffmpeg.exe -f concat -safe 0 -i ' + txt_file + ' -c copy ' + mp4_fie
print(dos_command)
os.system(dos_command)

print('-------------fine!')

main(file_dir=r'F:\3', mp4_fie_name='a.mp4')
  • 本文标题:Python合并多个ts视频文件
  • 本文作者:HDUZN
  • 创建时间:2022-11-29 21:46:27
  • 本文链接:http://hduzn.cn/2022/11/29/Python合并多个ts视频文件/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论