下面这个是没有加密的m3u8文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:11785
#EXT-X-TARGETDURATION:11
#EXTINF:10.560,
cctv1_2md/1602814775_5190881.ts
#EXTINF:10.560,
cctv1_2md/1602814786_5190882.ts
#EXTINF:10.880,
cctv1_2md/1602814797_5190883.ts
#EXTINF:10.880,
cctv1_2md/1602814808_5190884.ts
#EXTINF:10.560,
cctv1_2md/1602814818_5190885.ts
下面这个是加密的m3u8文件
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:3 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:METHOD=AES-128,URI="https://hey07.cjkypo.com/20220223/MKPjICFW/1100kb/hls/key.key" #EXTINF:2.5, https://hey07.cjkypo.com/20220223/MKPjICFW/1100kb/hls/9QH3yPzu.ts #EXTINF:1.667, https://hey07.cjkypo.com/20220223/MKPjICFW/1100kb/hls/NuS3IonQ.ts #EXTINF:2.383, https://hey07.cjkypo.com/20220223/MKPjICFW/1100kb/hls/0qTxIM8x.ts
每个字段含义如下:
#EXTM3U //必需,表示一个扩展的m3u文件,并且必须在文件的第一行,所有的M3U8文件中必须包含这个标签。
#EXT-X-VERSION:3 //hls的协议版本号,暗示媒体流的兼容性,常见的是3(目前最高版本应该是7)。
#EXT-X-MEDIA-SEQUENCE:xx //M3U8直播是的直播切换序列,当播放打开M3U8时,以这个标签的值作为参考,播放对应的序列号的切片。
#EXT-X-ALLOW-CACHE:NO //是否缓存
#EXT-X-TARGETDURATION:5 //每个视频分段最大的时长(单位秒)
#EXT-X-DISCONTINUITY //表示换编码
#EXTINF:
#EXT-X-KEY:METHOD=AES-128,URI="http://****/key.key" //这个是提示时加密文件,key值就从后面的URI下载,METHOD是加密方式。
BANDWIDTH:BANDWIDTH的值为最高码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的最大码率(必要参数)。
CODECS:CODECS的值用于声明EXT-X-STREAM-INF下面对应M3U8里面的音视频编码、视频编码的信息(可选参数)。
FRAME-RATE:子M3U8中的视频帧率(可选参数)。
特别说明下,偶尔才能遇见
#EXT-X-STREAM-INF:RESOLUTION=1920x1080,FRAME-RATE=30,CODECS="avc1.640028,mp4a.40.2"
https://xxx.com/index.m3u8
格式
#EXT-X-STREAM-INF:
说明
#EXT-X-STREAM-INF:代表不同的播放流,
后面是属性列表,如上面的FRAME-RATE=30
下面一行是链接地址
关于客户端播放M3U8的标准还有更多的讲究,下面我们来介绍一些:
下面我们再说下,我们是怎么解析到需要下载的ts文件链接的
- import threading
- import requests
- import time
- from queue import Queue
- import copy
- # 取消ssl验证
- import urllib3
- urllib3.disable_warnings()
-
- #超出连接数,所以设置强制连接数
- requests.adapters.DEFAULT_RETRIES = 1
- s = requests.session()
- s.keep_alive = False
-
-
- def parse_ts(data):
- try:
- data = str(data)
- finish_data = []
- for line in data.split('\n'):
- if line.endswith('.ts'):
- finish_data.append(line)
- elif line.find('.ts?') >= 0:
- finish_data.append(line)
- else:
- print('*'*20+'\n'+'解析错误,未解析到需要的ts文件,具体内容如下:'+line+'\n'+'*'*20)
- except Exception as e:
- import traceback
-
- traceback.print_exc()
- print('*'*20+"报错" * 50+'*'*20)
- finally:
- return finish_data
-
-
-
- if __name__ == '__main__':
- # 获取m3u8的url,根据url获取ts列表
- res = requests.get(base_url,verify = False)
- if res.status_code == 200:
- ts_list = parse_ts(res.text)
- print(ts_list)
- else:
- print("请求m3u8文件错误")