iOS整理 - 关于直播 - 拉流部分

920 阅读3分钟

这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战


我的专栏

  1. iOS 底层原理探索
  2. iOS 底层原理探索 之 阶段总结

前言

直播系列的最后一部分,在移动端进行播放。 有需要的请看之前的两部分:

在移动端进行播放,我选择用的是ijkplayer IJKMediaFramework第三方库的合并集成及使用 这一篇简书写的很详细,可以按照步骤,一步步集成到你的项目中去。

接下来,在controller中

#import <IJKMediaFramework/IJKMediaFramework.h>

配置

然后, 配置项目的拉流的地址

//这是拉流的地址,自己可以在服务端配置
#define INT_Strean @"rtmp://192.168.1.109:1935/live/asd"

再然后,定义好 显示 拉流 的视图,以及关于帧率和播放相关的配置。

@property (nonatomic, strong) IJKFFMoviePlayerController *player;
@property (nonatomic, strong) UIView *playView;
#pragma mark - 视图即将显示
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    //  当试图即将展示的时候开始播放
    [self.player prepareToPlay];

    //注册播放状态改变的通知    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playStatuDidchange:) name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:self.player];

}

#pragma mark - 视图已经消失
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    //  关闭播放
    [self.player shutdown];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:self.player];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [IJKFFMoviePlayerController setLogReport:YES];
    [IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_DEBUG];
    [IJKFFMoviePlayerController checkIfFFmpegVersionMatch:YES];
    
    _pp = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width * 0.49, [UIScreen mainScreen].bounds.size.height * 0.49)];
    _pp.center = CGPointMake(self.view.center.x*0.5, self.view.center.y);
    [self.view addSubview:_pp];
    
    
    IJKFFOptions *options = [IJKFFOptions optionsByDefault];
    [options setPlayerOptionIntValue:1  forKey:@"videotoolbox"];
    
    // 帧速率(fps) (可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)
    [options setPlayerOptionIntValue:29.97 forKey:@"r"];
    // -vol——设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推
    [options setPlayerOptionIntValue:512 forKey:@"vol"];
    
    NSURL *url = [NSURL URLWithString:[[NSUserDefaults standardUserDefaults] objectForKey:@"intURL"]];
    _player = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options];
    UIView *playView = [self.player view];
    UIView *displayView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width * 0.49, [UIScreen mainScreen].bounds.size.height * 0.49)];
    displayView.center = CGPointMake(self.view.center.x*1.5, self.view.center.y);
    
    self.playView = displayView;
    self.playView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:self.playView];
    
    playView.frame = self.playView.bounds;
    playView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.playView insertSubview:playView atIndex:1];
    [_player setScalingMode:IJKMPMovieScalingModeAspectFit];
    [_player setShouldAutoplay:YES];        //自动播放
    self.view.autoresizesSubviews = YES;    //自动更新自视图大小
    

最后,我们可以通过下面的方法来手动的实现开始播放与暂停播放:

        [_player play];  //开始播放方法
        
        [_player pause]; //暂停播放方法

参考文章:

其实本人想自己做整套的直播(包括移动端和服务端),但是之前一直做得比较迷茫。最近偶然间看到以上三篇博客,瞬间解除了我很多疑惑。分享出来,希望大家一起研究下。稍后,我完整做好了,会更新一篇完整的做的过程。

补充 问题记录

iOS端

工程打包的时候出现 linker command failed with exit code 1 (use -v to see invocation) 的问题

现在用的Xcode7中,解决办法为:选中项目->双击->target->buildSeting->搜索BITCODE,默认是yes,修改成no。 重新运行
BitCode是啥

服务器端

问题:nginx启动的时候会报丢失pid的错误

nginx: [error] open() “/usr/local/var/run/nginx.pid” failed

解决方案:

sudo nginx -c /usr/local/etc/nginx/nginx.conf

sudo nginx -s reload