m3u8下载后的TS视频合并脚本工具
本工具的来源是因为分析极客时间上的缓存视频,缓存的视频是ts分片,而且每个分片内部的数据都使用变化的AES秘钥加密。关于解密视频的过程在此忽略,正常情况视频是收费的,不宜公开。
我们关注视频解密后的后处理过程,如何把视频分片快速无损的合并为MP4。
开始也网上也找了些,有包装界面的,结果都各种小问题,不是很好用,都把简单的问题搞复杂了。
于是用python继续写了ts合并部分功能,抽离出来分享给大家使用。
说明:
1. 合并的本质还是一下FFMPEG,请自行去官网下载放置脚本能找到的位置
2. python使用3.9版本,python 2已经不用再去支持了,没意义,要向前看
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
def run_cmd(s_cmd):
print(s_cmd)
assert(0==os.system(s_cmd))
def takeFilePathName(filepath):
return os.path.basename(filepath)
def autoMergeTsFileToMp4(inputDir, outDir):
if not os.path.isdir(inputDir):
return
files = os.listdir(inputDir)
tsFiles = []
for file in files:
filepath = os.path.join(inputDir, file)
if os.path.isdir(filepath):
autoMergeTsFileToMp4(filepath, outDir)
else:
tsFiles.append(filepath)
if len(tsFiles)<=0:
return
tsDirName = os.path.basename(inputDir)
tsFileListPath = '{0}.txt'.format(inputDir)
if not os.path.isdir(outDir):
os.makedirs(outDir)
mergeFilePath = os.path.join(outDir,'{0}.mp4'.format(tsDirName))
with open(tsFileListPath,'w') as f:
tsFiles.sort(key=takeFilePathName)
for filePath in tsFiles:
f.write("file '{0}'\n".format(filePath))
isTsFile = tsFiles.endswith('.ts')
if not isTsFile:
return
binFfmpeg='ffmpeg'
s_cmd = '{0} -f concat -safe 0'.format(binFfmpeg)
s_cmd += ' -i {0} -c copy {1}'.format(tsFileListPath,mergeFilePath)
run_cmd(s_cmd)
def main():
videoRootDir = 'D:\\极客时间\\video-data'
outTsDir = os.path.join(videoRootDir,'outx','ts')
outMp4Dir = os.path.join(videoRootDir,'outx','mp4')
autoMergeTsFileToMp4(outTsDir, outMp4Dir)
if __name__ == '__main__':
main()
不,我关注的就是解密过程 前段时间也整了个类似的,其实那些小视频片段,直接全部用二进制格式写到一起就行了,不用ffmpeg都行,不过这样直接合出来的是TS格式,我就直接播TS了 感谢楼主,我以前用易语言写过居于ffmpeg的 看不懂还用不了 学习一下 学习一下了 看不懂 但是觉得很牛拜
ynboyinkm 发表于 2021-9-21 15:58
感谢楼主,我以前用易语言写过居于ffmpeg的
他这个也是用的ffmpeg呀
{:301_996:} 试试看这个工具好不好合并