标签:
推流用的是一个第三方的IFLiveKit框架。这个框架基于rtmp协议的,c语言和oc语言分开的非常清楚,对oc语言非常友好,使用起来相对简单。
IFLiveKit内部集成了GPUIImage。内部实现了图片渲染等美艳效果。减少了开发时候美艳效果的调试。
需求:创建一个简单的推流页面。包含功能有:1.推流状态监听。2.切换摄像头。3.切换美艳效果。4.开关推流。
一.推流之前需要检查摄像头和麦克风等权限是否开启,并启动摄像头,核心代码如下:
//判断是否有摄像头
if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
[self showInfo:@"您的设备没有摄像头或者相关的驱动, 不能进行直播"];
return;
}
//判断是否有摄像头权限
AVAuthorizationStatus authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authorizationStatus == AVAuthorizationStatusRestricted|| authorizationStatus == AVAuthorizationStatusDenied) {
[self showInfo:@"app需要访问您的摄像头。\n请启用摄像头-设置/隐私/摄像头"];
return ;
}
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
[audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
if (granted) {
return YES;
}
else {
[self showInfo:@"app需要访问您的麦克风。\n请启用麦克风-设置/隐私/麦克风"];
return NO;
}
}];
}
二.创建一个按钮.点击开始推流代码如下:
- (LFLiveSession*)session{
if(!_session){
/*** 默认分辨率368 * 640 音频:44.1 iphone6以上48 双声道 方向竖屏 ***/
_session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfigurationForQuality:LFLiveVideoQuality_Medium2]];
/** 自己定制高质量音频128K 分辨率设置为720*1280 方向竖屏 */
/*
LFLiveAudioConfiguration *audioConfiguration = [LFLiveAudioConfiguration new];
audioConfiguration.numberOfChannels = 2;
audioConfiguration.audioBitrate = LFLiveAudioBitRate_128Kbps;
audioConfiguration.audioSampleRate = LFLiveAudioSampleRate_44100Hz;
LFLiveVideoConfiguration *videoConfiguration = [LFLiveVideoConfiguration new];
videoConfiguration.videoSize = CGSizeMake(720, 1280);
videoConfiguration.videoBitRate = 800*1024;
videoConfiguration.videoMaxBitRate = 1000*1024;
videoConfiguration.videoMinBitRate = 500*1024;
videoConfiguration.videoFrameRate = 15;
videoConfiguration.videoMaxKeyframeInterval = 30;
videoConfiguration.orientation = UIInterfaceOrientationPortrait;
videoConfiguration.sessionPreset = LFCaptureSessionPreset720x1280;
_session = [[LFLiveSession alloc] initWithAudioConfiguration:audioConfiguration videoConfiguration:videoConfiguration liveType:LFLiveRTMP];
*/
// 设置代理
_session.delegate = self;
_session.running = YES;
_session.preView = self.livingPreView;
}
return _session;
}
- (IBAction)startTouched:(id)sender {
LFLiveStreamInfo *stream = [LFLiveStreamInfo new];
// 本地推流地址
stream.url = @"rtmp://192.168.199.131:1935/rtmplive/room";
self.rtmpUrl = stream.url;
[self.session startLive:stream];
}
3.创建一个按钮点击关闭推流,代码如下
- (IBAction)endTouched:(id)sender {
// 结束直播
[self.session stopLive];
self.stateLable.text = [NSString stringWithFormat:@"状态: 直播被关闭\nRTMP: %@", self.rtmpUrl];
}
4.创建一个按钮点击切换前后摄像头,代码如下
- (IBAction)camaBtnTouched:(id)sender {
AVCaptureDevicePosition devicePositon = self.session.captureDevicePosition;
self.session.captureDevicePosition = (devicePositon == AVCaptureDevicePositionBack) ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;
NSLog(@"切换前置/后置摄像头");
}
5.创建一个按钮设置美艳功能,代码如下
- (IBAction)beautiyBtnTouched:(id)sender {
((UIButton*)sender).selected = !((UIButton*)sender).selected;
// 默认是开启了美颜功能的
self.session.beautyFace = !self.session.beautyFace;
}
6.推流状态监听,接受代理,代码如下:
#pragma mark -- LFStreamingSessionDelegate
/** live status changed will callback */
- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange:(LFLiveState)state{
NSString *tempStatus;
switch (state) {
case LFLiveReady:
tempStatus = @"准备中";
break;
case LFLivePending:
tempStatus = @"连接中";
break;
case LFLiveStart:
tempStatus = @"已连接";
break;
case LFLiveStop:
tempStatus = @"已断开";
break;
case LFLiveError:
tempStatus = @"连接出错";
break;
default:
break;
}
self.stateLable.text = [NSString stringWithFormat:@"状态: %@\nRTMP: %@", tempStatus, self.rtmpUrl];
}
/** live debug info callback */
- (void)liveSession:(nullable LFLiveSession *)session debugInfo:(nullable LFLiveDebug*)debugInfo{
}
/** callback socket errorcode */
- (void)liveSession:(nullable LFLiveSession*)session errorCode:(LFLiveSocketErrorCode)errorCode{
}
6.自己也需要看到自己的推流画面,并观察美艳效果,代码如下:
- (UIView *)livingPreView
{
if (!_livingPreView) {
UIView *livingPreView = [[UIView alloc] initWithFrame:self.view.bounds];
livingPreView.backgroundColor = [UIColor clearColor];
livingPreView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view insertSubview:livingPreView atIndex:0];
_livingPreView = livingPreView;
}
return _livingPreView;
}
至此,完成了推流工作。这里
标签:
原文地址:http://www.cnblogs.com/MyBlogZH/p/5763589.html