首页 > 技术文章 > Python下载未加密的m3u8文件(流媒体文件)

fangtingfei 2019-02-11 21:45 原文

    很多时候我们用手机浏览器缓存视频时发现缓存下来的文件后缀是.m3u8格式的,按文件目录找过去发现是一个几十K大小的系统不可读的文件,那我们缓存下来的文件去哪儿了呢?

    其实.m3u8文件就相当于一个协议,将文件后缀名更改为.txt可用记事本打开查看。m3u8文件的机理是将整个视频分割成无数个小视频,后缀为.ts,然后通过m3u8文件协议将这些小视频拼接起来播放。在m3u8格式文件所在的文件夹中有一个与之对应的隐藏文件夹,该文件夹是以“.”开头,系统文件管理是无法查看到的,可以下载ES文件管理器设置显示隐藏文件夹查看,该文件夹中存放着很多.ts文件。这块儿暂不讨论,本文以下载央视官网小视频为例实现未加密的m3u8文件的下载。

    如打开   http://tv.cctv.com/2019/02/05/VIDEJ4nYbZYMdVo94X11hwaL190205.shtml   下载小品“‘儿子’来了”:

    打开控制台,点击播放按钮,在Network下可以看到不断加载的资源:


 

     可见不断有.ts文件加载出来,并且文件名是呈数字递增的方式变化的。

 

     点开几个.ts文件,观察URL,发现不同ts文件的URL也只是最后的数字不同,可根据规律拼接URL。网址栏加载URL可以自动下载Ts文件并可打开播放小视频片段。由此可以拼接URL将所有小的ts文件下载到本地,再将这些ts文件按顺序拼接成MP4文件,就可以得到完整的MP4文件。

    下面贴出我的代码,没有使用进程池,大文件可以考虑使用进程池加快下载的速度!

#Autor: 房廷飞
#Data:  2019.2.11

import requests
import os
global a
import time
a=0

def downts(path,url,i):
    global a
    try:
        header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
        response=requests.get(url,headers=header,timeout=5)
        if response.status_code==200:
            ret=response.content
            with open(path+'/%03d.ts'%i,'wb')as f:
                f.write(ret)
                print(url+'下载完成!')
        else:
            print(url)
            print(response.status_code)
            a=a+1
            if a==3:                                 #连续三次连接不到资源地址,说明所有小ts文件都已经下载完,结束程序。
                exit('预计已结束,程序自动退出')
    except Exception as e:
        print(e)
        
def main(URL):
    path="C:/Users/user/Desktop/python测试/2"         #下载地址
    for i in range(10000):                           #设置资源数量
        url=URL+"%d.ts"%i                            #拼接ts文件的URL地址,通常有“%d”和“%03d”两种
        if not os.path.exists(path+'/%03d.ts'%i):
            downts(path,url,i)
            time.sleep(0)                            #设置延时处

def getURL():   #输入拼接资源URL,最后变化之外的部分
    URL="http://asp.cntv.qingcdn.com/asp/hls/2000/0303000a/3/default/b70ddc511cc44f92be0fb3c398473fbc/"
    main(URL)
    
getURL()

            #本程序可以作为下载未加密m3u8格式文件的模板,其他URL文件只需更改getURL函数中的URL即可!
            #另外大文件可以通过使用进程池加快下载速度!

    运行代码,下载所有小 ts文件:


    然后在该文件夹下打开命令行,输入指令:copy /b *.ts 合成.mp4      回车即可合成完整MP4文件。

  #本程序可以作为下载未加密m3u8格式文件的模板,其他URL文件只需更改getURL函数中的URL和小ts文件URL的拼接规则即可!
  #另外大文件可以通过使用进程池加快下载速度!

 

  本程序只适用于未加密的m3u8文件,还有少量m3u8视频是通过AES加密的,加密文件的下载改天再整理发布!

 

      2019-02-11    21:42:39    房廷飞      Come on!     期待明天更好的自己!

 

推荐阅读