设为首页收藏本站

数字电视开发论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

快捷登录

胜天工科技销售各种数字电视信号调制卡胜天工科技销售各种数字电视信号码流卡

【游客、新手、注册会员的区别】 【积分策略和会员晋级说明】 【发帖和附件上传规则】 【如何下载感兴趣的资料】 【如何获取梦游币】 【侵权资料处理及免责说明】
查看: 1107|回复: 1

M3U8的简单介绍和在Android中使用的思路

[复制链接]
  • TA的每日心情
    开心
    昨天 07:48
  • 签到天数: 2268 天

    [LV.Master]伴坛终老

    新浪微博达人勋

    发表于 2016-12-2 18:00:47 | 显示全部楼层 |阅读模式
    分享到:
    消息来自- 北京
    在项目中有用到m3u8,现在写篇博文,算是简单的总结。

    M3U8视频格格式也是一种M3U,只是它的编码格式是UTF-8格式。M3U用Latin-1字符集编码。M3U8格式特点是带有一个目录信息或文件。

    首先是名词介绍,什么是m3u8。m3u8是m3u的一种,不过是utf-8格式的,我记忆中说m3u8是苹果公司搞出来的一种播放的标准吧,其实简单来说就是把整个视频切成一段一段的,然后呢用一个m3u8格式来存这些个小段视频们的地址。可能大家就要问了,这么麻烦干嘛。其实m3u8是为了码率适配而生,而怎样去适配码率呢,这个下面介绍格式的时候会介绍到。

    上两个m3u8文件的例子地址,大家能有直观的认识,这是我从Vitamio的官网上扒的。
    http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8
    http://devimages.apple.com/iphon ... ar1/prog_index.m3u8

    我总结了一下我遇到的m3u8格式,虽然不能说涵盖了全部的情况,但是也差不多了:
    1、一级目录(我觉着一级的目录没有适配码率的功能)
    1.1、打开第一级m3u8文件,能找到真正的视频地址
    1.2、第一级m3u8文件中,没有真正的视频地址,需要拼接才能找到真正的视频地址
    2、二级目录
    2.1、二级地址在一级文件中直接能看到
    2.2、二级地址在一级文件中不能直接看到,需要拼接一级链接的地址才能找到二级文件的地址
    2.2、打开二级目录,能找到整整的视频地址
    2.3、没有真正的视频地址,需要拼接才能找到真正的视频地址

    篇幅关系我不能给大家全部列举出这些全部的可能性。我就拿最麻烦的举个例子,其他的大家自行脑补吧,原理都是一样的,怎么样都跑不出协议的范畴之外。

    我们在浏览器中输入http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8,会得到一个名为bipbopall.m3u8的文件,此文件的内容如下:
    #EXTM3U
    #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000
    gear1/prog_index.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111
    gear2/prog_index.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444
    gear3/prog_index.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777
    gear4/prog_index.m3u8
    这就符合上面的2.2种情况,这四种码率的m3u8的地址你都不能直接得到,那怎么办呢,我们用得到这个文件的链接地址的前半段http://devimages.apple.com/iphone/samples/bipbop/拼接上二级文件的相对地址gear1/prog_index.m3u8得到一个地址http://devimages.apple.com/iphon ... ar1/prog_index.m3u8
    把此地址放到浏览器中,我们又会得到一个同样名为prog_index.m3u8的文件,内容如下:
    #EXTM3U
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:10, no desc
    fileSequence0.ts
    #EXTINF:10, no desc
    fileSequence1.ts
    #EXTINF:10, no desc
    fileSequence2.ts
    #EXTINF:10, no desc
    fileSequence3.ts
    #EXTINF:10, no desc
    fileSequence4.ts
    #EXTINF:10, no desc
    fileSequence5.ts
    #EXTINF:10, no desc
    .
    .
    .
    #EXTINF:10, no desc
    fileSequence179.ts
    #EXTINF:1, no desc
    fileSequence180.ts
    #EXT-X-ENDLIST

    我们很开心的发现,这设计简直是巧(sang)夺(xin)天(bing)工(kuang),我们还是没有得到真正的视频地址,老办法拼接后我们得到这么一段链http://devimages.apple.com/iphon ... /fileSequence179.ts,这就是真正的视频地址。

    我举的这个例子是最复杂的情况,一般的情况对于这个来说都是相对简单的。就跟软件设计一样,我们先考虑到最难得情况,简单的来说就迎刃而解了
    此篇博文没有具体介绍m3u8的格式,各位看官不了解的话还请自行Google之。
    踩过的脚印
  • TA的每日心情
    开心
    昨天 07:48
  • 签到天数: 2268 天

    [LV.Master]伴坛终老

    新浪微博达人勋

     楼主| 发表于 2016-12-2 18:22:07 | 显示全部楼层
    消息来自- 北京
    M3U8格式讲解及实际应用分析

    M3U8.png

    M3U8有啥好处?

    网上搜索了一下,大家众说纷纭,个人理解主要是可以做多码率的适配,根据网络带宽,客户端会选择一个适合自己码率的文件进行播放,保证视频流的流畅。

    在iOS device和mac上可以用http的方式进行分发,其中playlist标准为由m3u扩展而来的m3u8文件,媒体文件为MPEG2-TS或者AAC文件(audio only)。

    m3u8文件有两种应用场景:

    多码率适配流,

    #EXTM3U

    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000

    http://example.com/low.m3u8

    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000

    http://example.com/mid.m3u8

    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000

    http://example.com/hi.m3u8

    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"

    http://example.com/audio-only.m3u8

    单码率适配流
    #EXTM3U

    #EXT-X-TARGETDURATION:5220

    #EXTINF:5220,

    http://media.example.com/entire.ts

    #EXT-X-ENDLIST


    国际标准组织对此的定义 rfc doc:
    http://tools.ietf.org/html/draft-pantos-http-live-streaming-06
    m3u8 文件是m3u文件的扩展。在该rfc中定义了扩展的关键字:
    其中:
    #EXT-X-TARGETDURATION
    定义每个TS的最大的duration。
    #EXT-X-MEDIA-SEQUENCE
    定义当前m3u8文件中第一个文件的序列号,每个ts文件在m3u8文件中都有固定唯一的序列号,该序列号用于在MBR时切换码率进行对齐。
    #EXT-X-KEY

    定义加密方式和key文件的url,用于取得16bytes的key文件解码ts文件。

    属性:
    METHOD
    URL
    #EXT-X-PROGRAM-DATE-TIME
    第一个文件的绝对时间

    #EXT-X-ALLOW-CACHE

    是否允许cache。
    #EXT-X-ENDLIST
    表明m3u8文件的结束。live m3u8没有该tag。
    #EXT-X-STREAM-INF
    属性:
    BANDWIDTH              指定码率
    PROGRAM-ID            唯一ID
    CODECS                    指定流的编码类型
    #EXT-X-DISCONTINUITY
    当遇到该tag的时候说明以下属性发生了变化:
    file format
    number and type of tracks
    encoding parameters
    encoding sequence
    timestamp sequence

    #EXT-X-VERSION             该属性用不用都可以,可以没有

    M3U8分顶级M3U8和二级M3U8, 顶级M3U8主要是做多码率适配的, 二级M3U8才是真正的切片文件,

    客户端默认会首先选择码率最高的请求,如果发现码率达不到,会请求郊低码率的流

    一个实际使用中的顶级M3U8文件如下 :

    #EXTM3U
    #EXT-X-STREAM-INF:PROGRAM-ID=201273221265,BANDWIDTH=358400
    11.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=201273221265,BANDWIDTH=972800
    22.m3u8


    上面顶级M3U8文件中又定义了 11.m3u8 和 22.m3u8 两个二级文件,客户端会选择其中一个获取其内容。

    二级M3U8文件内容如下:

    #EXTM3U
    #EXT-X-VERSION:1
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:3,
    1-4.ts
    #EXTINF:8,
    1-6.ts
    #EXTINF:8,
    1-8.ts
    #EXTINF:8,
    1-10.ts
    #EXTINF:8,
    1-12.ts
    #EXTINF:8,
    1-14.ts
    #EXTINF:8,
    1-16.ts
    #EXTINF:9,
    1-18.ts
    #EXTINF:6,
    1-20.ts
    #EXTINF:8,
    1-22.ts
    #EXTINF:9,
    1-24.ts
    #EXTINF:3,
    1-26.ts
    #EXT-X-ENDLIST

    客户端拿到上面的二级M3U8文件后,会继续请求里面的文件,这时就可进行播放了。

    上面讲解的是点播的情况,直播的情况,M3U8文件里面会有属性告诉是直播,客户端会定时来请求新的M3U8文件。
    您需要登录后才可以回帖 登录 | 注册 新浪微博登陆

    本版积分规则

    嗨!您好:
    欢迎来到数字电视开发论坛。
    我的名字叫梦梦
    很高兴能够为您服务!
    如果已经注册【立即登录】
    还没有账号请【注册】
    嗨!您好:
    欢迎来到数字电视开发论坛。
    我的名字叫梦梦
    很高兴能够为您服务!
    如果已经注册【立即登录】
    还没有账号请

    QQ|小黑屋|手机版|Archiver|数字电视开发网 ( 京ICP备16008897号-5   

    GMT+8, 2018-12-17 06:40 , Processed in 0.149879 second(s), 39 queries , Gzip On.

    Powered by Discuz! X3.1

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表