很多时候我们用手机浏览器缓存视频时发现缓存下来的文件后缀是.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! 期待明天更好的自己!