文档章节

Android中直播视频技术探究之---视频直播服务端环境搭建(Nginx+RTMP)

我爱睡觉
 我爱睡觉
发布于 2017/06/24 16:36
字数 2163
阅读 7
收藏 0

一、前言

前面介绍了Android中视频直播中的一个重要类ByteBuffer,不了解的同学可以 点击查看 到这里开始,我们开始动手开发了,因为我们后续肯定是需要直播视频功能,然后把视频推流到服务端,本地在进行拉流播放的流程。所以这个过程中,我们需要首先来把服务端这个中间环节的工作搞定,后续再弄推流和拉流功能。现在推流大部分都是使用RTMP/HLS协议的,关于这两个协议的区别:


所以我们服务端搭建就需要用这两个协议,不过本文放心了,不会去手动的编写一套协议代码的,谁叫这个世界属于开源呢?


需要的工具和源码包:

1、VLC观看视频流,ffmpeg工具进行推流

2、nginx源码包,nginx-rtmp-module模块源码包,pcre源码包,openssl源码包


二、安装nginx+rtmp

第一、下载源码包

在github上我们伟大的战斗名族俄罗斯人开发了基于nginx服务器扩展功能模块的rtmp和hls协议功能,所以说,我们的工作非常简单,把源码搞下来编译即可。但是在这个过程中还是有些操作问题的,这里就把流程梳理一遍:

1、首先你得想办法搞一台服务器,不管是买还是借

2、下载nginx源码包+pcre源码包+openssl源码包

这三个源码包网上都有,后续两个包是在编译nginx的时候需要用到。

3、下载nginx-rtmp-module源码包

这个直接去github上去下载即可:https://github.com/arut/nginx-rtmp-module


第二、编译安装

到这里就把所有的源码包都搞齐了,下面把这些源码包放到服务器中的指定目录下:


然后使用tar命令直接解压即可:tar -zxvf xxxx.tar.gz

这时候就开始编译nginx了,首先进入到nginx解压目录下,然后运行命令:

./configure --prefix=/usr/local/nginx_rtmp/nginx-1.9.9

--prefix是nginx编译安装之后的目录

运行报错:./configure: error: the HTTP rewrite module requires the PCRE library


需要添加pcre模块,修改命令,添加 --with-pcre=pcre的源码路径 

./configure --prefix=/usr/local/nginx_rtmp/nginx-1.9.9 --with-pcre=/usr/local/nginx_rtmp/pcre-8.34


再次运行,可以了,但是这时候说明nginx代码没有问题了,下面就需要把rtmp模块加到nginx编译中:

./configure --prefix=/usr/local/nginx_rtmp/nginx-1.9.9 --with-pcre=/usr/local/nginx_rtmp/pcre-8.34  --add-module=/usr/local/nginx_rtmp/nginx-rtmp-module

直接使用 --add-module=nginx的rtmp模块代码路径

运行报错:./configure: error: SSL modules require the OpenSSL library


需要添加openssl模块,添加 --with-openssl=openssl的源码路径

./configure --prefix=/usr/local/nginx_rtmp/nginx-1.9.9 --with-pcre=/usr/local/nginx_rtmp/pcre-8.34 --with-openssl=/usr/local/nginx_rtmp/openssl-1.0.0d --add-module=/usr/local/nginx_rtmp/nginx-rtmp-module

编译运行成功

然后运行make && make install 命令进行安装即可。

注意:

如果想加上HLS功能的,可以使用这个命令:--add-module=/usr/local/nginx_rtmp/nginx-rtmp-module/hls,本文不介绍了HLS协议了,因为配置和RTMP差不多。


三、配置RTMP协议

这时候在编译安装之后的目录中


其中conf目录中存放nginx的配置文件,sbin目录中是运行nginx的命令,那么我们先来看看如何配置nginx,让其具有rtmp功能:

rtmp {
  server {
    listen 1395;
    chunk_size 4096;
    application mylive {
        # enable live streaming
        live on;
    }
  }
}

当然还有很多其他配置,可以在使用的时候根据具体需求添加即可。


这里配置rtmp协议信息,需要注意的是端口和应用名称,比如这里端口是:1395,应用名是:mylive,那么后续推流的地址就是:

rtmp://server.xxx.com:1395/mylive/rtmpstream

其中rtmpstream是随便定义的,但是后续拉流地址必须也是这个地址。


还有一个细节就是,nginx默认的http协议信息中的端口是80,所以在后续运行的时候会出现端口占用的问题,因为这里现在只需用rtmp协议,所以直接把http协议的端口改成不常用的一个端口,让nginx运行成功即可。


四、运行nginx

信息配置好了之后,下面我们就来运行nginx吧,进入sbin目录下,运行命令:


然后查看进程信息:


因为我的机器中运行了两个nginx程序,所以有两个。

再看看1395端口情况:


看到,这时候端口还没有建立,因为我们还是没开始推流呢。


五、测试

上面就把环境搭建好了,下面就来测试一下吧,因为方便测试,直接使用PC上去推一个流做测试即可,后续会详细介绍Android中如何进行推流,PC上推流有一个比较好用的工具:ffmpeg,这个是开源的,用C语言开发的,所以Android平台在使用这个模块推流的话,就需要使用native层做桥接了,github地址:https://github.com/FFmpeg/FFmpeg,不过这个工具在Windows下已经编译好了工具,直接去官网下载即可:https://ffmpeg.org,这个工具包功能很强大的,可以做视频编码,加字幕,水印等效果的。


下载了Windows平台的工具包之后,再把命令配置到环境变量中,直接在命令行中进行推流:

ffmpeg -re -i D:\tmp.mp4 -f flv rtmp://www.wjdiankong.cn:1395/mylive/rtmpstream

这里我把本地的一个mp4文件推流到服务器中,然后这时候我们还需要拉流进行观看,这个就需要一个很常用的流媒体工具:VLC了,可以自行下载这个工具即可,安装之后,在打开选项中,选择网络流媒体:


输入我们需要拉流的地址即可,点击播放,这时候在运行ffmpeg命令进行推流即可:


再推的过程中,我们可以去后台查看端口的状态了:


看到了,这时候端口开始建立了,正在推流,而且这时候拉流也有视频效果了:



为了有动态效果,特定做了gif,图有点大,所以有点卡顿:



六、流程分析

到这里,我们就完成了视频直播的后台环境搭建,也是我们后续要介绍推流和拉流的中间环节,下面在来看一下整个直播的推拉流的流程:


推拉流端都支持PC端和移动端的,采用的协议大部分都是RTMP或者是HLS。而且还有一个比较好的推拉流工具包:FFMpeg,

所以现在很多直播的App,一个主播先出点血花钱买一个比较牛逼的设备(推流设备),然后就可以在家坐着赚钱了,而有一些土豪就开始拉流观看,送钱!!



其实,有时候服务器的结构可能如下:


这里会把推流的视频保存到一个地方,然后既可以支持视频的点播,也可以支持视频的直播了!


最后再来看一下现在很多大公司已经开始开发了整个视频直播功能的SDK,这里看一下腾讯云推出的录制+播放功能的SDK:


他的功能还是很全的,可以支持本地移动设备的推流(视频采集一般就是摄像头和桌面),然后对采集的视频做一些处理,然后在进行拉流播放,可以支持硬件加速,视频解码等功,这个也是我们后续会一一介绍的功能。


因为本文只是介绍环境搭建,所以真正在开发的过程中还会遇到一些问题的,到时候就需要去配置服务端信息了!


七、总结

本文主要介绍了如何搭建视频直播的服务端环境,这个是后续介绍推流和拉流的关键中间点,后续测试都需要这个环境的,我们采用了市面上常用的技术:Nginx+RTMP协议,需要弄到源码包,然后编译安装即可,然后为了验证效果,在Windows中使用了FFMpeg工具进行推流,使用VLC工具进行拉流视频观看,这个流程就算是通了,后续要做的就是如何把Android中的摄像头视频数据和桌面视频数据进行推流,以及拉流观看的功能。


更多内容:点击这里

关注微信公众号,最新Android技术实时推送



本文转载自:http://blog.csdn.net/jiangwei0910410003/article/details/51996940

我爱睡觉
粉丝 3
博文 2120
码字总数 0
作品 0
南昌
Android手机直播系统开发介绍

近两年直播热的兴起也带动了直播开发行业的崛起,每个人都想要去吃直播开发这块蛋糕。但这块蛋糕也不是这么容易吃到的,在激烈的市场竞争下,有几个大的直播平台始终占据着市场中较大的份额,...

直播开发
09/07
0
0
《视频直播技术详解》系列之一:视频采集和处理

直播中的各个环节: 1.采集 采集是播放环节中的第一环,iOS 系统因为软硬件种类不多,硬件适配性较好,所以比较简单。Android 则不同,市面上硬件机型非常多,难以做到一个库适配所有硬件。P...

ljianbing
06/26
0
0
腾讯技术分享:微信小程序音视频技术背后的故事

1、引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视频,小程序上的各种技术体验也越来越丰富。音视频作为高速移动网络时代下增长最快的应用形式之一,在微信小程序中也...

JackJiang2011
07/21
0
0
ARCore 1.0 实践:在直播场景中加入AR特效

作者简介:王颖,声网Agora.io 媒体引擎高级工程师,负责媒体引擎设计开发和多平台扩展 ARKit 和 ARCore 给我们 AR 应用的开发带来了极大便利。ARCore 在 2 月 24 日发布了 1.0 正式版本,A...

Agora
03/09
0
0
如何实现微信小程序与Native App多人连麦直播?

微信在去年年底开放了小程序直播接口。小程序从仅适用于阅读、生活服务、工具等应用的流量入口,成为了许多音视频应用的又一个新平台。新功能的开放让更多应用可以利用微信的熟人社交链为应用...

Agora
04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker Compose 原理

Docker 的优势非常明显,尤其是对于开发者来说,它提供了一种全新的软件发布机制。也就是说使用 docker 镜像作为软件产品的载体,使用 docker 容器提供独立的软件运行上下文环境,使用 dock...

Java干货分享
32分钟前
0
0
解决过滤器中设置cookie无效的问题

解决过滤器中设置cookie无效的问题 代码现场 filterChain.doFilter(sessionSyncRequestWrapper, response);Cookie emailCook = WebServletUtil.getSelectedCookie(request.getCookies(), ......

黄威
43分钟前
0
0
Hbase Schema 设计注意事项及最佳实践总结

一个列族的所有列在硬盘上存放在一起,使用这个特性可以把不同访问模式的列放在不同列族,以便隔离它们。这也是HBase被称为面向列族的存储(column-family-oriented store)的原因。 1、RowKe...

PeakFang-BOK
55分钟前
2
0
t-io给群组成员内置排序

1、实现比较器Comparator<ChannelContext> package xxx;import java.util.Comparator;import java.util.Objects;import java.util.Set;import java.util.TreeSet;import or......

talent-tan
59分钟前
2
0
px、em、rem 区别及作用

原文 起因: 一开始是为了解决页面放大时,字体不跟着放大的 bug。现在多用用于统一规范。 概念: 任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em...

lemos
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部