IOS直播

转载自:http://blog.csdn.net/u012390519/article/details/52871859

一、直播一些技术名词

1、什么是 FFmpeg ,FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,它提供了录制、转换以及流化音视频的完整解决方案。直播系统多使用该方案。

2、什么是 RTMP(Real Time Messaging Protocol:实时消息传输协议)Adobe公司开发。一个专门为高效传输视频,音频和数据而设计的协议。它通过建立一个二进制TCP连接或者连接HTTP隧道实现实时的视频和声音传输。


二、直播整体技术实现

技术相对都比较成熟,设备也都支持硬编码。iOS还提供现成的 Video ToolBox框架,可以对摄像头和流媒体数据结构进行处理,但Video ToolBox框架只兼容8.0以上版本,8.0以下就需要用x264的库软编了。

github上有现成的开源实现,推流、美颜、水印、弹幕、点赞动画、滤镜、播放都有。技术其实不是很难,而且现在很多云厂商都提供SDK,七牛云、金山云、乐视云、腾讯云、百度云、斗鱼直播伴侣推流端,功能几乎都是一样的,没啥亮点,不同的是整个直播平台服务差异和接入的简易性。后端现在 RTMP/HTTP-FLV 清一色,App挂个源站直接接入云厂商或CDN就OK。

1、直播项目传输方式介绍

IOS直播_第1张图片

2、直播项目采集端(推送端)介绍

推流端可以选择很多GitHub上的开源项目,比如VideoCore 、LiveVideoCoreSDK 、LFLiveKit 。商用的话可以选择各大厂商的SDK,网易直播云、七牛、腾讯、百度、新浪。使用直播云的好处就是能快速上线App,功能十分齐全,可以播放器和推流端,服务器一套下来,有专业客服人员帮助集成到工程中,缺点就是流量费太贵了,具体可以了解下各大厂商的收费标准。

2.1.目前比较知名的有VideoCore

目前国内很多知名的推流框架都是对VideoCore的二次开发。这个框架主要使用C++写的,支持RTMP推流,但对于iOS开发者来说有点晦涩难懂(精通C++的除外)。想开源和免费的可以选择现在的几个知名项目VideoCore + GPUImage+基于GPU的美颜滤镜 ,播放用IJKPlayer自己修改。

2.2.国内比较火的LiveVideoCoreSDK

框架提供iOS苹果手机的RTMP推流填写RTMP服务地址,直接就可以进行推流,SDK下载后简单的工程配置后能直接运行,实现了美颜直播和滤镜功能,基于OpenGL,前后摄像头随时切换,提供RTMP连接状态的回调。

这个框架是国内比较早的一款推流框架有不少在使用这个SDK,功能非常齐全,作者也比较牛,用来学习推流采集相关内容非常好,但是集成到工程中有些困难(对于我来说)。总的来说这是一款非常厉害的推流SDK,几乎全部使用C++写的,编译效率非常好,如果有实力的话推荐使用这个框架来做自己项目的推流端。

2.3.可读性比较好的推流LFLiveKit

框架支持RTMP、HlS (HTTP Live Streaming:苹果自家的动态码率自适应技术) 。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件。

推荐这个框架第一是因为它主要使用OC写的,剩下的用C语言写的,框架文件十分清晰,这对不精通C++的初学者提供了很大的便利,并且拓展性非常强,支持动态切换码率功能,支持美颜功能。

2.4.美颜功能

美颜的话一般都是使用GPUImage 的基于OpenGl开发,纯OC语言,这个框架十分强大,可以做出各种不同滤镜,可拓展性高。如果对美颜没有具体思路可以直接用BeautifyFace ,可以加入到项目中,很方便的实现美颜效果。

3、直播项目播放端介绍

播放端用的针对RTMP优化过的ijkplayer ,ijkplayer 是基于FFmpeg的跨平台播放器,这个开源项目已经被多个 App 使用,其中映客、美拍和斗鱼使用了 ijkplayer(8000+⭐️) 。可以参考这篇博客获取framework:iOS中集成ijkplayer视频直播框架 。也可以直接下载别人已经集成好的framework:IJKMediaFramework.framework

播放方法:

 
- (void)goPlaying {
    //获取url
    self.url = [NSURL URLWithString:_liveUrl];
    _player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:nil];
    UIView *playerview = [self.player view];
    UIView *displayView = [[UIView alloc] initWithFrame:self.view.bounds];
    self.PlayerView = displayView;
    [self.view addSubview:self.PlayerView];
    // 自动调整自己的宽度和高度
    playerview.frame = self.PlayerView.bounds;
    playerview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.PlayerView insertSubview:playerview atIndex:1];
    [_player setScalingMode:IJKMPMovieScalingModeAspectFill];
}   

三、直播实践 (直播和观看都不支持模拟器)

基于LiveVideoCoreSDK完整项目源码

1、搭建nginx+RTMP 服务器:Mac搭建nginx+rtmp服务器

i. 安装nginx (网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存) :

 
## clone nginx项目到本地
$ brew tap homebrew/nginx       
## 执行安装
$ brew install nginx-full --with-rtmp-module
## 成功之后
$ nginx

在浏览器里打开http://localhost:8080 如果出现下图, 则表示安装成功

IOS直播_第2张图片

ii. 配置nginx和RTMP:

 
## 查看nginx安装到哪了
$ brew info nginx-full
...
...
==> Caveats
Docroot is: /usr/local/var/www
The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
nginx will load all files in /usr/local/etc/nginx/servers/.

找到nginx.conf 文件所在位置(/usr/local/etc/nginx/nginx.conf) , 点击Finder ->前往 ->前往文件夹 ->输入/usr/local/etc/nginx/nginx.conf -> 用记事本工具(推荐Sublime Text) 打开 nginx.conf。直接滚到最后一行, 在最后一个} (即最后的空白处, 没有任何{})后面添加:

 
# 在http节点后面加上rtmp配置:
rtmp {
    server {
# 端口一般使用4位,本人开始使用三位,一直有问题,折腾了半天!
        listen 7160;
        application denglibinglive {
            live on;
            record off;
        }
    }
}

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

 
$ /usr/local/Cellar/nginx-full/1.10.1/bin/nginx -s reload

iii. 安装FFmpeg:

 
$ brew install ffmpeg

iv. 下载能播放流媒体的播放器VLC

下载后安装,打开 VLC,然后 File->open network(command+N)输入:

 
rtmp://localhost:7160/denglibinglive/room

v.开始FFMpeg推流:

mp4视频下载地址

下载视频到桌面后,执行推流命令:

 
$ ffmpeg -re -i /Users/denglibing/Desktop/loginmovie.mp4 -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:7160/denglibinglive/room

VLC便开始播放流媒体:

2、下载基于LiveVideoCoreSDK完整项目源码

将项目中ViewController.m 的viewDidLoad 中改为如下:

 
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self UIInit];
    
    _RtmpUrlTextField.text = @"rtmp://ossrs.net/live/123456";
    // 注意 192.168.1.20 是你电脑的ip地址即nginx服务器地址,7160/denglibinglive/room 是博客上面对应的参数,切勿搞错了。
    _RtmpUrlTextField.text = @"rtmp://192.168.1.20:7160/denglibinglive/room";
}

iOS10 以上的手机需要在 info.plist 中加入直播所需要的权限:

 
    NSCameraUsageDescription
    运行项目使用相机
    NSAppleMusicUsageDescription
    运行项目使用多媒体
    NSMicrophoneUsageDescription
    运行项目使用麦克风  

运行即可直播!

3、直播项目采集端:从0到1开始集成LiveVideoCoreSDK

i. 在Desktop 新建文件夹HDLiveVideoCoreDemo 使用Xcode建立项目组(Workspace),命名为HDLiveVideoCoreDemo.xcworkspace 并保存在 HDLiveVideoCoreDemo 中:

ii、将基于LiveVideoCoreSDK完整项目源码 源码的LiveVideoCoreSDK 、LiveVideoCoreCoreSDK.xcodeprojRtmpLivePushSDK 复制到文件夹HDLiveVideoCoreDemo 中:

iii、打开HDLiveVideoCoreDemo.xcworkspace ,新建 LiveVideoCoreDemo.xcodeproj 项目:

iv、分别将LiveVideoCoreSDK.xcodeproj 和 RtmpLivePushSDK.xcodeproj 拖入到项目组中:

v、将libLiveVideoCoreSDK 加入到LiveVideoCoreDemo 项目中,并添加对应所需要的系统框架和tdb文件:

 
AVFoundation.framework
AudioToolbox.framework
CFNetwork.framework
CoreMedia.framework
OpenGLES.framework
VideoToolbox.framework
CoreVideo.framework
libz.tbd
libstdc++.tbd

vi、到此为止,LiveVideoCoreSDK 依赖的环境系统文件已经集成到新项目中,接下来对项目进行必要的配置:

因为LiveVideoCoreSDK 不支持Bitcode , 所以需要设置Enable Bitcode 为NO

因为LiveVideoCoreSDK.h 不在LiveVideoCoreDemo 项目中,所以需要 设置

Header Search Paths : ../LiveVideoCoreSDK/

../LiveVideoCoreSDK/ 这个是 LiveVideoCoreSDK.h 相对于LiveVideoCoreDemo.xcodeproj 的路径。

vii、添加代码运行。

 
- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    [[LiveVideoCoreSDK sharedinstance] LiveInit:[NSURL URLWithString:@"rtmp://192.168.1.20:7160/denglibinglive/room"]
                                        Preview:self.view
                                       VideSize:(CGSizeMake(540, 960))
                                        BitRate:LIVE_BITRATE_800Kbps
                                      FrameRate:LIVE_VIDEO_DEF_FRAMERATE
                                    highQuality:true];
    [LiveVideoCoreSDK sharedinstance].delegate = self;
    [[LiveVideoCoreSDK sharedinstance] connect];
    
    [LiveVideoCoreSDK sharedinstance].micGain = 5;
}
//rtmp status delegate:
- (void) LiveConnectionStatusChanged: (LIVE_VCSessionState) sessionState{
    NSLog(@"RTMP状态 : %d", (int)sessionState);
}

LiveVideoCoreSDK 集成完毕!

Demo下载地址:HDLiveVideoCoreDemo

4、直播播放端:

播放端用的针对RTMP优化过的ijkplayer ,ijkplayer 是基于FFmpeg的跨平台播放器,这个开源项目已经被多个 App 使用,其中映客、美拍和斗鱼使用了 ijkplayer(8000+⭐️) 。可以参考这篇博客获取framework:iOS中集成ijkplayer视频直播框架 。也可以直接下载别人已经集成好的framework:IJKMediaFramework.framework

集成也很简单,新建项目,将下载的IJKMediaFramework.framework 加入到项目即可:

 
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //rtmp://live.hkstv.hk.lxdns.com:1935/live/hks (流媒体数据)
    //rtmp://10.0.44.72:1935/denglibinglive/room (本地局域网的服务地址,局域网内测试直播和播放)
    //rtmp://115.28.135.68:1935/yuzhouheike/room (别人搭建好的云主机服务地址,支持不在局域网的直播和播放)
    _moviePlayer = [[IJKFFMoviePlayerController alloc] initWithContentURLString:@"rtmp://115.28.135.68:1935/yuzhouheike/room" withOptions:nil];
    _moviePlayer.view.frame = self.view.bounds;
    // 填充fill
    _moviePlayer.scalingMode = IJKMPMovieScalingModeAspectFill;
    // 设置自动播放(必须设置为NO, 防止自动播放, 才能更好的控制直播的状态)
    _moviePlayer.shouldAutoplay = NO;
    [self.view insertSubview:_moviePlayer.view atIndex:0];
    [_moviePlayer prepareToPlay];
    
    // 设置监听
    [self initObserver];
}
- (void)initObserver{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stateDidChange) name:IJKMPMoviePlayerLoadStateDidChangeNotification object:self.moviePlayer];
}
- (void)stateDidChange{
    if ((self.moviePlayer.loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {
        if (!self.moviePlayer.isPlaying) {
            [self.moviePlayer play];
        }
    }
}

你可能感兴趣的:(IOS直播)