最代码广告位
Smail_的gravatar头像
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.完毕


打赏

已有1人打赏

最代码官方的gravatar头像
最近浏览
wang_shao LV42019年8月12日
月亮
zhuohongxiang2019年7月24日
暂无贡献等级
11ccvvbb LV62019年5月25日
月亮星星星星
yufan LV22019年5月15日
星星星星
cs3834501392019年3月22日
暂无贡献等级
dajiaman2019年1月2日
暂无贡献等级
8778011312018年10月27日
暂无贡献等级
牛大爷 LV112018年9月21日
月亮月亮星星星星星星
glgugk2018年8月21日
暂无贡献等级
chinaxc2018年7月26日
暂无贡献等级
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友