• m3u8文件格式讲解,Python解析m3u8文件,并获取在线地址


    1. M3U(Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator)这种文件格式是音视频文件的列表文件,是纯文本文件。你下载下来打开它,播放软件并不是播放它,而是根据它的记录找到网络地址进行在线播放。m3u8就是以utf-8编码的m3u文件

    下面这个是没有加密的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: //EXTINF为M3U8列表中每一个分片的duration,如上面例子输出信息中的第一片的duration为10秒。在EXTINF标签中,除了duration值,还可以包含可选的描述信息,主要为标注切片信息,使用逗号分隔开。
    #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的标准还有更多的讲究,下面我们来介绍一些:

    1. 分片必须是动态改变的,序列不能相同,并且序列必须是增序的。
    2. 当M3U8没有出现EXT-X-ENDLIST标签时,无论这个M3U8列表中有多少分片,播放分片都是从倒数第三片开始播放,如果不满三片则不应该播放。当然如果有些播放器做了特别定制了,则可以不遵照这个原则。
    3. 以播放当前分片的duration时间刷新M3U8列表,然后做对应的加载动作。
    4. 前一片分片和后一片分片有不连续的时候,播放可能会出错,那么需要X-DISCONTINUTY标签来解决这个错误。
    5. 如果播放列表在刷新之后与之前的列表相同,那么在播放当前分片duration一半的时间内在刷新一次。
       

    下面我们再说下,我们是怎么解析到需要下载的ts文件链接的

    1. import threading
    2. import requests
    3. import time
    4. from queue import Queue
    5. import copy
    6. # 取消ssl验证
    7. import urllib3
    8. urllib3.disable_warnings()
    9. #超出连接数,所以设置强制连接数
    10. requests.adapters.DEFAULT_RETRIES = 1
    11. s = requests.session()
    12. s.keep_alive = False
    13. def parse_ts(data):
    14. try:
    15. data = str(data)
    16. finish_data = []
    17. for line in data.split('\n'):
    18. if line.endswith('.ts'):
    19. finish_data.append(line)
    20. elif line.find('.ts?') >= 0:
    21. finish_data.append(line)
    22. else:
    23. print('*'*20+'\n'+'解析错误,未解析到需要的ts文件,具体内容如下:'+line+'\n'+'*'*20)
    24. except Exception as e:
    25. import traceback
    26. traceback.print_exc()
    27. print('*'*20+"报错" * 50+'*'*20)
    28. finally:
    29. return finish_data
    30. if __name__ == '__main__':
    31. # 获取m3u8的url,根据url获取ts列表
    32. res = requests.get(base_url,verify = False)
    33. if res.status_code == 200:
    34. ts_list = parse_ts(res.text)
    35. print(ts_list)
    36. else:
    37. print("请求m3u8文件错误")

  • 相关阅读:
    vue中缓存组件keep-alive
    vue3 el-table多级表头收缩扩展的实现
    C和指针 第14章 预处理器 14.1 预定义符号
    springboot昆明学院档案管理系统毕业设计源码311758
    排序算法概述
    历时7天,四名学生将《水浒传》搬到线上!
    网络层——IP协议
    5、QT中SQLite数据库的操作
    html中行内元素、块级元素、行内快元素都有哪些,以及区别
    WPF Button去除按钮边框,添加下划线
  • 原文地址:https://blog.csdn.net/Jason_WangYing/article/details/126807850