m3u8文件说明

本文介绍了M3U8文件的概念及其在音视频点播中的应用。M3U8是一种UTF-8编码的索引文件,用于记录音视频文件的网络地址。文中详细解释了M3U8文件中的各种标签及其功能,包括媒体序列、目标持续时间、加密方式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from:http://blog.sina.com.cn/s/blog_6cf7acdf0102v0xv.html

1.   M3U8文件概念

M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。

2.   M3U8文件举例

例如使用云图TV点播直播节目时,发送请求:

http://121.199.63.236:7613/m3u8/cckw1/szws.m3u8?from=bab&fun=yes&chk=y&chunk=xax&ppw=yuntutv&auth=yuntutvyuntutvyuntutv&auth=yuntutvyuntutvyuntutv&nwtime=1406515232&sign=033d5483609e6bc87987fc7d2f30a024

返回M3U8文件,文件内容如下:

#EXTM3U

#EXT-X-MEDIA-SEQUENCE:140651513

#EXT-X-TARGETDURATION:10

#EXTINF:8,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651513[140651513].ts

#EXTINF:9,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514[140651514].ts

#EXTINF:11,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651515[140651515].ts

#EXTINF:10,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651516[140651516].ts

#EXTINF:12,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651517[140651517].ts

#EXTINF:8,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651518[140651518].ts

#EXTINF:12,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651519[140651519].ts

#EXTINF:8,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651520[140651520].ts

#EXTINF:9,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651521[140651521].ts

#EXTINF:13,

http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651522[140651522].ts

然后根据索引的中链接请求下载音视频并进行播放

3.   M3U文件标签及属性说明

M3U文件中可以包含多个tag,每个tag的功能和属性如下:

#EXTM3U

每个M3U文件第一行必须是这个tag,请标示作用

#EXT-X-MEDIA-SEQUENCE:140651513 

每一个media URI 在 PlayList中只有唯一的序号,相邻之间序号+1, 一个media URI并不是必须要包含的,如果没有,默认为0

#EXTINF:,

 duration 指定每个媒体段(ts)的持续时间(秒),仅对其后面的URI有效,title是下载资源的url

#EXT-X-TARGETDURATION

指定最大的媒体段时间长(秒)。所以#EXTINF中指定的时间长度必须小于或是等于这个最大值。这个tag在整个PlayList文件中只能出现一 次(在嵌套的情况下,一般有真正ts urlm3u8才会出现该tag

#EXT-X-KEY

表示怎么对media segments进行解码。其作用范围是下次该tag出现前的所有media URI,属性为NONE 或者 AES-128NONE表示 URI以及IVInitialization Vector)属性必须不存在, AES-128(Advanced EncryptionStandard)表示URI必须存在,IV可以不存在。

  对于AES-128的情况,keytagURI属性共同表示了一个key文件,通过URI可以获得这个key,如果没有IVInitialization Vector,则使用序列号作为IV进行编解码,将序列号的高位赋到16个字节的buffer中,左边补0;如果有IV,则将改值当成16个字节的16进制数。

#EXT-X-PROGRAM-DATE-TIME

将一个绝对时间或是日期和一个媒体段中的第一个sample相关联,只对下一个meida URI有效,格式如#EXT-X-PROGRAM-DATE-TIME:

For example: #EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00

#EXT-X-ALLOW-CACHE

是否允许做cache,这个可以在PlayList文件中任意地方出现,并且最多出现一次,作用效果是所有的媒体段。格式如下:#EXT-X-ALLOW-CACHE:

#EXT-X-PLAYLIST-TYPE

提供关于PlayList的可变性的信息, 这个对整个PlayList文件有效,是可选的,格式如下:#EXT-X-PLAYLIST-TYPE::如果是VOD,则服务器不能改变PlayList 文件;如果是EVENT,则服务器不能改变或是删除PlayList文件中的任何部分,但是可以向该文件中增加新的一行内容。

#EXT-X-ENDLIST

表示PlayList的末尾了,它可以在PlayList中任意位置出现,但是只能出现一个,格式如下:#EXT-X-ENDLIST

#EXT-X-MEDIA

被用来在PlayList中表示相同内容的不用语种/译文的版本,比如可以通过使用3个这种tag表示3中不用语音的音频,或者用2个这个tag表示不同角度的videoPlayLists中。这个标签是独立存在的,属性包含:

  URI:如果没有,则表示这个tag描述的可选择版本在主PlayListEXT-X-STREAM-INF中存在;

  TYPE:AUDIO and VIDEO;

  GROUP-ID:具有相同IDMEDIAtag,组成一组样式;

  LANGUAGE:确定使用的主要语言

  NAME:人类可读的语言的翻译

  DEFAULTYES或是NO,默认是No,如果是YES,则客户端会以这种选项来播放,除非用户自己进行选择。

  AUTOSELECTYES或是NO,默认是No,如果是YES,则客户端会根据当前播放环境来进行选择(用户没有根据自己偏好进行选择的前提下)

#EXT-X-STREAM-INF

指定一个包含多媒体信息的 media URI 作为PlayList,一般做M3U8的嵌套使用,它只对紧跟后面的URI有效,格式如下:#EXT-X-STREAM-INF:有以下属性:

BANDWIDTH:带宽,必须有。

PROGRAM-ID:该值是一个十进制整数,惟一地标识一个在PlayList文件范围内的特定的描述。一个PlayList 文件中可能包含多个有相同ID的此tag

CODECS:不是必须的。

RESOLUTION:分辨率。

AUDIO:这个值必须和AUDIO类别的“EXT-X-MEDIA”标签中“GROUP-ID”属性值相匹配。

VIDEO:同上

### 方法一:使用 M3u8ToMp4 工具 可以通过专门设计的工具 `M3u8ToMp4` 来完成此操作。该工具能够处理带密钥(key)的 m3u8 文件,并将其转换为 mp4 格式[^1]。 #### 环境准备 - **JRE 1.8**:确保已安装 Java Runtime Environment (JRE) 版本 1.8 并正确配置环境变量。 #### 使用步骤说明 - 准备两个空文件夹 `input` 和 `output`,并将下载的 m3u8 文件及其关联的文件夹放入 `input` 中。 - 双击运行 `M3u8ToMp4.exe` 执行脚本。 - 转换完成后,在 `output` 文件夹中找到生成的 mp4 文件。 --- ### 方法二:基于 Python 的 FFmpeg 实现 另一种方法是借助 Python 编写脚本来调用 FFmpeg 完成转换任务。以下是具体实现代码: ```python import subprocess def convert_to_mp4(input_file, output_file): command = ['ffmpeg', '-i', input_file, '-c', 'copy', output_file] try: result = subprocess.run(command, check=True) if result.returncode == 0: print("转换成功!") except FileNotFoundError: print("未安装FFmpeg或者路径设置不正确。请先安装FFmpeg并添加到系统的PATH中。") # 示例调用 convert_to_mp4('E:\\example\\file.m3u8', 'E:\\example\\file.mp4') ``` 这段代码依赖于 FFmpeg 命令行工具,因此需提前确认 FFmpeg 是否已正确安装并加入 PATH 环境变量[^2]。 --- ### 方法三:直接使用 FFmpeg 命令行 对于熟悉命令行操作的用户来说,可以直接通过 FFmpeg 提供的功能将远程或本地的 m3u8 文件转换为 mp4 格式[^3]。 #### 基础语法 ```bash ffmpeg -i 输入文件地址 -c copy 输出文件地址 ``` #### 示例 假设输入文件位于网络地址,则可以如下操作: ```bash ffmpeg -i https://pull-hs1.vzan.com/295539/007845640599847546/replay.1711435561.51287065.m3u8 -c copy output.mp4 ``` 如果输入的是本地文件,只需替换 URL 地址为实际路径即可[^4]。 --- ### 注意事项 1. 如果 m3u8 文件涉及加密(如 AES-128),则需要提供相应的密钥文件才能顺利完成解码过程。 2. 对于某些特殊场景下的 m3u8 文件,可能还需要额外参数支持,比如 `-protocol_whitelist file,http,https,tcp,tls,crypto` 或者指定密钥位置等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值