使用LFLive与IJK开发直播项目

闲来无事,自己在空余时间学了一下直播开发。刚开始以为很难,但是当自己做的时候发现很简单,关键是有别人写好的框架。

我看了别人写的一些直播原理,自己也是看得云里雾里的。直播简单来说分为3个模块,第一个模块为录制视频,传输视频到服务器;第二个模块为服务器对传来的视频数据进行编码,转换成你播放视频所支持的网络格式。第三个模块为客户端对服务器进行数据获取并播放。(注意:这里这些只是我自己所述,可能有误,欢迎大神指点

在编写代码前,我们需要用cocoapods将我们需要的库导入 pod'LFLiveKit'。这里还有一个IJK的库是在cocoapods里面找不到的,所以我们需要自己下载,在最后会附上demo,demo里面有IJKMediaFramework的包,直接拉进工程就行了。

1、布局UI,UI布局这就不说了,我的布局很简单,就3个button,一个label。(图片上中间还有一个button,只不过我用了镂空白色的照片,而且截图是截取模拟器的,没有显示照相机的效果,所以看不到。真机测试是有的)

2、录制视频,传输至服务器

在ViewController先导入头文件#import<AVFoundation/AVFoundation.h> 和  #import"LFLiveKit.h" ,遵循代理LFLiveSessionDelegate

在viewDidLoad里面获取摄像头的权限

//block内部调用self,需要__weak防止循环引用

__weaktypeof(self) _self =self;

//判断用户是否确定授权

AVAuthorizationStatus  status = [AVCaptureDeviceauthorizationStatusForMediaType:AVMediaTypeVideo];

switch(status) {

          //用户未选择是否确定

          case  AVAuthorizationStatusNotDetermined:{

[AVCaptureDevice  requestAccessForMediaType:AVMediaTypeVideo  completionHandler:^(BOOL  granted) {

  if(granted) {

  dispatch_async(dispatch_get_main_queue(),^{

              [_self.sessionsetRunning:YES];

                                                              });

            }

                                                      }];

        break;

                  }

//用户已经确定授权

    case  AVAuthorizationStatusAuthorized:

          [_self.sessionsetRunning:YES];

break;

case  AVAuthorizationStatusDenied:

case  AVAuthorizationStatusRestricted:

break;

default:

break;

初始化LFLiveSession类

-(LFLiveSession*)session{

if(!_session) {

_session= [[LFLiveSession  alloc]initWithAudioConfiguration:[LFLiveAudioConfiguration  defaultConfiguration]videoConfiguration:[LFLiveVideoConfiguration  defaultConfiguration]];

_session.running=YES;

_session.preView=self.view;

_session.delegate=self;

_session.showDebugInfo=NO;

}

return_session;

}


实现开始直播的button方法

-(void)startAction:(UIButton*)sender{

//定义一个bool值作为属性,判断按钮的点击

if(_flag) {

[sendersetTitle:@"结束直播"forState:0];

//初始化

LFLiveStreamInfo *stream = [[LFLiveStreamInfo alloc]init];

//将录制的视频传输到服务器上(该服务器为git上demo的服务器)

stream.url=@"rtmp://live.hkstv.hk.lxdns.com:1935/live/stream152";

[self.session  startLive:stream];

}else{

[sender  setTitle:@"开始直播" forState:0];

//停止直播

[self.session  stopLive];

}

_flag= !_flag;

}

转跳到播放直播的页面

-(void)playAction:(UIButton*)sender{

[self.sessionstopLive];

[_liveButtonsetTitle:@"开始直播"forState:0];

_flag=YES;

UIStoryboard*storyboard = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];

PlayViewController*playVC = [storyboardinstantiateViewControllerWithIdentifier:@"PlayViewController"];

[self.navigationControllerpushViewController:playVCanimated:YES];

}

实现代理,监听是否连接服务器成功

- (void)liveSession:(nullableLFLiveSession*)session liveStateDidChange:(LFLiveState)state {

NSLog(@"liveStateDidChange: %ld", state);

switch(state) {

caseLFLiveReady:

_stateLabel.text=@"未连接";

break;

caseLFLivePending:

_stateLabel.text=@"连接中";

break;

caseLFLiveStart:

_stateLabel.text=@"已连接";

break;

caseLFLiveError:

_stateLabel.text=@"连接错误";

break;

caseLFLiveStop:

_stateLabel.text=@"未连接";

break;

default:

break;

}

}

转换摄像头

-(void)cameraAction:(UIButton*)sender{

AVCaptureDevicePositiondevicePosition =self.session.captureDevicePosition;

self.session.captureDevicePosition= (devicePosition ==AVCaptureDevicePositionBack) ?AVCaptureDevicePositionFront:AVCaptureDevicePositionBack;

}


3、从服务器获取直播视频

导入我们拉进去的IJK包的头文件  #import<IJKMediaFramework/IJKMediaFramework.h>

设置属性

@property(nonatomic,strong)NSURL*url;

@property(nonatomic)id <IJKMediaPlayback>player;

@property(nonatomic,strong)UIView*showView;

//在viewWillAppear里面进行预播放

-(void)viewWillAppear:(BOOL)animated{

if(![self.playerisPlaying]) {

[self.playerprepareToPlay];

}

}

在viewDidLoad

//给url赋值服务器

_url= [NSURL  URLWithString:@"rtmp://live.hkstv.hk.lxdns.com:1935/live/stream152"];

//初始化player

_player= [[IJKFFMoviePlayerController  alloc]initWithContentURL:self.urlwithOptions:nil];

//将IJK里的view赋值给playerView

UIView *playerView = [self.player view];

UIView *displayView = [[UIView  alloc]initWithFrame:self.view.bounds];

self.showView= displayView;

[self.viewaddSubview:_showView];

//将playerView的大小设置为全屏

playerView.frame=self.showView.bounds;

//调整比例

playerView.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

//将playerView作为showView的子视图

[self.showView insertSubview:playerView atIndex:1];

//按比例放置

[_player setScalingMode:IJKMPMovieScalingModeAspectFill];

基本上这样就完成了一个简单的直播demo了,有录制,有播放。github上传项目不知道为什么要打包之后才可以上传成功,所以下载demo之后要解压2次。demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容