音视频直播权哥的技术之路

iOS直播实用篇(手把手教)

2016-11-09  本文已影响3002人  IIronMan

一.简述总体内容

二.直播流程介绍

七牛的直播流程

三.Mac搭建nginx+rtmp服务器(模拟推流拉流)

效果如下(把桌面的视频推到搭建的服务器再利用播放器VLC 密码: 7gbp拉流),也可以用自己写的播放软件来拉流,或者三方

Mac搭建nginx+rtmp服务器(模拟推流拉流)

手动输入命令的时候容易出现了bug(所以, 建议大家直接复制命令, 不要手动输入命令). 所以记录一份详细的搭建步骤,参考Mac搭建nginx+rtmp服务器

如果Mac已经安装了, 会显示一些命令的帮助信息. 此时输入Q退出即可, 直接进入第二步.反之, 如果没有安装,执行命令

      ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果安装后, 想要卸载

      ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
安装成功
 如果终端上提示

nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
.....

 则表示`8080`端口被占用了, 查看端口PID

    lsof -i tcp:8080

根据端口PID, kill掉(这儿的9603换成你自己8080端口的PID)

    kill 9603

然后重新执行nginx, 打开http://localhost:8080 进行检测是否 nginx安装成功

通过vim或者点击Finder->前往->前往文件夹->输入/usr/local/etc/nginx/nginx.conf->用记事本工具(推荐Sublime Text)打开nginx.conf.

直接滚到最后一行, 在最后一个}(即最后的空白处, 没有任何{})后面添加

  # 在http节点后面加上rtmp配置:
  rtmp {
    server {
    listen 1935;
    application rtmplive {
        live on;
        record off;
      }
    }
 }

记得保存command+S

然后重启nginx(其中的1.10.1要换成你自己安装的nginx版本号, 查看版本号用nginx -v命令即可)

  /usr/local/Cellar/nginx-full/1.10.1/bin/nginx -s reload
动画片

ffmpeg -re -i /Users/jinqianxiang/Desktop/BigBuck.m4v -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/rtmplive/room

提醒: /Users/jinqianxiang/Desktop/BigBuck.m4v是路径,你可把视频拖进终端,查看路径

将视频推流到服务器后,打开VLC,然后File->open network->输入:

  rtmp://localhost:1935/rtmplive/room
输入拉流的url

效果如下

效果

上面的总结的大神的文章

四.简单的集成推流拉流(实用篇)

采用cocopods导入即可

    pod 'LFLiveKit'

提示:LFLiveKit已经集成了GPUImage, 如果项目中有集成GPUImage, 需要将之前的移除掉. 且集成LFLiveKit需要关闭Bitcode.

集成`LFLiveKit`需要关闭`Bitcode.`

导入成功


cocopods成功导入LFLiveKit

在推流的控制器写入下面的代码

导入推流框架 #import "LFLiveKit.h"

- (LFLiveSession*)session {
if (!_session) {
    _session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfiguration]];
    _session.preView = self;
    _session.delegate = self;
  }
  return _session;
}

- (void)startLive { 
    LFLiveStreamInfo *streamInfo = [LFLiveStreamInfo new];
    streamInfo.url = @"your server rtmp url";
    [self.session startLive:streamInfo];
}

- (void)stopLive {
      [self.session stopLive];
}

//MARK: - CallBack:
- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange: (LFLiveState)state;
- (void)liveSession:(nullable LFLiveSession *)session debugInfo:(nullable LFLiveDebug*)debugInfo;
- (void)liveSession:(nullable LFLiveSession*)session errorCode:(LFLiveSocketErrorCode)errorCode;

到此推流就成功了,提示网络一定要打来

打开网络 导入库

完成上述之后,运行不报错,就说明你基本上成功了,在拉流的控制器里面输入下面的代码

导入 #import <IJKMediaFramework/IJKMediaFramework.h>

 1.创建推流对象
 - (LFLiveSession*)session {
     if (!_session) {
    _session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfiguration]];
    _session.delegate = self;
  }
  return _session;
}

2.在点击开始直播的方法里面输入

     NSLog(@"开始直播");

// 判断是否是模拟器
if ([[UIDevice deviceVersion] isEqualToString:@"iPhone Simulator"]) {
    
    [MBProgressHUD showError:@"请用真机进行测试, 此模块不支持模拟器测试"];
    
    return;
}

// 判断是否有摄像头
if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
    [MBProgressHUD showError:@"您的设备没有摄像头或者相关的驱动, 不能进行直播"];
    return;
}

// 判断是否有摄像头权限
AVAuthorizationStatus  authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authorizationStatus == AVAuthorizationStatusRestricted|| authorizationStatus == AVAuthorizationStatusDenied) {
    [MBProgressHUD showError:@"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;
        }
    }];
}

LFLiveStreamInfo *streamInfo = [LFLiveStreamInfo new];

streamInfo.url = kTRMPServe;

[self.session startLive:streamInfo];

相关的类demo里面都有简单的直播demo 密码: w935

屏幕快照 2016-11-09 上午12.27.36.png

到此,推流和拉流就完成了,更多美颜等功能等等,就看更多的大神博客,下面推荐

五.好的直播博客推荐

大神博客1
大神博客2
七牛云技术(三方直播)
最详细的直播
ijkplayer视频直播框架(最好打包成静态库):可以进去学习一下
RTMP快速集成
推流框架

上一篇下一篇

猜你喜欢

热点阅读