直播流程
播放流程:获取流 → 解码 → 播放录制播放路程:录制音频视频 → 剪辑 → 编码 → 上传服务器,别人播放直播过程:采集 → 处理 → 编码 → 推流 → CDN分发 → 拉流 → 解码 → 播放
直播基础知识
①直播常见的协议有三种:RTMP、FLV和 HLS。
- RTMP(RealTime Messaging Protocol,实时消息传输协议)Adobe公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议,它底层基于TCP协议,延时较小大概为1~3s。
- FLVAdobe公司主推这个协议,格式很简单,它在大部分手机浏览器上不支持,只能在手机app播放,拖动进度条反应迟钝。目前腾讯视频的直播录制,采用的就是FLV视频格式。
- HLS(HTTP Live Streaming)是由苹果公司推出的基于HTTP的流媒体传输协议。它有个很大的有点,HTML5可以直接打开播放;这个意味着可以把一个直播链接通过微信等转发分享,不需要安装任何独立的APP,有浏览器即可,所以流行度很高。
- RTP(Real-time Transport Protocol)用于Internet上针对多媒体数据流的一种传输层协议,实际应用场景下经常需要RTCP(RTP Control Protocol)配合来使用,可以简单理解为RTCP传输交互控制的信令,RTP传输实际的媒体数据。RTP在视频监控、视频会议、IP电话上有广泛的应用,因为视频会议、IP电话的一个重要的使用体验:内容实时性强。
直播协议 | 传输方式 | 优点 | 缺点 | 播放延迟 |
---|---|---|---|---|
RTMP | TCP | 能推能播,延迟低 | 高并发情况下不佳 | 1~3s |
FLV | HTTP | 成熟度高,延迟低,手机app游戏直播首选 | 必须要用app播放 | 2~3s |
HLS | HTTP | 手机浏览器支持度高 | 延迟非常高 | 10~30s |
RTP | TCP/UDP | 实时 | 实时 | 实时 |
②常见的点播协议也有三种:MP4、HLS和FLV。
- MP4非常经典的文件格式,在移动终端和PC浏览器上的支持度都很好(在IOS和大部分Android设备上,都可以使用系统浏览器进行播放,在PC上可以使用FLASH控件进行播放)。但是MP4的视频文件格式比较复杂,所以处理成本高,而且由于索引表复杂度高,导致时长稍大(比如半小时)的MP4文件在线播放时加载速度会很慢。
- HLS苹果公司力推的标准,在移动终端的浏览器上的支持度较好,但IE的支持情况依赖FLASH的二次开发工作(建议使用腾讯视频云的FLASH播放器控件)。其精简的m3u8的索引结构可以规避MP4的索引慢问题,如果是用于点播,是非常不错的选择。
- FLVAdobe公司所推的标准,目前直播平台最常用的封装格式,在PC端有FLASH的强力支持,但在移动终端只有APP实现播放器才有可能支持(或者使用本播放器),大部分手机端浏览器均不支持。目前腾讯视频云的直播录制,采用的就是FLV视频格式。
点播协议 | 优点 | 缺点 |
---|---|---|
MP4 | 手机浏览器支持度高 | 格式过于复杂和娇贵,容错率差,对播放器要求高 |
HLS | 手机浏览器支持度高 | 大量小分片的文件组织形式,错误率和维护成本均高于单一文件 |
FLV | 格式简单问题少 | 手机浏览器支持差 |
③常见的推流协议:虽然RTMP在直播领域不是特别流行,但是在推流服务,也就是主播->服务器这个方向上,RTMP则居于主导地位,目前国内的视频云服务都是以RTMP为主要推流协议。
- 直播直播的视频源是实时生成的,有人推流直播才有意义。所以,一旦主播停播,直播URL也就失效了,而且由于是实时直播,所以播放器在播直播视频的时候是没有进度条的,直播中,如果用户点击暂停,其实并没有真正意义上的暂停,所谓的直播暂停,只是画面冻结和关闭声音,而云端的视频源还在不断地更新着,所以当您调用 resume 的时候,会从最新的时间点开始播放,这跟点播是有很大不同的(点播播放器的暂停和继续与播放本地视频文件时的表现相同)。
- 推流用户将本地视频源和音频源推送到云服务器,在有些场景中也被称为“RTMP发布。说简单点, 可以理解为推流是直播的主播端,把主播端采集的音视频数据上传到腾讯云,然后粉丝通过我的房间号(房间号怎么看到?请看我的下一篇文章)进入我的直播间。
- 点播点播的视频源是云端的一个文件,文件只要没有被提供方删除,就随时可以播放(类似优酷土豆、爱奇艺和腾讯视频), 而且由于整个视频都在服务器上,所以播放的时候是有进度条的哦。
下载SDK
腾讯提供了集成librart方式,但是有好几个版本类型的sdk,我打算把视频推流,直播,点播,短视频都写下,所以我下载全功能专业版。下载完解压之后:
文件名 | 说明 |
---|---|
LiteAVSDK_Professional_4.6.4218.aar | 适用于 Android Studio 用户 |
LiteAVSDK_Professional_4.6.4218.zip | 适用于 Eclipse 用户 |
这里我们选择第一个aar包,放到AS中 /app/libs 目录下在工程 app 目录下的 build.gradle 中,添加引用aar包
代码语言:javascript复制dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// 导入腾讯云直播 SDK jar
compile(name: 'LiteAVSDK_Professional_4.6.4218', ext: 'aar')
}
在工程目录下的 build.gradle 中,添加 flatDir,指定本地仓库:
代码语言:javascript复制 allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
在工程目录下的 build.gradle 的 defaultConfig 里面,指定 ndk 兼容的架构:
代码语言:javascript复制defaultConfig {
...
ndk {
abiFilters "armeabi", "armeabi-v7a"
// 如果您使用的是商业版,只能使用 armeabi 架构,即:
// abiFilters "armeabi",
}
}
然后编译下工程
集成之后,记得添加权限,这里不加了,自行去腾讯官网添加
测试下是否集成成功,在Activity添加:
代码语言:javascript复制String versionStr = TXLiveBase.getSDKVersionStr();
Log.d("zjp", "versinoStr=" versionStr);
运行之后在 logcat 中看到当前sdk版本为:4.6.4218,跟我们上面集成的sdk版本一样,说明集成sdk成功。