手把手教你搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流

转载自:https://www.jianshu.com/p/06c2025edcd3

by – paperfish

最近尝试着搭建了搭建一个基于RTMP协议 的流媒体服务器,我采用了Nginx流媒体服务器,并使用 ffmpeg 进行推流,成功推流本地视频到流媒体服务器上,可以正常播放。

接下来开始进入手把手教程(我的系统是Ubuntu14.04)。

1.安装ffmpeg

首先安装h264 视频编解码库:


sudo apt-get updatesudo apt-get install libx264-dev

安装ffmpeg ,依次输入以下命令:


wget http://ffmpeg.org/releases/ffmpeg-3.0.9.tar.bz2sudo tar jxvf ffmpeg-3.0.9.tar.bz2cd ffmpeg-3.0.9/sudo ./configure --enable-shared --enable-pthreads --enable-gpl  --enable-avresample --enable-libx264 --enable-libtheora  --disable-yasmsudo make   sudo make install

其中sudo make 这个过程会比较久。

安装完ffmpeg之后,在命令行中输入ffmpeg 就可以看到类似下面的输出信息:


lee@ubuntu:~$ ffmpegffmpeg version 3.0.9 Copyright (c) 2000-2017 the FFmpeg developersbuilt with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)configuration: --enable-pthreads --enable-gpl --enable-avresample --enable-libx264 --enable-libtheora --disable-yasmlibavutil      55. 17.103 / 55. 17.103libavcodec    57. 24.102 / 57. 24.102libavformat    57. 25.100 / 57. 25.100libavdevice    57.  0.101 / 57.  0.101libavfilter    6. 31.100 /  6. 31.100libavresample  3.  0.  0 /  3.  0.  0libswscale      4.  0.100 /  4.  0.100libswresample  2.  0.101 /  2.  0.101libpostproc    54.  0.100 / 54.  0.100Hyper fast Audio and Video encoderusage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...Use -h to get full help or, even better, run 'man ffmpeg'

如果出现这样的信息,说明ffmpeg已经安装成功了。

2.安装Nginx依赖

我是在根目录下安装的依赖。首先在根目录下创建一个叫做nginx-dependence的文件夹


cd ../../sudo mkdir nginx-dependence

然后在nginx-dependence中安装依赖,按行依次运行以下命令。这些依赖一定不要使用apt-get 安装 ,因为后面在配置Nginx的时候,要提供这些依赖的源码路径。(我一开始是使用apt-get 安装 依赖的,结果在nginx 的configure 步骤出现问题,所以我就重新安装了)


cd nginx-dependencesudo wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gzsudo tar -zxvf pcre-8.40.tar.gzcd pcre-8.40/sudo ./configuresudo makesudo make installsudo wget http://zlib.net/zlib-1.2.11.tar.gzsudo tar -zxvf zlib-1.2.11.tar.gzcd zlib-1.2.11/sudo ./configuresudo makesudo make installsudo wget https://www.openssl.org/source/old/1.1.0/openssl-1.1.0.tar.gzsudo tar -zxvf openssl-1.1.0.tar.gzcd openssl-1.1.0/sudo ./configsudo makesudo make install

在nginx-dependence目录中,先下载nginx-rtmp-module


git clone https://github.com/arut/nginx-rtmp-module.git

3.安装Nginx

首先运行:


apt-get install build-essentialapt-get install libtool

然后下载并安装Nginx,我安装的版本是1.12.0,我也是安装在根目录的。

依次运行下面的指令。


cd ../../sudo wget http://nginx.org/download/nginx-1.12.0.tar.gzsudo tar -zxvf nginx-1.12.0.tar.gzcd nginx-1.12.0/sudo ./configure --prefix=/usr/local/nginx --with-pcre=../nginx-dependence/pcre-8.40 --with-zlib=../nginx-dependence/zlib-1.2.11 --with-openssl=../nginx-dependence/openssl-1.1.0  --with-http_ssl_module --add-module=/nginx-dependence/nginx-rtmp-modulesudo makesudo make install

--with-pcre=../nginx-dependence/pcre-8.40 就是我的pcre依赖所放置的位置,这个位置可根据自己的安装位置进行灵活配置。--add-module=/nginx-dependence/nginx-rtmp-module 这个module 的路径也要正确设置为之前下载nginx-rtmp-module的路径。

如果上面的步骤都没有出错,则可以检验一下nginx是否已经安装正确了:

在命令行中输入这个命令启动nginx服务器:


sudo /usr/local/nginx/sbin/nginx

如果没有报任何错误,则可以打开浏览器看看nginx是否启动成功。

打开浏览器,输入localhost 或本机的IP地址,按回车,如果看到这样的界面,说明nginx已经安装成功并且启动成功了。

1.png

如果有的时候启动时出现这样的提示:

2.png

这是重复启动导致的。运行sudo /usr/local/nginx/sbin/nginx -s stop 可以先停止运行之前启动的,然后再次运行

sudo /usr/local/nginx/sbin/nginx 就没有问题了。

4.配置Nginx流媒体服务器

nginx服务器有一个配置文件叫做nginx.conf ,这个文件默认是位于/usr/local/nginx/conf 目录下。

我将这个文件改成这样:


worker_processes  1;error_log  logs/error.log debug;events {worker_connections  1024;}rtmp {server {listen 1935;application videotest{live on;}}}http {include      mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen      80;server_name  localhost;location / {root  html;index  index.html index.htm;}# redirect server error pages to the static page /50x.htmlerror_page  500 502 503 504  /50x.html;location = /50x.html {root  html;}}}

其中rtmp就是rtmp服务器模块,端口是1935,application我理解为一个路径。可以通过访问rtmp://localhost/videotest 来访问videotest这个资源。live on 表示这是实时的传输,这不同于点播,点播就好比我在某视频网站上想看一个视频,无论我什么时候去点击,它会从头开始播放。而实时传输(直播),就是好比看电视,我在19:20去打开电视(打开直播路),视频不会从头开始播放,而是从当前(19:20)的视频数据开始播放。

除了配置rtmp服务器,还可以配置HTTP和HTTPS服务器。这方面我还没有深入去了解。更多关于nginx服务器和其配置方式,请阅读nginx官网 。

5.使用 ffmpeg 推流本地视频

把配置文件改成第4步中的形式,然后启动nginx。


sudo /usr/local/nginx/sbin/nginx

我在/home/lee目录下放置了一个视频 video.mp4,

3.png

然后在命令行中使用 ffmpeg 进行推流:


ffmpeg -re -i /home/lee/video.mp4 -vcodec copy -acodec copy -b:v 800k -b:a 32k -f flv rtmp://localhost/videotest

这里有好几个参数,

-re : 表示使用文件的原始帧率进行读取,因为ffmpeg读取视频帧的速度很快,如果不使用这个参数,ffmpeg可以在很短时间就把video.mp4中的视频帧全部读取完并进行推流,这样就无法体现出视频播放的效果了。官方文档中对这个参数的解释是:

-re (input)
Read input at native frame rate. Mainly used to simulate a grab device, or live input stream (e.g. when reading from a file). Should not be used with actual grab devices or live input streams (where it can cause packet loss). By default ffmpeg attempts to read the input(s) as fast as possible. This option will slow down the reading of the input(s) to the native frame rate of the input(s). It is useful for real-time output (e.g. live streaming).

-i :这个参数表示输入 ,后面/home/lee/video.mp4 就是输入文件。

-vcodec copy : -vcodec表示使用的视频编解码器 ,前缀v表示video。后面紧跟的copy 表示复制使用源文件的视频编解码器,比如原文件的编解码器(codec)是h264,则这里就使用h264。

-acodec copy : -acodec表示使用的音频编解码器,前缀a表示audio。后面的copy 表示使用源文件的音频编解码器。

-b:v 800k : -b:v表示视频的比特率(bitrate) ,为800k。

-b:a 32k : 表示音频的比特率为32k。

-f flv : -f表示format ,就是强制输出格式为flv,这一步其实也叫封装(mux),封装要做的事就是把视频和音频混合在一起,进行同步。紧跟在后面的rtmp://localhost/videotest 表示输出的”文件名”,这个文件名可以是一个本地的文件,也可以指定为rtmp流媒体地址。指定为rtmp流媒体地址后,则ffmpeg就可以进行推流。

如果推流成功的话,就会输出下面的信息:

4.png

其中输出了一些源文件的信息。最下面的是一些帧数据,下面这些帧数据会一直输出直到视频推送完毕。

打开新的命令行,输入:


ffplay rtmp://localhost/videotest

表示使用ffplay 来播放指定流媒体文件。ffplay 是ffmpeg 中自带的媒体播放程序。然后就可以看到下面的视频了

5.png

推流成功后,在任何支持rtmp流媒体协议的播放器都可以播放,成功在安卓设备上播放了刚刚推流到服务器上的视频。我本身是一名安卓开发者,我在安卓中使用了七牛云的开源播放器PLDroidPlayer ,下面是运行的截图。

2017-11-13_230552.png

后记:ffmpeg真是博大精深啊,不仅提供了强大的命令行工具ffmpeg , ffprobe , ffplay, ffserver 方便我们对音视频进行处理(其实使用ffserver也可以搭建流媒体服务器)。ffmpeg还提供了底层丰富的API ,这一方面内容我还需要深入学习。

手把手教你搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流相关推荐

  1. 宝塔 搭建 nginx rtmp 流媒体服务器

    宝塔 搭建 nginx rtmp 流媒体服务器 安装环境说明 系统环境: Centos 7 机型: DELL R540 准备工作 nginx 添加模块,编译安装 nginx ,下载 nginx-rtm ...

  2. win7系统搭建流媒体服务器,windows7 下 搭建 nginx + rtmp 流媒体服务器

    成果分享:https://github.com/ziq358/Nginx-Rtmp 材料准备: 1.Microsoft Visual Studio 2010 下载安装. 2.MinGW 安装. 3.下 ...

  3. 云服务器架设网站教程_手把手教你搭建腾讯云服务器入门(图文教程)

    本文由博主 威威喵 原创 博客主页:https://blog.csdn.net/smile_running 背景 暑假期间,愁着无聊但也不能荒废学业吧,毕竟以后想靠技术混口饭吃!为了实施自己的计划,特 ...

  4. 手把手教你搭建腾讯云服务器

    手把手教你搭建腾讯云服务器(图文并茂) 威威貓 2019-03-28 08:10:28  58357  收藏 162 分类专栏: 杂七杂八 文章标签: 服务器搭建 腾讯云服务器 云服务器环境配置 新手 ...

  5. 搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流

    搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流 硕士毕业后,一直从事算法工程师,具有丰富的深度学习,图像视频处理经验,因此录制了一些课程,欢迎大家观看,有问题可以找我私聊:QQ:81664 ...

  6. i.MX6ULL - 远程视频监控方案实现(nginx-rtmp流媒体服务器、ffmpeg推流)

    i.MX6ULL - 远程视频监控配置(nginx-rtmp流媒体服务器.ffmpeg推流) 目录 i.MX6ULL - 远程视频监控配置(nginx-rtmp流媒体服务器.ffmpeg推流) 1.前 ...

  7. Ubuntu16.04下配置nginx + RTMP流媒体服务器

    目录 前言 1.安装nginx需要的环境 1.1 查看gcc版本 gcc -v 1.2 pcre.pcre-devel安装 1.3 zlib安装 1.4 安装openssl 2.开始安装 2.1 创建 ...

  8. hMailServer 使用教程 —— 手把手教你搭建自己的邮箱服务器

    前言 假设你已经拥有了一台具有公网ip的服务器,以及域名 hMailServer 介绍 hMailServer 适用于 Windows 操作系统,它除了提供邮箱系统需要的所有基础功能之外,还内置了一些 ...

  9. Windows nginx + rtmp 流媒体服务器搭建(uniapp可用)

    准备: 所有文件目录请不要中文命名,请使用英文 nginx服务 官网下载 niginx服务 视频推流版 3. 配置文件 nginx-rtmp-module 4. 推流文件 ffmpeg 5. 拉流工具 ...

最新文章

  1. [JAVA] DUMP
  2. 【廖雪峰python入门笔记】set
  3. UVa1344 - Tian Ji -- The Horse Racing(贪心)
  4. 安德鲁斯Launcher得到的装在手机的应用程序列表
  5. mysql之数据库主从复制配置报错1677
  6. linuxg下c++ 类导出_为什么PDF导出功能在SOLIDWORKS Electrical中不起作用?
  7. clickhouse一键登陆
  8. 多看 android6,多看阅读本地版
  9. http抓包神器:Charles for Mac 特别版v4.6
  10. .NET:枚举的默认值
  11. 关于GDAL计算图像坐标的几个问题
  12. 工单发料,退料等一些物料的移动
  13. rdcman汉化_Remote Desktop Organizer – 管理组织远程桌面 - 小众软件
  14. Radio Userland已更新,版本号未更改...
  15. 在腾讯的八年,我的职业思考
  16. c#黑白棋算法_黑白棋C#源代码
  17. 最浅显易懂的数据库索引讲解
  18. Mysql 常用函数(40)- time_to_sec 函数
  19. 越狱插件找不到依赖包_iphone如何卸载插件依赖包 iphone卸载插件依赖包方法
  20. 特斯拉“踩坑”分时Linux?丰田/Mobileye选择“迎难而上”

热门文章

  1. Linux安装Yum包管理器
  2. 1292 - Incorrect datetime valuemysql插入非法的时间数据解决方案
  3. Matlab策略模式
  4. while语句的使用
  5. SpringMVC 文件上传
  6. 【JAVA 第三章 流程控制语句】课后习题 月历打印
  7. HTML页面加载完毕后,再运行JS业务
  8. C#开发笔记之13-如何用C#分隔字符串并返回字符串数组?
  9. 触摸事件touchevent
  10. shell脚本spawn_如何使用child_process.spawn将Python / Ruby / PHP Shell脚本与Node.js集成