直播技术汇总

简介: 做一款仿映客的直播App?看我就够了 直播时代--IOS直播客户端SDK,美颜直播 直播技术汇总 一、直播一些技术名词 1、什么是 FFmpeg ,FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,它提供了录制、转换以及流化音视频的完整解决方案。
+关注继续查看

做一款仿映客的直播App?看我就够了

直播时代--IOS直播客户端SDK,美颜直播

直播技术汇总

一、直播一些技术名词

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、直播项目传输方式介绍

 

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 如果出现下图, 则表示安装成功

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 中加入直播所需要的权限:

 
    <key>NSCameraUsageDescription</key>
    <string>运行项目使用相机</string>
    <key>NSAppleMusicUsageDescription</key>
    <string>运行项目使用多媒体</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>运行项目使用麦克风</string>

运行即可直播!

 

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];
        }
    }
}

Demo下载地址:HDIJKMediaSDKDemo

from:http://blog.csdn.net/u012390519/article/details/52871859

目录
相关文章
|
1月前
|
存储 监控 前端开发
不断创新短视频APP源码,未来可期!
2018年短视频平台的爆火席卷了大江南北,不少商家和互联网都卷入其中,研究发开自己的短视频APP,而短视频源码最早是基于Adobe/Flash Media Server开发的一款CMS系统,当然目前已经开始逐步通过第三方云服务代替了FMS。
|
3月前
|
搜索推荐
没有编程知识,这么做轻松搭建自己的体育赛事直播平台
很多人可能认为搭建一个体育赛事直播网站需要具备编程代码的技能。然而,如今有了“东莞梦幻网络科技”的成品源码,即使没有编程知识,也能轻松搭建自己的体育赛事直播网站。
|
3月前
|
开发者
体育网络直播平台有哪些?以及开发赛事直播平台最快方案
在数字化和网络技术的推动下,体育网络直播平台的兴起,人们可以打破时间和空间的限制,随时随地观看各种体育赛事,感受热血激情的碰撞。本文将为您介绍一些备受瞩目的体育直播平台有哪些?,以及开发赛事直播平台最快方案是什么?
|
机器学习/深度学习 编解码 人工智能
|
缓存 5G 视频直播
一对一直播平台源码开发的新思路,从直播开始分析
现如今科技发展飞速,一对一直播平台开发也没有想象中的那么困难,但是如果没有相对的开发经验,开发周期可能会相对较长,也比较容易踩坑。这时候可以选择靠谱的一对一直播平台源码,再进行二次开发,节省时间和成本,还可以保证一对一直播平台源码运行的稳定性。
|
机器学习/深度学习 Web App开发 编解码
淘宝直播技术架构升级:窄带高清
本文分享内容主要分为四个部分: 全民直播大时代的背景介绍 直播痛点分析 淘宝直播窄带高清技术 音视频技术趋势探讨
淘宝直播技术架构升级:窄带高清
|
搜索推荐
直播成今年移动APP大热门,直播带货app源码的开发有何亮点
要说今年移动APP的大热门,除了手游以外就是直播APP,随着移动互联网的深入发展,直播行业在手机端极其普及,因为巨大的流量,直播行业也创造了巨大的商业价值,促进了国内经济内循环,也解决了很多的就业问题,也让很多公司萌生了开发直播商城带货的想法,那么直播带货app源码的开发有何功能亮点呢?
直播成今年移动APP大热门,直播带货app源码的开发有何亮点
|
Web App开发 编解码 缓存
2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕
直播,已经成为了“剁手党”们最喜闻乐见的一种购物形式。对直播体验的极致追求,也是淘宝技术人们长期的努力方向。为了提升用户购物体验,让直播更加丝滑,让剁手更快一些,在2020双十一期间,淘宝首次启用了阿里云CDN的GRTN全球实时传输网络。数据显示,和传统的HTTPFLV/RTMP方式相比,在启用了GRTN后,直播端到端的延时降低了83%。那么,GRTN到底是什么?其背后究竟隐藏了哪些核心技术?
10230 0
2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕
直播平台软件开发中关于直播技术的架构问题
在直播平台软件开发中,需要关注的点有很多。但是我们并不能把关注点只是放在客户端如何去采集音频数据,或者是客户端的推拉流的相关内容,而是应该先了解一下直播技术的架构问题。这样一来,对于直播技术的运转流程理解起来也就更加容易了。
直播平台软件开发中关于直播技术的架构问题
|
Web App开发 边缘计算 缓存
打造“零距离”互动直播间,低延时流媒体技术实践
如何提升直播过程中三个要素之间的互动,让主播与主播之间、主播与粉丝之间达到一致 的用户体验?优酷直播流媒体团队做了低延时流媒体技术的探索实践,实现了在用户体验不下 降的基础上,让主播与主播延时&lt;300ms,主播与粉丝延时&lt;600ms,解决了直播间各类互动问题。
打造“零距离”互动直播间,低延时流媒体技术实践
相关产品
云迁移中心
推荐文章
更多