ios基于LFLiveKit的直播項目

NumbersHenl 7年前發布 | 25K 次閱讀 iOS開發 移動開發

最近一直在研究直播相關的東西,在網上遨游了幾天,也算是有點成果了。其實直播在移動端的工作并沒有太多的東西,也就音視頻采集、音視頻處理、推流,剛開始最好先把這些自己走一遍,把原理和流程搞懂,最后我會放一些我找的一些資料,可以根據自己需要看一下。現在有很多第三方都可以幫你實現這些功能,包括金山的推流SDK,基本的功能都有而且免費,感興趣的可以自己去看一下金山云直播推流SDK,后面我會寫一個關于金山云直播的簡書,下面就來說一下我們今天的主角LFLiveKit,它已經幫我們實現了視頻采集、后臺錄制、美顏功能、支持h264、AAC編碼,動態改變速率,RTMP傳輸等,我們開發的時候就很簡單了,先上幾張demo截圖

廢話不多說,開始你的第一個直播項目

新建項目不用我說了吧????,把文件拖入你的項目或者在你的podfile加入 pod 'LFLiveKit' ,(它的美顏使用的是GPUImage,感興趣的可以看一下 GPUImage詳細解析 ),在直播控制器引用頭文件

 #import "LFLiveKit.h"
@property (nonatomic, strong)LFLiveSession *session;

下面看一下常用的一些屬性

@property (nullable,nonatomic, weak) delegate;//代理方法 
@property (nonatomic, assign) BOOL running;//控制直播是開還是關的狀態
@property (nonatomic, strong,null_resettable) UIView *preView;//視頻圖層
@property (nonatomic, assign) AVCaptureDevicePosition captureDevicePosition;//攝像頭方向
@property (nonatomic, assign) BOOL beautyFace;//美顏開關
@property (nonatomic,assign) BOOL muted;//靜音開關
@property (nullable,nonatomic, strong,readonly) LFLiveStreamInfo * streamInfo;//控制直播流的信息
@property (nonatomic,assign,readonly) LFLiveState state;//直播流上傳的狀態
@property (nonatomic,assign) BOOL showDebugInfo;//
@property (nonatomic,assign) NSUInteger reconnectInterval;//重連間隔

然后初始化配置,因為我這里有更改設置的需求,所以就在viewDidAppear里做的初始化配置

-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//初始化LFLiveSession
[self RtmpInit];
}

配置的時候可以使用默認設置,也可以自定義采集和推流設置,previewView自己創建吧,相關代碼就不貼了

LFLiveSession *session  = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfiguration] captureType:LFLiveCaptureDefaultMask];
session.preView= previewView;
//設置代理
_session.delegate = self;
_session.running = YES;

開始直播,這里的RTMP_URL_1為推流地址

LFLiveStreamInfo *stream = [LFLiveStreamInfo new];
stream.url = RTMP_URL_1;
[self.session startLive:stream];

結束直播

[self.session stopLive];

下面來看一下他的代理方法

1、直播狀態,返回的是一個枚舉類型

- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange:(LFLiveState)state ;
typedef NS_ENUM (NSUInteger, LFLiveState){
/// 準備
LFLiveReady = 0,
/// 連接中
LFLivePending = 1,
/// 已連接
LFLiveStart = 2,
/// 已斷開
LFLiveStop = 3,
/// 連接出錯
LFLiveError = 4,
///  正在刷新
LFLiveRefresh = 5
};

2、連接失敗

- (void)liveSession:(LFLiveSession *)session errorCode:(LFLiveSocketErrorCode)errorCode;

3、直播流的信息,如果需要顯示當前流量和實時碼率等信息可以在這個方法里實現

- (void)liveSession:(LFLiveSession *)session debugInfo:(LFLiveDebug *)debugInfo;

最后說一下閃光燈切換、靜音開關等功能的使用

_session.torch =!_session.torch;//閃光燈開關
_session.muted = !_session.muted;//靜音開關
//切換攝像頭
AVCaptureDevicePosition devicePositon = self.session.captureDevicePosition;
self.session.captureDevicePosition = (devicePositon == AVCaptureDevicePositionBack) ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;

最后再讓我們來看一下美顏,我這里簡單的做一個調節美顏程度和亮度的功能,創建兩個UISlider,分別控制美顏和亮度,具體實現上代碼

#pragma mark --美顏效果調節
- (void)sliderValueChage:(id)slider
{
UISlider *searchSlider = slider;
switch (searchSlider.tag) {
case 105:
{
self.session.beautyLevel = searchSlider.value/100;
NSString *voiceValue = [NSString stringWithFormat:@"%.0f",searchSlider.value];
_beautyValue.text = voiceValue;
CGFloat change = (_lastBeautyValue - searchSlider.value) *2;
if (searchSlider.value < 20) {
_beautyValue.textAlignment = NSTextAlignmentRight;
}else if (searchSlider.value>80)
{
_beautyValue.textAlignment = NSTextAlignmentLeft;
}else
{
_beautyValue.textAlignment = NSTextAlignmentCenter;
}
[UIView animateWithDuration:0.1 animations:^{
_beautyValue.x -= change;
}];
_lastBeautyValue = searchSlider.value;
}
break;
case 106:
{
self.session.brightLevel = searchSlider.value/100;
NSString *voiceValue = [NSString stringWithFormat:@"%.0f",searchSlider.value];
_brightValue.text = voiceValue;
CGFloat change = (_lastBrightValue - searchSlider.value) *2;
if (searchSlider.value < 20) {
_brightValue.textAlignment = NSTextAlignmentRight;
}else if (searchSlider.value>80)
{
_brightValue.textAlignment = NSTextAlignmentLeft;
}else
{
_brightValue.textAlignment = NSTextAlignmentCenter;
}
[UIView animateWithDuration:0.1 animations:^{
_brightValue.x -= change;
}];
_lastBrightValue = searchSlider.value;
}
break;
default:
break;
}
}

當然你也可以自定義你需要的美顏樣式,這里就不多說了,附上我自己寫的demo地址 ZQLiveDemo ,寫的不好湊合看一下????。如發現不對的地方,歡迎指正

下面放一些不錯的文章,可以看一下

iOS 直播 —— 推流

轉 映客 LFLiveKit 推流

【如何快速的開發一個完整的iOS直播app】(原理篇)

最簡單的基于FFmpeg的推流器(以推送RTMP為例)

基于GPUImage的實時美顏濾鏡

 

來自:http://www.cocoachina.com/ios/20170828/20393.html

 

 本文由用戶 NumbersHenl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!