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协议的设计,透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛,读者需要对现代密码学有清晰而系统的理解 ...
随机推荐
- 深度解密Go语言之 map
目录 什么是 map 为什么要用 map map 的底层如何实现 map 内存模型 创建 map 哈希函数 key 定位过程 map 的两种 get 操作 如何进行扩容 map 的遍历 map 的赋值 ...
- 卷积神经网络中的Winograd快速卷积算法
目录 写在前面 问题定义 一个例子 F(2, 3) 1D winograd 1D to 2D,F(2, 3) to F(2x2, 3x3) 卷积神经网络中的Winograd 总结 参考 博客:blog ...
- 【WIP】客户端JavaScript Web Object
创建: 2017/10/11 更新: 2017/10/14 标题加上[WIP],增加[TODO] 更新: 2018/01/22 更改标题 [客户端JavaScript Web Object, UR ...
- bzoj 4504: K个串【大根堆+主席树】
像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么快速求区间和,用可持久化线段树维护(主席树?) ...
- bug日志-天坑,Spring Security的登陆报错:An internal error occurred while trying to authenticate the user.
在学习Spring Security的时候,我的编辑器给我报错:An internal error occurred while trying to authenticate the user. 明明 ...
- Hibernate中的Query对象查询所有记录
映射文件,核心文件,实体类,工具类的内容都不变直接看测试方法中的代码: package com.yinfu.test; import java.util.List; import org.hibern ...
- hdu6201 transaction transaction transaction(from 2017 ACM/ICPC Asia Regional Shenyang Online)
最开始一直想着最短路,不过看完题解后,才知道可以做成最长路.唉,还是太菜了. 先上图: 只要自己添加两个点,然后如此图般求最长路即可,emmm,用SPFA可以,迪杰斯特拉也可以,或者别的都ok,只要通 ...
- Centos6.8 搭建Lvs+Keepalived
Keepalived keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层.第4层和第7层交换.Keepalived是自动完成,不需人工干涉. 简 ...
- 记录Jmeter集成Jenkins运行Ant做接口监听
最近在鼓捣Jmeter的接口测试,把他集成到了Jenkins上做自动化接口监听.把操作记录下来. 首先就是进行接口测试的编写.打开Jmeter.主要是把接口的测试逻辑和断言处理调通后就OK了,接口程序 ...
- AJPFX浅谈Java新手问题之缺少良好的编程习惯
★随意地命名 有些新手写程序,当需要定义某个变量名(也可能是函数名.类名.包名等)时,随意地一敲键盘,名字就起好了......若干星期后,碰到某 bug,再来看自己写的代码时,心中暗自嘀咕:“这代码是 ...