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协议的设计,透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛,读者需要对现代密码学有清晰而系统的理解 ...
随机推荐
- linux以行为单位进行读写操作
1 gets/fgets函数 char* fgets(char *restrict buf,int n,FILE *restrict fp) 参数1:存放读入串的缓冲区 参数2:表示读入的字符个数,最 ...
- linux软硬连接学习总结
创建连接实质上就是给系统中已经存在的文件指定另外一个可以访问它的名称,linux系统当中连接的创建有两种形式:硬链接(Hard Link),与符号链接(Symbloic Link)既软链接. ln命令 ...
- Epoll简介以及例子
第一部分:Epoll简介 问题 : Select,Poll和Epoll的区别 答案 : Epoll和Select的区别 1. 遍历方式的区别.select判断是否有事件发生是遍历的,而epoll是事 ...
- 爱奇艺面试Python,竟然挂在第5轮……
今天给大家分享我曾经在爱奇艺的面试,过程还是比较有意思的,可以给大家一些参考 聊骚阶段 嗲妹妹:你好,我是爱奇艺的HR,我们正在招聘运维开发岗位,请问您最近有在看工作机会吗? 我:(这声音也太酥了吧我 ...
- 51nod 1268【dp】
思路: 很水的dp吧...问的都是能否组成.. 哦对,这里sum最大才2e7,不会是2e9所以放心dp #include<cstdio> #include <map> #inc ...
- P1229-神秘岛
神秘岛 描述 Description FireDancer来到一个神秘岛,他要从岛的西头到东头然后在东头的码头离开.可是当他走了一次后,发现这个岛的景色非常的美丽,于是他从东头的传送门传到了西头,换了 ...
- only-child选择器
:only-child选择器用于匹配属于某一个父元素的唯一子元素的元素,也就是说,如果某个父元素仅有一个子元素,则使用 :only-chlid选择器 ,可以选择这个子元素
- 【loj10061】最短母串
#10061. 「一本通 2.4 练习 4」最短母串 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 1bentong 提交 提交 ...
- Codeforces Round #542(Div. 2) D1.Toy Train
链接:https://codeforces.com/contest/1130/problem/D1 题意: 给n个车站练成圈,给m个糖果,在车站上,要被运往某个位置,每到一个车站只能装一个糖果. 求从 ...
- pwa-serviceWorker与页面通信postMessage
https://ppt.geekbang.org/list/gmtc2018?from=groupmessage&%3Bisappinstalled=0 http://www.sohu. ...