HLS协议分析实现与相关开源代码

    苹果定义的HLS协议,广泛运用在现在很多的流媒体服务器和客户端之间,用以传输直播电视数据流。
    具体的协议参照    http://tools.ietf.org/html/draft-pantos-http-live-streaming-10    我这里对HLS的客户端协议做一个简单的综述。
 
    HLS协议其实也是基于HTTP的流媒体协议,我们知道传统的流媒体协议有这么几个,http渐进下载、RTSP、MMS等等,简单说一下几个的区别,描述的可能不是很准确。HTTP一般用于大段连续的视频下载,一般需要下载一部分之后才可以开始播放,这种一般的用于视频点播等,也就是服务器上已经真实的存在这个数据流了;RTSP配合RTP一般用于局域网的数据传播,但也不绝对,开源的PJSip工程的SIP绘画就是RTSP,有些电台也采用了RTSP;MMS是微软的协议,一般多数的网络电台采用这个协议。
    而HLS巧妙的将数据流切片,比如以10s钟一段,一般以TS封装H264和AAC数据,这10s就好比是H264视频的编码序列,这个segment的数据流不会和其他的segment的流有任何编码上的参考,所以可以独立解码,那么对于客户端来讲,就可以随时请求直播数据流,最多只有10s的时间延迟。
    HLS的请求流程是(只是简述,后续文章将根据具体的地址详细解析):
    1、http请求m3u8的url
    2、服务端返回一个m3u8的播放列表,这个播放列表是实时跟新的,一般一次给出3段数据的url
    3、客户端解析m3u8的播放列表,再按序请求每一段的url,获取ts数据流
 
    网上相关的资料很多,我这里就不具体描述了。我介绍一下目前实现了HLS协议的开源项目,首先是VLC,VLC里面的httplive.c实现了HLS协议;然后是ffmpeg的applehttp.c或者新版的hls.c;当然android的代码里面也有类似协议的实现。
    我参照ffmpeg和vlc的相关代码,编写了一个hls_proxy的代码,见我的github链接    https://github.com/jgfntu/hls_proxy    之所以说是代理,是因为HLS里数据是一段一个url,那么如果用普通的播放接口函数,如mediaplayer,那么一段10s结束后,则必须重新启动mediaplayer,这肯定是不行的。
    我利用开源的小型web server mongoose     https://github.com/valenok/mongoose    代码实现一个http server,结合libcurl的库作为http的下载接口,然后将数据入队列,利用mongoose将其以http的形式流化给android的mediaplayer,当然,这个需要android系统能够解析http的ts数据流(在android上采用HLS proxy的原因是,国内很多的视频服务器如CNTV、PPTV、LETV和搜狐等对HLS协议的实现有些不同,原生的android代码不一定兼容得到,或者有些机型的BSP没有实现HLS的协议);如果是在ubuntu上,利用VLC也可以验证这个hls_proxy的功能。
    另外,网上出名的一个基于VLC的android版本faplayer,见   https://github.com/tewilove/faplayer   ,其作者tewilove本身也是VLC的开发者之一,android版中的android_audiotrack和androidsurface等都有参与,很是崇拜,不过其已经不更新faplayer了,已经是一年多前的VLC版本了,不过VLC官方已经出了测试版的android版本,不过我运行之后总是觉得没有老的vlc的faplayer流畅,性能瓶颈我没有去跟踪。结合新版的VLC,我对faplayer做了更新,支持4.0以上的音视频,主要也就是跟新了audiotrack和androidsurface,地址是    https://github.com/jgfntu/faplayer   ,我对faplayer的HLS部分做了一定的修改,以便更好的实现各大视频服务器商的HLS直播。

=========================================================================================================
2013-07-27 发布可可电视1.3.0.apk
可以到各大市场下载,如小米商店、百度手机助手、腾讯应用宝、木蚂蚁、豌豆夹等等,提供一个链接,欢迎下载试用!
http://app.xiaomi.com/detail/39492
 
原文地址:https://www.cnblogs.com/yulang314/p/3735955.html