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
HLS协议分析实现与相关开源代码的更多相关文章
- 苹果刷机相关开源代码(如iRecovery等)收集汇总(不断更新中...)
下面截图是在下面开源代码下使用VS2015修改部分代码后适配而成,可以在Windows平台上运行, 下载连接: http://pan.baidu.com/s/1i4zKGx3.
- GPL协议中国第一案尘埃落定,相关开源软件应如何风控?
导读:2019年11月6日,数字天堂(北京)网络技术有限公司(以下简称 “数字天堂公司”)诉柚子(北京)科技有限公司.柚子(北京)移动技术有限公司(以下简称 “柚子公司”)侵犯计算机软件著作权纠纷一案 ...
- 蓝牙协议分析(5)_BLE广播通信相关的技术分析
1. 前言 大家都知道,相比传统蓝牙,蓝牙低功耗(BLE)最大的突破就是加大了对广播通信(Advertising)的支持和利用.关于广播通信,通过“玩转BLE(1)_Eddystone beacon” ...
- 物联网MQTT协议分析和开源Mosquitto部署验证
在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...
- 开源流媒体服务器SRS学习笔记(2) - rtmp / http-flv / hls 协议配置 及跨域问题
对rtmp/http-flv/hls这三种协议不熟悉的同学,强烈建议先看看网友写的这篇文章科普下:理解RTMP.HttpFlv和HLS的正确姿势 . srs可以同时支持这3种协议,只要修改conf ...
- vlc源码分析(七) 调试学习HLS协议
HTTP Live Streaming(HLS)是苹果公司提出来的流媒体传输协议.与RTP协议不同的是,HLS可以穿透某些允许HTTP协议通过的防火墙. 一.HLS播放模式 (1) 点播模式(Vide ...
- [转载] TLS协议分析 与 现代加密通信协议设计
https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...
- AOSP中的HLS协议解析
[时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, AOSP, 源码分析,HttpLiveSource, LiveSession,PlaylistFetcher] ...
- TLS协议分析
TLS协议分析 本文目标: 学习鉴赏TLS协议的设计,透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛,读者需要对现代密码学有清晰而系统的理解 ...
随机推荐
- 介绍一下Extern “C”,它的作用是什么?
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数.这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “ ...
- bzoj 1488: [HNOI2009]图的同构【polya定理+dfs】
把连边和不连边看成黑白染色,然后就变成了 https://www.cnblogs.com/lokiii/p/10055629.html 这篇讲得好!https://blog.csdn.net/wzq_ ...
- bzoj 3613: [Heoi2014]南园满地堆轻絮【二分+贪心】
二分答案w,然后判断的时候维护一个mx,扫描序列,先更新mx=max(mx,a[i]-w),然后如果a[i]+w<mx的话就是说这个位置即使升到极限并且前面降到极限也不能符合条件了 #inclu ...
- 7天学完Java基础之3/7
API概述 什么叫做API? API(Application Programming lnterface),应用程序编程接口. 所谓API就是值好多的类,好多的方法,JDK给我们提供了很多现成的类,我 ...
- LuoguP1342请柬 【最短路/建反图】By cellur925
题目传送门 开始就想直接正向跑一遍Dij把到各点的最短路加起来即可,后来发现与样例少了些,于是再读题发现需要也求出学生们回来的最短路. 但是注意到本题是有向图,如果是无向图就好说. 那么我们怎么解决? ...
- NOIp 2014飞扬的小鸟【dp】By cellur925
题目传送门 放在14年Day1T3的dp题目...应该比较看出来是dp算法吧,因为在本蒟蒻看来求最值的算法不清晰时就是dp了==. 状态还是比较好设计的,考虑到每个情况需要记录下的量:f[i][j]表 ...
- [USACO10MAR]伟大的奶牛聚集Great Cow Gat…【树形dp】By cellur925
题目传送门 首先这道题是在树上进行的,然后求最小的不方便程度,比较符合dp的性质,那么我们就可以搞一搞树形dp. 设计状态:f[i]表示以i作为聚集地的最小不方便程度.那么我们还需要各点间的距离,但是 ...
- Centos 内存释放
原因:最近发现服务器老师提示内存不足的警报,很多时候内存都占用百分之80以上,查看运行的服务似乎并没有占用很大的内存,top查看运行的服务,然后按shift+m排名第一的才百分之1.x,看了别人的博客 ...
- sql mysql和sqlserver存在就更新,不存在就插入的写法(转)
转自:http://hi.baidu.com/tidy0608/item/ff930fe2436f2601560f1dd9 sqlsever数据存在就更新,不存在就插入的两种方法 两种经常使用的方法: ...
- JavaScript-获取当前元素的相关元素或节点--方法总结
1.获取当前元素中的第一个子节点 document.getElementById("uu").firstChild 2.获取当前元素中的第一个子元素 document.getEle ...