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

使用说明

更新时间:2017-11-22 19:43:30

一、概念说明

  • 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的时候,就会认为是连贯的,此现象称之为视觉暂留。

  • 码率控制

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

  • 视频丢帧

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

  • 动态库

    动态库即动态链接库。与常用的静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。

    注意:Xcode加载动态库需要加载在 Embedded Binaries 中,而不是 Linked Frameworks and Libraries

二、使用流程

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

推流sdk使用流程.png

三、SDK集成

SDK信息

您可以在阿里云官网更新直播SDK

下载后的SDK目录结构如下:包含 AlivcLibRtmp.frameworkALivcLivePusher.framework两个动态库

SDK目录.png | center

系统要求

  • SDK支持iOS 8.0及以上版本系统
  • 硬件CPU支持ARMv7、ARMv7s、ARM64

开发环境

  • SDK编译环境Xcode 8.0及以上版本
  • Xcode运行环境OS X 10.10 及以上版本

SDK集成

示例开发环境为Xcode9.0

  1. 新建SDK测试工程 Single View App – DemoPush。

  2. AlivcLibRtmp.frameworkALivcLivePusher.framework两个动态库拖入您的Xcode工程中。SDK导入工程.png | center

  1. 按图示勾选 Copy item if neededSDK导入配置.png | center
  1. 导入SDK成功之后,在Xcode – General – Embedded Binaries添加SDK依赖SDK引用.png | center

添加依赖成功后如图所示

SDK依赖成功.png | center

  1. 在Building Setting – Enable Bitcode 修改为 NO配置依赖bitcode.png | center
  1. 在Info.plist文件中添加麦克风和摄像头权限 Privacy - Microphone Usage Description Privacy - Camera Usage Description配置依赖Infoplist.png | center
  1. 配置iOS 开发证书,选择测试真机,点击Run,提示Buidling Success,SDK添加成功。

四、SDK使用

以上述刚刚创建的DemoPush为例,集成一套最简单的推流功能。

1.代码环境配置

修改需要将所有调用推流SDK的实现文件为 Default - Objective-C++ Source.mm 文件

例如将 ViewController.m 修改为 ViewController.mm

2.引用头文件

ViewController.mm 中引用头文件 #import <AlivcLivePusher/AlivcLivePusherHeader.h>

3.推流参数配置 - AlivcLivePushConfig

推流初始参数配置类,需要在推流开始前预设好。

1)init

  1. AlivcLivePushConfig *config = [[AlivcLivePushConfig alloc] init];

  1. AlivcLivePushConfig *config = [[AlivcLivePushConfig alloc] initWithResolution:AlivcLivePushResolution540P];

2)设置参数值

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

修改分辨率:
  1. config.resolution = AlivcLivePushResolution360P;
修改帧率:
  1. config.fps = AlivcLivePushFPS10;
修改目标码率:
  1. config.targetVideoBitrate = 1200; // 最大码率1200Kbps
修改最小码率:
  1. config.minVideoBitrate = 400; // 最小码率400Kbps
修改初始码率:
  1. config.initialVideoBitrate = 900; // 初始码率900Kbps
修改关键帧间隔
  1. config.videoEncodeGop = AlivcLivePushVideoEncodeGOP_3;
修改重连重连时长:
  1. config.connectRetryInterval = 2000; // 单位为毫秒,重连时长2s
修改预览镜像:
  1. config.previewMirror = false; // 关闭预览镜像
修改美颜开关:
  1. config.beautyOn = false; // 关闭美颜
修改美颜参数:
  1. // 美白80
  2. config.beautyWhite = 80;
  3. // 磨皮80
  4. config.beautyBuffing = 80;
  5. // 亮度10
  6. config.beautyBrightness = 10;
  7. // 红润10
  8. config.beautyRuddy = 10;
  9. // 饱和度0
  10. config.beautySaturation = 0;
修改推流方向:
  1. config.orientation = AlivcLivePushOrientationLandscapeLeft; // Left横屏推流

3)添加水印

注:水印图片必须为png格式图片,最多支持三张水印。输入的水印的coordX,coordY,width值为相对于值。

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

  1. NSString *watermarkBundlePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"watermark"] ofType:@"png"];
  2. [config addWatermarkWithPath: watermarkBundlePath
  3. watermarkCoordX:0.1
  4. watermarkCoordY:0.1
  5. watermarkWidth:0.3];

4.推流类 - AlivcLivePusher

1)init

  1. 声明属性

    1. @property (nonatomic, strong) AlivcLivePusher *livePusher;
  2. 初始化

    推流类AlivcLivePusher的init需要传入一个AlivcLivePushConfig推流配置对象。

    1. self.livePusher = [[AlivcLivePusher alloc] initWithConfig:config];
  3. 注册回调

    推流回调,分为三种:Info、Error、Network。Info主要做提示和状态检测使用;Error为错误回调;Network主要为网络相关,注册delegate可接受对应的回调。

    1. [self.livePusher setInfoDelegate:self];
    2. [self.livePusher setErrorDelegate:self];
    3. [self.livePusher setNetworkDelegate:self];

2)开始预览

livePusher对象初始化完成之后,可以进行开始预览操作。预览时需要传入摄像头预览的显示view(继承自UIView)。

  1. [self.livePusher startPreview:self.view];

3)开始推流

监听回调,收到预览成功回调之后才可以推流。

监听 AlivcLivePusherInfoDelegateonPreviewStarted 回调,预览成功后可以开始推流。

  1. [self.livePusher startPushWithURL:@"推流测试地址(rtmp://......)"];

  1. [self.livePusher startPushWithURLAsync:@"推流测试地址(rtmp://......)"];

赋值正确的测试推流地址,开始推流后,用播放器(ffplay、flash播放器、VLC等)播放拉流地址,播放成功,则推流成功。

4)停止推流

推流状态下可调用停止推流,完成后推流停止。

  1. [self.livePusher stopPush];

5)停止预览

在预览状态下才可以调用停止预览,注:正在推流状态下,调用停止预览无效。

  1. [self.livePusher stopPreview];

预览停止后,预览画面定格在最后一帧。

6)销毁推流

  1. [self.livePusher destory];
  2. self.livePusher = nil;

销毁推流后,推流停止,预览停止,预览画面移除。AlivcLivePusher相关的一切资源销毁。

7)重新推流

推流状态下或者接收到所有Error相关回调状态下可调用重新推流, 且Error状态下只可以调用此接口(或者reconnectPushAsync重连)或者调用destory销毁推流。

  1. [self.livePusher restartPush];

完成后重新开始推流,重启ALivcLivePusher内部的一切资源,包括预览、推流等等restart。

8)推流重连

推流状态下或者接收到AlivcLivePusherNetworkDelegate相关的Error回调状态下可调用此接口, 且Error状态下只可以调用此接口(或者restartPush重新推流)或者调用destory销毁推流。

  1. [self.livePusher reconnectPushAsync];

完成后推流重连,重新链接推流RTMP。

9)其他推流相关设置

暂停推流

正在推流状态下可调用暂停推流。

  1. [self.livePusher pause];

暂停推流后,视频预览和视频推流保留在最后一帧,音频推流继续。

恢复推流

暂停状态下可调用恢复推流。

  1. [self.livePusher resume];

恢复推流后,音视频预览与推流恢复正常。

设置静音

开始预览之后均可调用静音。

  1. [self.livePusher setMute:isMute?true:false];

完成后,播放端播放有画面无声音。

修改码率范围

  1. [self.livePusher setTargetVideoBitrate:800];
  2. [self.livePusher setMinVideoBitrate:200]

10)其他摄像头设置

摄像头相关设置,在开始预览之后可调用,包括推流状态、暂停状态、重连状态等等。未开始预览状态下调用如下接口无效。

旋转摄像头

切换前后摄像头

  1. [self.livePusher switchCamera];
闪光灯开关
  1. [self.livePusher setFlash:false]; // 关闭闪光灯
变焦

变焦(摄像头缩放),传入参数为正数,则方法焦距,传入参数为负数则缩小焦距。

  1. CGFloat max = [_livePusher getMaxZoom];
  2. [self.livePusher setZoom:MIN(1.0, max)]; // 变焦焦距 1.0
手动聚焦

手动聚焦需要传入两个参数:1.point 对焦的点(需要对焦的点的坐标);2.autoFocus 是否需要自动对焦,该参数仅对调用接口的该次对焦操作生效。后续是否自动对焦沿用上述自动聚焦接口设置值。

  1. [self.livePusher focusCameraAtAdjustedPoint:CGPointMake(50, 50) autoFocus:true];
自动聚焦
  1. [self.livePusher setAutoFocus:false]; // 关闭自动聚焦
美颜开关
  1. [self.livePusher setBeautyOn:true]; // 开启美颜
美颜参数调整
  1. // 美白 100
  2. [self.livePusher setBeautyWhite:100];
  3. // 磨皮 100
  4. [self.livePusher setBeautyBuffing:100];
  5. // 红润 20
  6. [self.livePusher setBeautyRuddy:20];
  7. // 亮度 10
  8. [self.livePusher setBeautyBrightness:10];
  9. // 饱和度 10
  10. [self.livePusher setBeautySaturation:10];

镜像设置

镜像相关接口有两个,PushMirror推流镜像和PreviewMirror预览镜像。PushMirror设置仅对播放画面生效,PreviewMirror仅对预览画面生效,两者互不影响。

  1. [self.livePusher setPushMirror:false];// 关闭推流镜像
  2. [self.livePusher setPreviewMirror:false];// 关闭预览镜像

11)其他状态信息获取、版本号获取、Log设置

AlivcLivePusher初始化完成后,均可调用如下接口

获取是否正在推流
  1. BOOL isPushing = [self.livePusher isPushing]; // YES:正在推流 NO:未推流
获取推流地址
  1. NSString *pushURLString = [self.livePusher getPushURL];
获取推流性能调试信息

推流性能参数具体参数和描述参考API文档或者接口注释。

  1. AlivcLivePushStatsInfo *info = [self.livePusher getLivePushStatusInfo];
获取版本号
  1. NSString *sdkVersion = [self.livePusher getSDKVersion];
Log设置
  1. [self.livePusher setLog:true]; // 打开Log
  2. [self.livePusher setLogLevel:(AlivcLivePushLogLevelDebug)]; // 设置SDK输出Log级别为Debug级别

五、异常及特殊场景处理

1.收到AlivcLivePusherErrorDelegate

onSystemError:

系统级错误,需要退出直播

onSDKError:

SDK错误,可执行操作有:1.销毁直播 2.调用 restartPush/restartPushAsync 重启AlivcLivePusher

需要特别处理APP没有麦克风权限和没有摄像头权限的回调

错误描述 errorCode
APP没有麦克风权限 268455940
APP没有摄像头权限 268455939

2.收到AlivcLivePusherNetworkDelegate

onNetworkPoor & onNetworkRecovery

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

onNetworkRecovery : 网络恢复。

onConnectFail & onReconnectError & onSendDataTimeout

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

onReconnectStart & onReconnectSuccess

SDK内部每次自动重连或者开发者主动调用 reconnectAsync 重连接口的情况下,会回调 onReconnectStart 重连开始。每次重连都会对 RTMP 进行重连链接。注意:RTMP链接建立成功之后会回调 onReconnectSuccess 此时只是链接建立成功,并不意味着可以推流数据成功,如果链接成功之后,由于网络等原因导致推流数据发送失败,SDK会在继续重连

3.网络中断

短时间断网和网络切换

短时间的网络波动或者网络切换,一般情况下,中途断网时长在AlivcLivePushConfig设置的重连超时时长和次数范围之内,SDK会进行自动重连,重连成功之后将继续推流。若使用阿里云播放器,建议播放器收到超时通知 AliVcMediaPlayerPlaybackDidFinishNotification 之后短暂延时5s后再做重连操作。

长时间断网

断网时长在AlivcLivePushConfig设置的重连超时时长和次数范围之外的情况下,SDK自动重连失败,此时会回调 onReconnectError:error: 在等到网络恢复之后调用 reconnectAsync接口进行重连。同时播放器也要配合做重连操作。

  1. 建议在SDK外部做网络监测
  2. 主播端和播放端在客户端无法进行直接通信,需要配合服务端使用。比如主播端断网,服务端会收到CDN的推流中断回调,此时可以推动给播放端,主播推流中断,播放端在作出相应处理。恢复推流同理。
  3. 阿里云播放器重连需要先停止播放在开始播放。调用接口顺序 stop -> prepare -> play 。示例如下:
  1. [self.mediaPlayer stop];
  2. AliVcMovieErrorCode err = [self.mediaPlayer prepareToPlay:[NSURL URLWithString:@"播放地址"]];
  3. if(err != ALIVC_SUCCESS) {
  4. NSLog(@"play failed,error code is %d",(int)err);
  5. return;
  6. }
  7. [self.mediaPlayer play];

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

4.退后台 & 接听电话

SDK内部已经做好退后台相关处理,用户无需做操作。退入后台SDK默认继续推流音频,视频保留在最后一帧。用户需要在APP的Capablities中打开Background Mode选项,选中Audio,AirPlay and Picture in Picture。保证APP退后台可以正常采集音频;如果需要更改退后台逻辑,在退入后台后不退流音频,可以调用静音接口- setMute,关闭后台音频后,APP退入后台有被iOS系统挂起的风险。如图:

退后台配置.png

5.码率设置

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

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

六、注意事项

  1. 在集成SDK的代码中需要将实现文件更改为 Default - Objective-C++ Source.mm 文件
  2. SDK大小 : 10.7MB
  3. 集成SDK后,ipa包增加大小 :约 2.8MB 左右
  4. 适配机型 :iPhone5s及以上版本,iOS8.0及以上版本
  5. 推流SDK V1.3升级至V3.0、连麦SDK升级至推流V3.0,请下载升级说明文档
本文导读目录