苹果定义的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

 

最新文章

  1. 【shell 大系】Linux Shell常用技巧
  2. Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备
  3. UVA Open Credit System Uva 11078
  4. OS X 禁止Android File Transfer自动启动
  5. POJ 2777 Count Color(线段树之成段更新)
  6. JVM总结
  7. Thinkphp的Volist标签
  8. BZOJ 3123 森林(函数式线段树)
  9. Web---JSP-EL表达式
  10. [Farcol] Introduce
  11. 第一pga 畸形消费分析
  12. python基础4
  13. Tomcat安装与配置
  14. 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次幂。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu
  15. JS实现全选、不选、反选
  16. java 连接数据库测试类
  17. MUI组件四:选择器、滚动条、单选框、区域滚动和轮播组件
  18. jQuery获取元素上一个、下一个、父元素、子元素
  19. LeetCode - 386. Lexicographical Numbers
  20. Tf中的SGDOptimizer学习【转载】

热门文章

  1. Eclipse中快速重写(Override)基类方法的技巧(转载)
  2. 解决sqlserver的sql脚本内存不足问题
  3. Android中R.java丢失不见的解决方案
  4. JVM内存模型详解
  5. poj1273 Drainage Ditches 基础网络流
  6. 1-docker基础
  7. Python之单元测试——HTMLTestRunner
  8. 【loj10061】最短母串
  9. URAL 7077 Little Zu Chongzhi's Triangles(14广州I)
  10. LCA Codeforces 100685G Gadget Hackwrench