Smail_
2017-10-28 11:39:37
开源一段python下载m3u8文件分片的mp4文件的算法
既然是开源,就先上代码,再讲为啥要这么做!
def download_ts_file(m3u8, channel_id, path): if not m3u8: return None if len(m3u8) < 20: return None m3u8 = mytool.get_real_url(m3u8) domain = m3u8.split(".m3u8")[0] m3u8_content = mytool.get_page(m3u8) if not m3u8_content or not m3u8_content.startswith("#"): return None segments = m3u8_content.split("\n") valid_segment = None for segment in segments: if not segment or segment.startswith("#"): continue valid_segment = segment.replace("\r", "").replace("../", "").strip() break if valid_segment: if valid_segment.find('.m3u8') > 0 and valid_segment.find('.ts') < 0: if valid_segment.find("http:") < 0: elements = domain.split('/') for i in range(0, len(elements)): link = '/'.join(elements[0: len(elements) - i]) + '/' + valid_segment content = mytool.get_page(link) if content: return download_ts_file(link, channel_id, path) return download_ts_file(valid_segment, channel_id, path) else: if valid_segment.find("http:") < 0: elements = domain.split('/') for i in range(0, len(elements)): link = '/'.join(elements[0: len(elements) - i]) + '/' + valid_segment file_name = mytool.download_file(link, path + "live.mp4") if file_name: return file_name file_name = mytool.download_file(valid_segment, path + "live.mp4") if file_name: return file_name return None
1.请君自行确定你的m3u8地址是确实可用的
2.m3u8 = mytool.get_real_url(m3u8),回溯真实的m3u8地址,你拿到的可能只是一个302或301地址,301或302地址上是没有ts文件的,所以必须要拿到最终地址
3.解析m3u8文件,m3u8文件参差不齐,缺标签的情况十之八九甚至m3u8里面还是一个m3u8,所以用递归去取真实的m3u8内容
4.下载
5.注意:开源出来的代码是我项目中用的代码,我的需求是只取第一个ts文件,君拿过去需要修改一下,不要只在第一个ts就归入到valid_segment里面,谨记!
6.完毕
评论
最近浏览
wang_shao LV4
2019年8月12日
zhuohongxiang
2019年7月24日
暂无贡献等级
11ccvvbb LV6
2019年5月25日
yufan LV2
2019年5月15日
cs383450139
2019年3月22日
暂无贡献等级
dajiaman
2019年1月2日
暂无贡献等级
877801131
2018年10月27日
暂无贡献等级
牛大爷 LV11
2018年9月21日
glgugk
2018年8月21日
暂无贡献等级
chinaxc
2018年7月26日
暂无贡献等级