我们公司主要从事线上音乐教育,比较看中直播生成的录像回放质量
讲师生成的 m3u8 回放,前面 4 分钟没有声音
截掉前 4 分钟的无声音视频,并把剩余的 ts 视频合成 mp4 文件;脚本语言: python
把 m3u8 中所有的 ts 文件下载到本地,这个时候 python 库的强大就体现出来了
https://github.com/globocom/m3u8.git,
提供了读取 m3u8 内部文件信息的库
"""
获取m3u8ts文件
"""
def getM3u8(url):
m3u8_obj = m3u8.load(url) # this could also be an absolute filename
ts_url_list = []
base_uri = m3u8_obj.base_uri
ts_list = m3u8_obj.files
for _ts in ts_list:
ts_url = base_uri + _ts
ts_url_list.append(ts_url)
# print ts_url
# response = requests.head(ts_url)
# if response.status_code == 200:
# print "URL 没问题"
return ts_url_list
下载 ts 文件到指定路径,并手动删除出现问题的几个 ts 文件
"""
下载ts文件
"""
def download_movie(movie_url, _path):
os.chdir(_path)
print '>>>[+] downloading...'
print '-' * 60
error_get = []
for _url in movie_url:
# ts视频的名称
# movie_name = _url.split('/')[-1][-6:]
movie_name = str(_url.split("/")[7]).split("?")[0]
try:
# 'Connection':'close' 防止请求端口占用
# timeout=30 防止请求时间超长连接
movie = requests.get(_url, headers = {'Connection':'close'}, timeout=60)
with open(movie_name, 'wb') as movie_content:
movie_content.writelines(movie)
print '>>>[+] File ' + movie_name + ' done'
# 捕获异常,记录失败请求
except:
error_get.append(_url)
continue
# 如果没有不成功的请求就结束
if error_get:
# print u'共有%d个请求失败' % len(file_list)
print '-' * 60
download_movie(error_get, _path)
else:
print '>>>[+] Download successfully!!!'
采用 ffmpeg 方式 ,输出合并 ts 文件的命令
"""
合并ts文件,输出执行语句
ls * | perl -nale 'chomp;push @a, $_;END{printf "ffmpeg -i \"concat:%s\" -acodec copy -vcodec copy -absf aac_adtstoasc out.mp4\n", join("|",@a)}'
"""
def hebing(path,outfile):
filelist = []
for file in os.listdir(path):
if len(file.split(".")) == 2:
if file.split(".")[1] == 'ts':
filelist.append(path + file)
str = '|'.join(filelist)
cmd_str = 'ffmpeg -i \"concat:' + str + '\" ' + '-acodec copy -vcodec copy -absf aac_adtstoasc ' + path + outfile
print cmd_str
return cmd_str
运行 shell 命令
"""
运行ffmpeg
"""
def runConvertMp4(cmd_str):
str_env = "/Users/huqingen/Desktop/Finger/tool/ffmpeg/"
str_cmd = str_env + cmd_str
print str_cmd
subprocess.call(str_cmd, shell=True)
main 方法运行
if __name__ == "__main__":
url = "http://xxxxxx.com/xxxx.m3u8?auth_key=xxxxx"
path = "/opt/ts/"
ts_url_list = getM3u8(url)
download_movie(ts_url_list,path)
cmd_str = hebing(path,"out.mp4")
runConvertMp4(cmd_str)