MRTC iOS SDK
目录
接入使用步骤
环境要求
- Xcode 9.0+
iOS 9.0+ 真机
SDK接入步骤
- 安装
CocoaPods
,在终端中输入如下命令:brew install cocoapods
- 在项目根目录下运行中端命令:
pod init
在
profile
文件中加入如下代码:platform :ios, '9.0' target 'Your App' do pod 'MRTC' end
- 在项目根目录下运行中端命令:
pod install
- 在
Build Settings
中将Build Options
下的Enable Bitcode
设为NO
- 在
Capabilities
中将Background Modes
打开就可以在后台保持推拉流状态。
- 安装
- SDK的基本使用流程如下:
- 推流sdk
- MRTCSetting配置推流参数,创建MRTCPusher
- 传入推流预览视图,开始预览
- 开始推流
- 根据使用场景切换摄像头,暂停恢复等等
- 拉流sdk
- 创建MRTCPuller
- 传入拉流地址和预览视图,开始拉流
- 根据使用场景暂停恢复等等
设置
您可以使用MRTCSetting
配置推流参数,每一个参数都有默认值,也可以从MRTCSetting
中获取机器支持的配置。
- 基本配置
在需要使用推流器的ViewController
中引用头文件#import <MRTC/MRTCSetting.h>
,示例代码如下:MRTCSetting *setting = [[MRTCSetting alloc]init];
- 自定义配置
- 获取支持的编解码器
NSArray<MRTCCodec *> *supportCodecs = [MRTCSetting supportVideoCodec];
- 获取支持的分辨率(注:分辨率格式为 宽x高)
NSArray<NSString *> *supportResolutions = [MRTCSetting supportVideoResolutions];
- 获取支持的fps范围
MRTCFpsRange *fpsRange = [MRTCSetting supportFPSRange]; NSUInteger min = fpsRange.minFps;//支持的最小fps NSUInteger max = fpsRange.maxFps;//支持的最大fps
- 构造自定义配置
设置为自定配置时,您需要自己定义偏好编解码器、视频分辨率、最大码率、帧率、前后摄像头。MRTCSetting *customSetting = [[MRTCSetting alloc]initWithVideoCodec:supportCodecs.firstObject videoResolution:@"1280x720" maxBitRate:1800 fps:25 useFrontCamera:YES];
- 获取支持的编解码器
自定义配置建议参数:
分辨率 | 帧率 | 码率 |
---|---|---|
360p | 25 | 350 |
480p | 25 | 600 |
540p | 25 | 1000 |
720p | 25 | 1500 |
360p | 30 | 400 |
480p | 30 | 750 |
540p | 30 | 1200 |
720p | 30 | 1800 |
注:码率估算公式:(0.0000782*视频宽*视频高*帧率)
编解码器
属性解析
@interface MRTCCodec : NSObject<NSCoding> @property (nonatomic, copy, readonly) NSString *name; @property (nonatomic, copy, readonly) NSDictionary *parameters; - (BOOL)isEqualToCodec:(MRTCCodec *)codec; @end
name
属性为编解码器的名称,例如H264
、VP8
、VP9
。
parameters
为编解码器详细格式,仅h264
编解码器拥有此属性,VP8
、VP9
此属性为空值。- 方法解析
判断两个编解码器是否一样- (BOOL)isEqualToCodec:(MRTCCodec *)codec;
推流
- 推流器的使用
MRTCPuller为拉流的核心类- 初始化
在配置好推流参数后,可以使用MRTCPusher
的- (instancetype)initWithSetting:(MRTCSetting *)setting errorDelegate:(id<MRTCPusherErrorDelegate>)errorDelegate;
方法通过推流配置进行初始化,并注册错误回调代理
例:MRTCPusher *pusher = [[MRTCPusher alloc]initWithSetting:setting errorDelegate:self];
- 注册推流回调代理
推流回调代理有两种:errorDelegate、pusherDelegate。errorDelegate做错误回调;pusherDelegate做推流状态回调。[pusher setErrorDelegate:self]; [pusher setPusherDelegate:self];
- 开始预览
pusher对象初始化完成之后,可以开始进行预览操作。预览时需要传入用于显示摄像头捕获画面的
UIView
。示例代码如下:[pusher startPreviewWithView:self.view];
- 开始推流
预览后可以开始推流,您摄像头捕获的视频画面将传输到流媒体服务器。如果您不需要传输视频画面,只需要推音频流,跳过预览步骤即可[pusher startPushWithUrl:@"推流地址" delegate:self];
- 其他推流控制
推流控制主要包括开始推流、停止推流、开始预览、停止预览、暂停推流、恢复推流、静音、恢复静音、销毁推流等操作,您可以根据业务需求添加按钮进行操作。示例代码如下:/*正在推流状态下可以调用暂停推流,暂停推流后将会暂停视频推流。*/ [pusher pause]; /*暂停状态可调用恢复推流,视频将会恢复正常推流。*/ [pusher resume]; /*推流状态下可调用停止推流,调用后推流停止*/ [pusher stopPush]; /*预览状态下才可以调用停止预览,如在推流状态下调用停止预览,视频将停留在最后一帧,如需重新推视频流,需要调用停止推流后后重新推*/ [pusher stopPreivew]; /*静音操作,在推流状态下调用将停止音频推流*/ [pusher mute]; /*恢复静音操作,在静音状态下调用将恢复音频推流*/ [pusher unmute]; /*切换摄像头,在预览状态下或推流状态下调用调转摄像头(前后切换)*/ [pusher switchCamera]; /*设置码率,码率可在初始化配置时设置,也可在推流状态下实时调整*/ [pusher setMaxBitrate:2000]; /*开启关闭闪光灯*/ [pusher setFlashLight:YES/NO]; /*销毁推流,调用销毁推流将停止预览、停止推流,并销毁一切推流资源,不在需要推流的时候请调用此方法,否则有可能内存泄漏*/ [pusher destory]; /*获取推流状态*/ MRTCPusherState state = [pusher getPushState];
- 初始化
拉流
- 拉流器的使用
MRTCPuller为拉流的核心类- 初始化
使用MRTCPuller的
initWithPullerDelegate
方法进行初始化。示例代码如下:MRTCPuller puller = [[MRTCPuller alloc]initWithPullerDelegate:self];
- 注册拉流回调
拉流回调问两种errorDelegate,pullerDelegate。errorDelegate主要做错误微雕;pullerDelegate做拉流状态回调。[puller setPullerDelegate:self]; [puller setErrorDelegate:self];
- 开始拉流
示例代码如下:/*url为mrtc协议的拉流地址,renderView为视频流渲染view*/ //设置视频的显示方式 self.view.contentMode = UIViewContentModeScaleAspectFit; [puller startPullWithUrl:@"拉流地址" renderView:self.view];
- 拉流其他操作
/*正在拉流状态下可调用暂停视频拉流*/ [puller pause]; /*暂停状态下可调用恢复视频拉流。*/ [puller remuse]; /*推流状态下可以调用静音*/ [puller mute]; /*静音状态下可以调用不静音恢复音频*/ [puller unmute]; /*停止拉流,调用后将停止拉流和渲染*/ [puller stopPull]; /*获取推流状态*/ MRTCPullerState state = [puller getPullState];
- 初始化
使用MRTCPuller的
其他操作
获取推/拉流信息
/* 在推/拉流成功后可调用getStats方法获取拉流信息 hashMap key值含义: candidateType:转发类型 videoCodec:视频编/解码器 videoBitrate:视频码率 videoPacketsLostRate:丢包率 audioCodec:音频编/解码器 */ [pusher getStats:^(NSDictionary * _Nonnull stats){ }]; [puller getStats:^(NSDictionary * _Nonnull stats){ }];