其实用的还是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
def customeSort(arr): i = arr.index('_') 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
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)
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
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
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')
def customeSort(arr): i = arr.index('_') return int(arr[5:i]), arr[i:]
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)
write_file_path_to_txt(txt_file, ts_file_path_list)
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')
|