全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
视频直播

使用说明

更新时间:2017-11-22 19:42:48

一、概念说明

  • RTMP

    RTMP协议比较全能,既可以用来推送又可以用来直播,其核心理念是将大块的视频帧和音频帧“剁碎”,然后以小数据包的形式在互联网上进行传输;

  • FLV

    FLV协议由Adobe公司主推,格式极其简单,只是在大块的视频帧和音视频头部加入一些标记头信息,由于这种极致的简洁,在延迟表现和大规模并发方面都很成熟。唯一的不足就是在手机浏览器上的支持非常有限,但是用作手机端APP直播协议却异常合适。

  • HLS

    苹果推出的解决方案,将视频分成5-10秒的视频小分片,然后用m3u8索引表进行管理,由于客户端下载到的视频都是5-10秒的完整数据,故视频的流畅性很好,但也同样引入了很大的延迟(HLS的一般延迟在10-30s左右)。相比于FLV, HLS在iPhone和大部分android手机浏览器上的支持非常给力,所以常用于QQ和微信朋友圈的URL分享;

  • I帧

    即Intra-coded picture(帧内编码图像帧),不参考其他图像帧,只利用本帧的信息进行编码

  • P帧

    即Predictive-codedPicture(预测编码图像帧),利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码

  • GOP

    在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离,Reference(参考周期)指两个P帧之间的距离。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧。

  • 硬编码vs软编码

    软编码实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点;硬编码:性能高,低码率下通常质量低于软编码器;

  • FPS

    每秒显示/编码/解码/采集、处理的帧数(Frames per Second,简称:FPS),由于人类眼睛的特殊生理结构,如果所看画面之帧率高于16的时候,就会认为是连贯的,此现象称之为视觉暂留。

  • 码率控制

    码率控制实际上是一种编码的优化算法,它用于实现对视频流码流大小的控制。那么它控制的目的是什么呢?我们可以试想一下,同样的视频编码格式,码流大,它包含的信息也就越多,那么对应的图像也就越清晰,反之亦然;

  • 视频丢帧

    在发送视频帧的时候,如果网络非常差,导致视频帧堆积非常严重的时候,这个时候通过丢弃视频帧,来缩短推流的延时。

二、使用流程

流程 : 用户APP向APPServer发起请求,获取推流URL -> AppServer根据规则拼接推流URL返回给APP -> APP赋值推流URL到推流SDK,使用推流SDK发起推流 -> 推流SDK将直播流推送到CDN

推流sdk使用流程.png

三、SDK集成

1.SDK信息

下载后的SDK目录,包含三个目录SDK目录1.pngaarlibs目录:aarlibs.pngjniLibs目录:jniLibs.pnglibs目录:libs.png

2.系统支持

  • SDK支持Android 4.3及以上版本
  • 硬件CPU支持ARM64、ARMV7

3.运行环境

  • SDK编译支持Android 4.3及以上版本
  • Android Studio 2.3及以上版本
  • APP开发环境不需要与SDK一致,但是要保持兼容:
  • Android SDK Tools: android-sdk_25.0.0
    • minSdkVersion 18
    • targetSdkVersion 23

4.SDK集成

下载SDK包 SDK下载

Android Studio 新建工程:新建工程.png

copy jar包和so库:新建工程2.png

工程配置:

  1. dependencies {
  2. implementation fileTree(dir: 'libs', include: ['*.jar'])
  3. }

jniLibs 目录为默认so存放位置如果自己设置位置需要在app的build.gradle中配置:

  1. sourceSets{
  2. main{
  3. jniLibs.srcDirs = ['libs']
  4. }
  5. }

最后编译一下工程 Rebuild Project

4.SDK使用

AlivcLivePushConfig

推流参数配置类,AlivcLivePushConfig初始化完成后,每个属性参数会有一个对应的默认值,默认值和参数范围参考API文档或注释。如果需要修改特定的推流配置参数值,只需要修改对应的属性值即可。

  1. AlivcLivePushConfig mAlivcLivePushConfig = new AlivcLivePushConfig();

设置分辨率

  1. mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);//分辨率540P

设置初始码率

  1. mAlivcLivePushConfig.setInitialVideoBitrate(800); //初始码率800Kbps

设置目标码率

  1. mAlivcLivePushConfig.setTargetVideoBitrate(800); //目标码率800Kbps

设置最小码率

  1. mAlivcLivePushConfig.setMinVideoBitrate(400); //最小码率400Kbps

设置美颜开关

  1. mAlivcLivePushConfig.setBeautyOn(false); //关闭美颜

设置美颜参数

  1. mAlivcLivePushConfig.setBeautyBrightness(60); //亮度60
  2. mAlivcLivePushConfig.setBeautyRuddy(40); //红润 40
  3. mAlivcLivePushConfig.setBeautyBuffing(30); //磨皮 30
  4. mAlivcLivePushConfig.setBeautyWhite(20); //美白 20
  5. mAlivcLivePushConfig.setBeautySaturation(10); //饱和度 10

设置推流方向

  1. mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);//竖屏推流

设置帧率

  1. mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_20); //帧率20
  • 添加水印

    注:水印图片必须为png格式图片(图片必须在apk可以访问的sdcard路径),最多支持三张水印。输入的水印的coordX,coordY,width值为相对于值。

    例如:coordX=0.5;coordY=0.5;width=0.5。在不同推流分辨率的情况下,水印图片的左顶点均在推流图像中心点,水印图片的宽度与推流图像的宽度的比恒等于1:2,水印图片的高度按照水印图片的真实宽高与输入的width值等比缩放

  1. /**
  2. * 添加水印,起点位置坐标x[0,width) y[0,height),宽度(0,width],最多添加3个
  3. *
  4. * @param path 水印图片
  5. * @param x 水印左上角x轴位置 相对位置 0~1
  6. * @param y 水印右上角y轴位置 相对位置 0~1
  7. * @param width 水印显示宽度 相对位置 0~1
  8. */
  9. mAlivcLivePushConfig.addWaterMark(waterPath, 0.2, 0.2, 0.3);

AlivcLivePusher

备注:

  1. * 接口的调用需要对接口抛出的异常进行处理,添加 try catch 处理操作。
  2. * 接口调用的顺序必须按照说明的顺序调用,否则会排出调用顺序不正确异常。

init 初始化

  1. AlivcLivePusher mAlivcLivePusher = new AlivcLivePusher();
  2. mAlivcLivePusher.init(mContext, mAlivcLivePushConfig);

初始化完成

注册回调通知,用来处理推流返回的各种事件:

  1. /**
  2. * 设置推流错误事件
  3. *
  4. * @param errorListener 错误监听器
  5. */
  6. mAlivcLivePusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {
  7. @Override
  8. public void onSystemError(AlivcLivePusher livePusher, AlivcLivePushError error) {
  9. if(error != null) {
  10. //添加UI提示或者用户自定义的错误处理
  11. }
  12. }
  13. @Override
  14. public void onSDKError(AlivcLivePusher livePusher, AlivcLivePushError error) {
  15. if(error != null) {
  16. //添加UI提示或者用户自定义的错误处理
  17. }
  18. }
  19. });
  20. /**
  21. * 设置推流通知事件
  22. *
  23. * @param infoListener 通知监听器
  24. */
  25. mAlivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
  26. /**
  27. * 预览开始事件
  28. */
  29. @Override
  30. public void onPreviewStarted(AlivcLivePusher pusher) {
  31. }
  32. /**
  33. * 预览结束事件
  34. */
  35. @Override
  36. public void onPreviewStoped(AlivcLivePusher pusher) {
  37. }
  38. /**
  39. * 推流开始通知
  40. */
  41. @Override
  42. public void onPushStarted(AlivcLivePusher pusher) {
  43. }
  44. /**
  45. * 推流暂停通知
  46. */
  47. @Override
  48. public void onPushPauesed(AlivcLivePusher pusher) {
  49. }
  50. /**
  51. * 推流恢复通知
  52. */
  53. @Override
  54. public void onPushResumed(AlivcLivePusher pusher) {
  55. }
  56. /**
  57. * 推流停止通知
  58. */
  59. @Override
  60. public void onPushStoped(AlivcLivePusher pusher) {
  61. }
  62. /**
  63. * 推流重启通知
  64. */
  65. @Override
  66. public void onPushRestarted(AlivcLivePusher pusher) {
  67. }
  68. /**
  69. * 首帧渲染通知
  70. */
  71. @Override
  72. public void onFirstFramePreviewed(AlivcLivePusher pusher) {
  73. }
  74. /**
  75. *丢帧通知
  76. */
  77. @Override
  78. public void onDropFrame(AlivcLivePusher pusher, int countBef, int countAft) {
  79. }
  80. /**
  81. *调整码率
  82. */
  83. @Override
  84. public void onAdjustBitRate(AlivcLivePusher pusher, int curBr, int targetBr) {
  85. }
  86. /**
  87. *调整帧率
  88. */
  89. @Override
  90. public void onAdjustFps(AlivcLivePusher pusher, int curFps, int targetFps) {
  91. }
  92. });
  93. /**
  94. * 设置网络通知事件
  95. *
  96. * @param infoListener 通知监听器
  97. */
  98. mAlivcLivePusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {
  99. /**
  100. * 网络差通知
  101. */
  102. @Override
  103. public void onNetworkPoor(AlivcLivePusher pusher) {
  104. }
  105. /**
  106. * 网络恢复通知
  107. */
  108. @Override
  109. public void onNetworkRecovery(AlivcLivePusher pusher) {
  110. }
  111. /**
  112. * 重连开始
  113. */
  114. @Override
  115. public void onReconnectStart(AlivcLivePusher pusher) {
  116. }
  117. /**
  118. * 重连失败
  119. */
  120. @Override
  121. public void onReconnectFail(AlivcLivePusher pusher) {
  122. }
  123. /**
  124. * 重连成功
  125. *
  126. @Override
  127. public void onReconnectSucceed(AlivcLivePusher pusher) {
  128. }
  129. /**
  130. * 发送数据超时
  131. */
  132. @Override
  133. public void onSendDataTimeout(AlivcLivePusher pusher) {
  134. }
  135. /**
  136. * 连接失败
  137. */
  138. @Override
  139. public void onConnectFail(AlivcLivePusher pusher) {
  140. }
  141. });

开始预览

必须在init成功后才能调用开始预览接口。

  1. /**
  2. * 同步接口
  3. */
  4. mAlivcLivePusher.startPreview(mSurfaceView)
  5. /**
  6. * 异步接口
  7. */
  8. mAlivcLivePusher.startPreviewAysnc(mSurfaceView);

开始推流

必须在预览成功后才能调用开始推流接口。

  1. /**
  2. * 同步接口 mPushUrl 推流地址
  3. */
  4. mAlivcLivePusher.startPush(mPushUrl);
  5. /**
  6. * 异步接口
  7. */
  8. mAlivcLivePusher.startPushAysnc(mPushUrl);

停止推流

必须在预览成功或这推流成功后才能调用。

  1. mAlivcLivePusher.stopPush();

停止预览

必须在初始化成功或预览成功后才能调用。

  1. mAlivcLivePusher.stopPreview();

暂停推流

必须在预览成功或推流成功或暂停推流时才能调用,此时sdk不会停止对音频的采集,如不需要采集,需要调用 静音接口 setMute(true/false)。

  1. mAlivcLivePusher.pause();

恢复推流

必须在推流暂停状态下才能调用。

  1. /**
  2. * 同步接口
  3. */
  4. mAlivcLivePusher.resume();
  5. /**
  6. * 异步接口
  7. */
  8. mAlivcLivePusher.resumeAsync();

重新推流

必须在推流状态下或者sdk返回错误时,才能调用。

  1. /**
  2. * 同步接口
  3. */
  4. mAlivcLivePusher.restartPush();
  5. /**
  6. * 异步接口
  7. */
  8. mAlivcLivePusher.restartPushAync();

推流重连

必须在推流状态下或者sdk返回错误时,才能调用。

  1. mAlivcLivePusher.reconnectPushAsync();

销毁

  1. mAlivcLivePusher.destroy();

设置静音

必须在预览或者推流成功后才能调用。

  1. // 静音/不静音
  2. mAlivcLivePusher.setMute(true)/mAlivcLivePusher.setMute(false);

旋转摄像头

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.switchCamera();

闪光灯打开/关闭

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.setFlash(true);/mAlivcLivePusher.setFlash(false);

预览镜像打开/关闭

必须在预览成功后才能调用。

  1. mAlivcLivePusher.setPreviewMirror(true);/mAlivcLivePusher.setPreviewMirror(false);

推流镜像打开/关闭

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.setPushMirror(true);/mAlivcLivePusher.setPushMirror(false);

美颜打开/关闭

必须在预览或者推流成功或推流暂停后才能调用。

  1. mAlivcLivePusher.setBeautyOn(true);/mAlivcLivePusher.setBeautyOn(false);

美颜参数 范围都是0~100

必须在预览或者推流成功后才能调用。

  • 美颜 美白参数

    1. mAlivcLivePusher.setBeautyWhite(50);
  • 美颜 磨皮参数

    1. mAlivcLivePusher.setBeautyBuffing(50)
  • 美颜 亮度参数

    1. mAlivcLivePusher.setBeautyBrightness(50)
  • 美颜 红润参数

    1. mAlivcLivePusher.setBeautyRuddy(50)
  • 美颜 饱和度参数

    1. mAlivcLivePusher.setBeautySaturation(50)

自动对焦

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.setAutoFocus(true);/mAlivcLivePusher.setAutoFocus(false);

手动对焦

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.focusCameraAtAdjustedPoint(x, y, true); // x,y 坐标点

设置缩放

必须在预览或者推流成功后才能调用。

  1. /**
  2. * 设置缩放[0,getMaxZoom()]
  3. */
  4. mAlivcLivePusher.setZoom(5);

获取摄像头支持的最大缩放值

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.getMaxZoom()

获取当前缩放值

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.getCurrentZoom()

设置最大视频码率

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.setMaxVideoBitrate(800)

设置最小视频码率

必须在预览或者推流成功后才能调用。

  1. mAlivcLivePusher.setMinVideoBitrate(400)

获取设备是否支持自动对焦

必须在预览或者推流成功后才能调用。

  1. /**
  2. *返回值 ture 支持 false 不支持
  3. */
  4. mAlivcLivePusher.isCameraSupportAutoFocus()

获取是否支持闪光灯

必须在预览或者推流成功后才能调用。

  1. /**
  2. *返回值 ture 支持 false 不支持
  3. */
  4. mAlivcLivePusher.isCameraSupportFlash()

是否正在推流

  1. /**
  2. *返回值 ture 正在推流 false 没有推流
  3. */
  4. mAlivcLivePusher.isPushing()

获取推流URL

  1. mAlivcLivePusher.getPushUrl()

设置推流方向

  1. /**
  2. * AlivcPreviewOrientationEnum
  3. *
  4. * ORIENTATION_PORTRAIT(0) 竖屏
  5. * ORIENTATION_LANDSCAPE_HOME_RIGHT(90) 横屏,Home键在右侧
  6. * ORIENTATION_LANDSCAPE_HOME_LEFT(270) 横屏,Home键在左侧
  7. */
  8. mAlivcLivePusher.setPreviewOrientation(ORIENTATION_PORTRAIT)

获取推流统计数据

  1. mAlivcLivePusher.getLivePushStatsInfo()

设置日志级别

  1. /**
  2. * AlivcLivePushLogLevel
  3. *
  4. * AlivcLivePushLogLevelAll(1) 全部
  5. * AlivcLivePushLogLevelVerbose(2) 冗长
  6. * AlivcLivePushLogLevelDebug(3) 调试
  7. * AlivcLivePushLogLevelInfo(4) 提示
  8. * AlivcLivePushLogLevelWarn(5) 警告
  9. * AlivcLivePushLogLevelError(6) 错误
  10. * AlivcLivePushLogLevelFatal(7) 阻塞错误
  11. */
  12. mAlivcLivePusher.setLogLevel(AlivcLivePushLogLevelAll)

四、异常及特殊场景处理

1.回调错误处理

1. AlivcLivePushErrorListener 错误回调

onSystemError系统错误 建议退出推流

onSDKErrorSDK错误,返回相应的错误码,建议处理方式

1)退出直播

2)调用 restartPush/restartPushAsync 重启AlivcLivePusher对于特殊的错误码处理:

errorCode 错误描述
AlivcLivePushError.ALIVC_PUSHER_ERROR_SDK_CAPTURE_CAMERA_OPEN_FAILED APP没有摄像头权限
AlivcLivePushError.ALIVC_PUSHER_ERROR_SDK_CAPTURE_MIC_OPEN_FAILED APP没有mic权限

2. AlivcLivePushNetworkListener 网络回调

onNetworkPoor

收到SDK网速慢回调时,说明当前网络对于推流的支撑度不足,此时推流仍在继续。没有中断。

onNetworkRecovery

网络恢复通知

onConnectFail & onReconnectFail & onSendDataTimeout

网络相关错误,可执行操作:1.销毁推流 2.调用 reconnectAsync 重连,建议重连之前先做网络检测和推流地址检测

onReconnectSucceed

重连成功回调

2.退后台 & 锁屏

退后台 & 锁屏

调用 AlivcLivePusher 的 pause()/resume() 可以自动恢复推流

**对于非系统的音视频通话,sdk会采集声音并推送出去,客户可以根据场景的需求在退后台或锁屏时 调用 静音接口 mAlivcLivePusher.setMute(true/false);

注:退后台,SDK不推音频数据

3.网络异常 & 播放器重连

1)短时间网络切换和断网

  • 短时间网络切换 推流SDK会自动重连,默认重连 5 次,重连间隔 1000 ms,用户也可以自定义重连次数及间隔 如果重连失败,参考断网处理。
  • 断网 断网后,会有重连失败回调 AlivcLivePushNetworkListener onReconnectFail 可以直接销毁推流;也可以调用reconnectPushAsync() 调用之前检测网络状态和推流地址是否正确。

2)长时间断网

长时间断网,在用户设置的重连次数内没有连上,SDK回调重连失败 onReconnectFail,等待网络恢复,可以重新调用reconnectPushAsync()进行重连。观众播放端需要重新拉流播放,就可以正常播放。

3)网络差 网络恢复

在网络不足以支撑当前推流的情况下,SDK会回调 AlivcLivePushNetworkListener 监听器

  1. * 网络差:
  2. onNetworkPoor
  3. * 网络恢复
  4. onNetworkRecovery

可以做UI提示,提示用户检测网络,也可以调用重连接口:reconnectPushAsync(),建议调用之前检测网络状态。重连回调:

  1. ```
  2. /**
  3. * 重连开始
  4. */
  5. public void onReconnectStart(AlivcLivePusher pusher);
  6. /**
  7. * 重连失败
  8. */
  9. public void onReconnectFail(AlivcLivePusher pusher);
  10. /**
  11. * 重连成功
  12. */
  13. public void onReconnectSucceed(AlivcLivePusher pusher);
  14. ```

4)重连

在网络情况不好的情况,可以调用reconnectPushAsync()函数,进行重连;在SDK返回网络错误或推流错误时,检测过网络后,也可以调用重连接口。

  1. mAlivcLivePusherreconnectPushAsync();

5)播放器重连

阿里云播放器重连需要先停止播放在开始播放。调用接口顺序 stop -> prepareAndPlay

  1. mPlayer.stop();
  2. mPlayer.prepareAndPlay(mUrl);

注:关于播放器的使用详见:阿里云播放器使用说明

4.码率设置

SDK内部有动态变化码率策略,码率预设值在AlivcLivePushConfig中修改。根据产品需求对于视频分辨率、视频流畅度、视频清晰度的要求不同,对应设置的码率范围也不同,具体参考如下:

  1. 视频清晰度:推流码率越高,则视频清晰度越高。所以推流分辨率越大,所需要设置的码率也就越大,这样可以保证视频清晰度。
  2. 视频流畅度:推流码率越高,所需要的网络带宽越大。所以在较差的网络环境下,设置较高的码率有可能影响视频流畅度。

五、注意事项

1.检查混淆

确认已将SDK相关包名加入了不混淆名单

  1. -keep class com.alibaba.livecloud.** { *;}
  2. -keep class com.alivc.** { *;}

2.接口调用

  • 同步异步接口调用同步异步接口都可以正常调用,尽量使用异步接口调用,可以避免对主线程的资源消耗
  • 接口异常处理SDK接口都会在发生错误或者调用顺序不对时 thorws 出异常,调用时注意添加try catch 处理,否则会造成程序的crash
  • 接口调用顺序接口调用顺序.png

3.关于包大小

  • SDK大小 arm64-v8a 11.7M/v7a 9M
  • 集成SDK后 包增加 3.6M

4.关于历史版本升级说明

推流SDK V1.3升级至V3.0、连麦SDK升级至推流V3.0,请下载升级说明文档

本文导读目录