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

by -- paperfish

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

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

1.安装ffmpeg

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


sudo apt-get update

sudo apt-get install libx264-dev

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


wget http://ffmpeg.org/releases/ffmpeg-3.0.9.tar.bz2

sudo tar jxvf ffmpeg-3.0.9.tar.bz2

cd ffmpeg-3.0.9/

sudo ./configure --enable-shared --enable-pthreads --enable-gpl  --enable-avresample --enable-libx264 --enable-libtheora  --disable-yasm

sudo make   

sudo make install

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

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


lee@ubuntu:~$ ffmpeg

ffmpeg version 3.0.9 Copyright (c) 2000-2017 the FFmpeg developers

built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)

configuration: --enable-pthreads --enable-gpl --enable-avresample --enable-libx264 --enable-libtheora --disable-yasm

libavutil      55. 17.103 / 55. 17.103

libavcodec    57. 24.102 / 57. 24.102

libavformat    57. 25.100 / 57. 25.100

libavdevice    57.  0.101 / 57.  0.101

libavfilter    6. 31.100 /  6. 31.100

libavresample  3.  0.  0 /  3.  0.  0

libswscale      4.  0.100 /  4.  0.100

libswresample  2.  0.101 /  2.  0.101

libpostproc    54.  0.100 / 54.  0.100

Hyper fast Audio and Video encoder

usage: 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-dependence

sudo wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz

sudo tar -zxvf pcre-8.40.tar.gz

cd pcre-8.40/

sudo ./configure

sudo make

sudo make install

sudo wget http://zlib.net/zlib-1.2.11.tar.gz

sudo tar -zxvf zlib-1.2.11.tar.gz

cd zlib-1.2.11/

sudo ./configure

sudo make

sudo make install

sudo wget https://www.openssl.org/source/old/1.1.0/openssl-1.1.0.tar.gz

sudo tar -zxvf openssl-1.1.0.tar.gz

cd openssl-1.1.0/

sudo ./config

sudo make

sudo make install

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


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

3.安装Nginx

首先运行:


apt-get install build-essential

apt-get install libtool

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

依次运行下面的指令。


cd ../../

sudo wget http://nginx.org/download/nginx-1.12.0.tar.gz

sudo tar -zxvf nginx-1.12.0.tar.gz

cd 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-module

sudo make

sudo 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.html

error_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 ,这一方面内容我还需要深入学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349