腾讯云视频直播iOS端SDK的使用

SDK的使用

推流SDK的基本使用流程
1、配置推流参数。
2、创建推流接口。
3、创建推流预览视图。
4、开始推流。
5、推流过程中其他功能设置。
6、结束推流。
下面按照步骤分别介绍具体使用方法:

1.配置推流参数

JDLConfig类配置推流参数,每个属性参数有一个对应的默认值,关于默认值和参数范围,参考API文档或注释。可以根据需求修改对应的属性值。如要在推流过程中实时修改参数,参见JDLConfig类提供的属性和方法。
使用:
在在需要使用推流器的ViewController中引用头文件#importcloud_live_sdk_ios/JDLive.h,示例代码如下:

//初始化默认配置方法JDLConfigconfig=[JDLConfigdefaultConfig];//以下均有默认有参数,可以不用设置,也可以重新设置////采集音视频的来源类型默认摄像头config.captureSourceType=JDLCaptureSourceType_Camera;//采集分辨率默认7201280config.captureResolution=JDLPushResolution720P;//推流分辨率默认540960config.pushResolution=JDLPushResolution540P;//性能模式默认均衡config.videoPerformanceMode=JDLVideoPerformanceMode_Balance;//视频直播场景默认自动config.videoLiveScene=JDLVideoLiveScene_Scene0;//帧率默认15fpsconfig.fps=15;//最大帧率默认15fpsconfig.fpsMin=15;//最小帧率默认15fpsconfig.fpsMax=15;//码率,默认800kbpsconfig.videoBitrate=800;//最大码率,默认1200kbpsconfig.videoBitrateMax=1200;//最小码率,默认500kbpsconfig.videoBitrateMin=500;//视频旋转方向默认竖直config.videoOrientation=UIInterfaceOrientationPortrait;//最大重连次数默认3次config.maxReconnectCount=3;//重连时间间隔默认1秒config.reconnectInterval=1.0;//摄像头类型默认前置摄像头config.cameraType=JDLPushCameraTypeFront;//视频编码模式默认自动config.videoEncoderMode=JDLPushVideoEncoderMode_AUTO;//音频编码模式默认AAC_LCconfig.audioEncoderMode=JDLPushAudioEncoderMode_AAC_LC;//音频码率默认32kbpsconfig.audioBitrate=32;//音频采样率默认44100config.audioSampleRate=44100;//通道默认单通道config.audioChannel=JDLPushAudioChannel_1;//关键帧间隔默认3秒config.keyIntervalTime=3;//预览是否镜像默认NOconfig.previewMirror=NO;//推流是否镜像默认NOconfig.pushMirror=NO;//只有音频默认NOconfig.audioOnly=NO;//后台推流开关默认YESconfig.isBackgroundPush=YES;2.创建推流接口类

JDLive类,为推流SDK的核心类,提供摄像头预览、推流回调、推流控制、推流过程中的参数调节等功能。
引入头文件#importcloud_live_sdk_ios/JDLive.h

@property(nonatomic,strong)JDLivelive;//直播推流接口类。

在配置好推流参数后,可以使用推流SDK的initWithConfig方法进行初始化。示例代码如下:

self.live=[[JDLivealloc]initWithConfig:config]

3.创建推流预览视图

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

@property(nonatomic,strong)UIViewpreviewView;//预览视图3.2live接口类加入预览视图//开始预览[self.livestartPreview:self.previewView]//停止预览[self.livestopPreview];4.开始推流

4.1填写推流地址
填写推流地址,推流SDK支持RTMP的推流地址。使用正确的推流地址开始推流后,可用播放器(腾讯云播放器、ffplay、VLC等)进行拉流测试。

[self.livesetPushStreamUrl:[NSURLURLWithString:self.pushUrl]];//开始推流[self.livestartPushStream];其他推流控制,接口示例代码如下://获取SDK版本号[self.livegetSDKVersion];//获取推流地址[self.livegetPushStreamUrl];//开始推流[self.livestartPushStream];//停止推流[self.livestopPushStream];//查询当前是否在推流[self.liveisPushStreaming];//获取推流状态JDLPushStreamStatestate=[self.livegetPushStreamState];

4.2注册推流回调引入推流回调代理

[self.livesetLiveDelegate:self];推流回调有五个,注册delegate可接受对应的回调,代码如下://流状态发生改变(void)onPushStreamStateChange:(JDLPushStreamState)pushStreamState;//推流错误回调(void)onPushStreamError:(JDLPushStreamErrorCode)errorCode;//网络健康状态发生改变(void)onNetworkStatusChange:(JDLNetworkStateCode)networkStateCode;//视频录制状态改变(void)onMediaRecordStateChange:(JDLMediaRecordState)mediaRecordState;//推流模式改变(void)onPushStreamModeChange:(JDLPushStreamMode)pushStreamMode;示例代码如下://推流状态通知-(void)updateUIWithPushStreamState:(JDLPushStreamState)state{switch(state){//初始化时状态为空闲caseJDLPushStreamState_Idle:break;//连接中caseJDLPushStreamState_Connecting:break;//已连接caseJDLPushStreamState_Connected:break;//断开连接中caseJDLPushStreamState_Disconnecting:break;//推流出错caseJDLPushStreamState_Error:break;default:break;}}//视频录制状态改变-(void)updateUIWithMediaRecordState:(JDLMediaRecordState)state{switch(state){//初始状态caseJDLMediaRecordState_Idle:break;//录像失败caseJDLMediaRecordState_Record_Error:break;//录像中caseJDLMediaRecordState_Recording:break;//录像停止caseJDLMediaRecordState_Record_Stopped:break;default:break;}}//推流模式改变-(void)updateUIWithPushStream{//当前模式JDLPushStreamModemode=[self.context.livegetPushStreamMode];switch(mode){//正常推流caseJDLPushStreamMode_Normal:break;//背景图推流caseJDLPushStreamMode_Audio:break;//音频推流caseJDLPushStreamMode_Image_Audio:break;default:break;}}5.结束推流//停止推流[self.livestopPushStream];##更多接口

在推流过程中,可以进行一下功能的设置,设置接口在JDLive类中有详细备注,详细解释和示例代码如下:

  • 前后置摄像头切换
    默认是使用前置摄像头(可以通过修改JDLConfig的配置项cameraType来修改这个默认值),调用一次switchCamera切换一次,注意切换摄像头前必须保证live对象都已经初始化。

if([self.liveisCaptureRunning]){[self.liveswitchCamera];}闪光灯开关

只有后置摄像头才可以打开闪光灯(你可以通过JDLConfig里面的cameraType成员来确认当前摄像头是前置还是后置)

if([self.liveisFlashLightSupported]){[self.livetoggleFlashLight];}else{NSLog(@”后置摄像头时,闪光灯可用。”)}美颜和滤镜

setVideoBeautyWhiteLevel接口可以设置美颜级别,美颜级别0-5级,等级越高,美颜效果约明显。

[self.livesetVideoBeautyWhiteLevel:level];

setVideoFilterEffectIndex接口可以设置不同的滤镜效果,目前支持六种不同风格的滤镜,分别为0-5.

[self.livesetVideoFilterEffectIndex:level];是否静音

在推流过程中,可以进行是否静音推流的设置。

[self.livesetAudioStreamMute:YES];

  • 推流过程中截屏
    在推流过程中,可以进行截屏,必须要保证是在推流过程中,才能截到推流的某一帧。

JDLPushStreamStatepushStatus=[self.livegetPushStreamState];if(pushStatus!=JDLPushStreamState_Connected){NSLog(@"请先开启推流,才能截屏哦~")}else{//在推流,可以截图[self.livesnapshotFromStreamWithCompletion:^(UIImageimg){if(img){//显示在window上//保存相册}}];}

  • 录制推流中视频
    使用startMediaRecord接口可以启动本地录制,录制格式为MP4,通过recordFilePath可以指定MP4文件的存放路径。

DLPushStreamStatepushStatus=[self.livegetPushStreamState];if(pushStatus!=JDLPushStreamState_Connected){//不再推流中,无法开启录制NSLog[@"请先开启推流,才能录制哦~"];}else{//在推流,可以录制//录制的状态开始或者结束控制JDLMediaRecordStatestate=[self.livegetMediaRecordState];if(state!=JDLMediaRecordState_Recording){NSStringdir=[NSHomeDirectory()stringByAppendingString:@"/Documents/"];self.recordFilePath=[dirstringByAppendingPathComponent:@"video_record.mp4"];[self.livestartMediaRecord:[NSURLfileURLWithPath:self.recordFilePath]];}else{[self.livestopMediaRecord];}}

  • 纯音频推流
    如果你的直播场景是声音直播,那么需要更新下推流的配置信息。使用以下代码设置纯音频推流并启动推流。纯音频推流可以设置封面。

if([self.livegetPushStreamMode]!=JDLPushStreamMode_Normal){//不是正常推流,即已经是纯音频推流return;}//弹出是否设置封面提示[[[JDActionControlleralloc]init]showAlertControllerWithTitle:@"纯音频推流"message:@"是否设置封面?"preferredStyle:UIAlertControllerStyleAlertotherButtonTitles:@[@"不设置",@"是"]superViewController:(UIViewController)self.contextactionControllerBlock:^(NSStringbuttonTitle){if([buttonTitleisEqualToString:@"是"]){[SharePhotoManagerShowSheetToSelectedMediaWithInFatherVC:(UIViewController)self.contextFinishPickingMediaBlock:^(UIImageassetImage,NSURLassetURL){//有封面推流[self.livestartBGImagePushStream:assetImage];}];}elseif([buttonTitleisEqualToString:@"不设置"]){[self.livestartBGImagePushStream:nil];}}];//恢复纯音频推流[self.liveresumeNormalPushStream];

  • 水印
    直播视频可以支持打上水印。水印类型支持图片、文字、时间等设置,图片可进行本地照片上传或直接拍摄,文字、时间可进行字体颜色的设置;支持设置透明度;还支持360度的旋转和拉伸。代码示例如下:

//导入#import"WaterMarkEditView.h"//导入#import"TextWaterMarkEditView.h"//导入#import"TimestampWaterMarkEditView.h"//UIImagePickerControllerDelegate,WaterMarkEditViewDelegate//图片类型水印WaterMarkEditViewwaterMarkEditView=[[PictureWaterMarkEditViewalloc]initWithFrame:[selfgetInitPictureEditViewRect]];waterMarkEditView.delegate=self;[self.viewaddSubview:waterMarkEditView];//文字类型水印TextWaterMarkEditViewtextWaterMarkEditView=[[TextWaterMarkEditViewalloc]initWithFrame:[selfgetInitTextEditViewRect]];textWaterMarkEditView.delegate=self;[textWaterMarkEditViewsetText:@"试试"];[textWaterMarkEditViewsetTextFont:[UIFontsystemFontOfSize:14.0]];[self.viewaddSubview:textWaterMarkEditView];//时间类型水印TimestampWaterMarkEditViewtimestampWaterMarkEditView=[[TimestampWaterMarkEditViewalloc]initWithFrame:[selfgetInitTimeEditViewRect]];timestampWaterMarkEditView.delegate=self;[timestampWaterMarkEditViewsetTextFont:[UIFontsystemFontOfSize:14.0]];[timestampWaterMarkEditViewsetTextColor:[UIColorwhiteColor]];[self.viewaddSubview:timestampWaterMarkEditView];

  • 叠加UIView
    除了水印,还在流中可以叠加任意的UIView。例如画笔。
    以画笔为例:

@property(nonatomic,assign)intbrushLayerId;//画笔图层号@property(nonatomic,strong)BrushViewbrushView;//画笔推流View//创建Viewself.brushView=[[BrushViewalloc]init];[self.brushViewsetBackgroundColor:[UIColorclearColor]];[self.brushViewsetFrame:_context.previewView.frame];[selfaddSubview:self.brushView];[selfsendSubviewToBack:self.brushView];//view加的图层号self.brushLayerId=[self.liveaddUIViewWithView:self.brushViewrect:CGRectMake(0,0,1,1)rotation:0alpha:1rotationMode:kJDLNoRotation];

  • 音频调用
    在直播时可以设置自己喜欢的音乐加入直播中,可以从iOS的本地媒体库中获取音乐文件。音频调用的接口如下:

//开始播放背景音乐audioPath本地音乐文件-(void)startBGMusic:(NSString)audioPath;//停止播放背景音乐-(void)stopBGMusicWithComplete:(void(^)(void))completion;//暂停播放背景音乐-(void)pauseBGMusic;//恢复播放背景音乐-(void)resumeBGMusic;//设置播放完成回调-(void)setBGMusicFinishBlock:(void(^)(void))block;//设置播放状态改变回调-(void)setBGMusicStateChangeBlock:(void(^)(void))block;

使用示例代码如下:

//循环播放[self.livesetBGMusicFinishBlock:^(){if(self.strMusicUrl![self.strMusicUrlisEqualToString:@""]){[self.livestartBGMusic:self.strMusicUrl];}}];//添加背景音乐,url是本地文件路径if(self.strMusicUrl![self.strMusicUrlisEqualToString:@""]){[self.livestartBGMusic:self.strMusicUrl];}else{//停止[self.livestopBGMusicWithComplete:^(){}

  • 音频升降调
    setAudioEffectCustomFlag在直播过程中自定义音频升降调效果类型,类型为0-7。

[self.livesetAudioEffectCustomFlag:level];

  • 混音
    推流过程中支持背景混音,支持背景音乐和麦克风的音轨混合,同时可以对其音量进行适当调节。

//track1背景音乐[self.livesetAudioMixEnable:YESwithTrackId:1];[self.livesetAudioMixVolume:translucentValuewithTrackId:1];//track0:麦克风[self.livesetAudioMixEnable:YESwithTrackId:0];[self.livesetAudioMixVolume:translucentValuewithTrackId:0];变声

在直播过程中,可以对声音进行处理。变声类型包括:大叔、萝莉、机器人、庄重等,还可以选择关闭变声。

//设置音频变声效果类型//type0关闭(默认)1大叔2萝莉3宏大4机器人[self.livesetAudioEffectType:type];

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

//预览视图镜像[self.livesetPreviewHFlip:isOn];//推流镜像[self.livesetPushStreamHFlip:isOn];

  • 音频降噪
    在直播过程中,可以对周边噪音进行处理,以保证主播的声音更加清晰。处理的参数范围为:1-4,默认0:关闭降噪。

[self.livesetAudioNoiseHandleParam:isOn?3:0];

  • 自动对焦
    手动点击屏幕,会根据手指聚焦的坐标进行自动对焦。

//摄像头自动变焦[self.livesetCaptureFocusPoint:point];//摄像头自动曝光[self.livesetCaptureExposureAtPoint:point];

  • 悬浮窗推流
    悬浮窗推流是在不销毁之前推流页面的情况下,改变推流预览的尺寸。悬浮窗加在window上,可以出现在任何ViewController中。

self.isNeedFloatPush=isOn;if(self.isNeedFloatPush){FloatPushStreamViewfloatView=[[FloatPushStreamViewalloc]initWithContext:self.context];[floatViewshowInWindow];}

  • 耳返
    指的是当主播带上耳机来唱歌时,耳机中要能实时反馈主播的声音,这是由于主播自己的声音是通过头部骨骼(固体)传入耳朵,而观众听到声音最终是通过空气介质传入耳朵,这两种方式听的声音是有很大差异的,因此主播有需求直接听到观众端的效果。示例代码如下:

if([self.liveisHeadsetPlugIn]){[self.livesetAudioFoldbackEnable:isOn];}else{NSLog[@"请先插入耳机!"];}

  • 旋转锁定
    在推流过程中,屏幕转动时,不想改变直播视频方向,可以设置屏幕旋转锁定,这样直播推流就只有竖直状态。

self.isOrientationLock=isOn;//处理屏幕旋转[self.livesetVideoPushStreamOrientation:(UIInterfaceOrientation)deviceOrientation];

标签