音视频系列3:使用ffmpeg + nginx搭建本地转发服务器

前言

音视频系列:
音视频系列1:ffmpeg+rtmp拉流
音视频系列2:ffmpeg将H.264解码为RGB

有兴趣的朋友可以看看。

上一节我们采用ffmpeg拉取芒果台视频,并处理成rgb,奈何芒果台不给力,拉流卡卡的,这样就不知道是我代码的问题,还是芒果台服务器的问题了,为了杜绝这个问题发生,我们这一节在本地搭建nginx服务器,用ffmpeg进行本地推流,再用自己的代码和VLC播放器进行PK测试。

为啥要这么做,因为本地推流,本地接收,可以保证推出来的流肯定是流畅的,这样自己代码出了问题(比如很卡)那么就能够第一时间知道,等于排除了服务器的问题。

实际操作

nginx+nginx-rtmp-module安装

nginx下载地址:http://nginx.org/en/download.html

我自己是下载了Mainline version,下载完进行解压,会发现有个configue可执行文件,等下我们要用它生成Makefile文件。

然后这是编译nginx的参数说明:http://nginx.org/en/docs/configure.html

nginx-rtmp-module下载:直接用git clone命令
git clone https://github.com/arut/nginx-rtmp-module.git

由于我们只需要实现推流,而不需要其他的module和环境,所以编译的时候,我们只需要安装nginx-rtmp-module,以及openssl证书。

首先我们看看openssl,在哪。

查看openssl位置命令:

which openssl

显示:/usr/local/openssl/bin/openssl

去掉bin/openssl,在nginx目录下,使用configure指令:

./configure --with-openssl=/usr/local/openssl/ --add-module=nginx-rtmp-module

注意,--with-openssl=填写刚刚获取的openssl路径,去掉bin/openssl
--add-module=填写nginx-rtmp-module的路径。

运行发现有问题:

'/usr/local/openssl/.openssl/include/openssl/ssl.h' failed

说是没发现.openssl/目录,修改nginx目录下,auto/lib/openssl/conf文件 ,修改成正确的路径。

  CORE_INCS="$CORE_INCS $OPENSSL/include"
  CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
  CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
  CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"

再运行:

./configure --with-openssl=/usr/local/openssl/ --add-module=nginx-rtmp-module
make -j2
sudo make install 

安装完成。

配置nginx的rtmp应用

sudo vim /usr/local/nginx/conf/nginx.conf

修改nginx.conf,增加rtmp的application

rtmp {
	server {
		listen 1935;
		chunk_size 4096;
		application rtmplive {
			live on;
			max_connections 1024;
			allow publish all; # control access privilege
			allow play all; # control access privilege
			}
		}
}

其中:
application的名字为rtmplive;
最大可连接数为1024;
chunk_size分开数据大小为4096;
监听的端口为1935。

打开nginx服务,(注意要使用sudu,不然不够权限)

sudo /usr/local/nginx/sbin/nginx 

报错,bind() to 0.0.0.0:80 failed (98: Address already in use)

原因是nginx已经启用,使用ps -e | grep nginx查看有无启动nginx服务,有的话,可以先sudo kill -9 PID号

再启动nginx:

sudo /usr/local/nginx/sbin/nginx 

到这里nginx就配置好了。

启动ffmpeg推流

ffmpeg -i sss.mp4 -f flv rtmp://localhost:1935/live/rtmplive

出现错误:

rtmp://localhost:1935/live/mytv: Input/output error

实际上是地址写错了。
重新来:

ffmpeg -i sss.mp4 -f flv rtmp://localhost:1935/rtmplive

本地推流大功告成。

拉流测试

终于到了PK的时候了,VLC播放器我的代码(详见上一节)进行PK,究竟胜利会花落谁家呢?

我觉得,应该是我的代码会赢。
在这里插入图片描述

VLC打开网络串流,输入rtmp://localhost:1935/live/mytv: Input/output error
我的代码也修改rtmp地址,然后开启。

测试半小时,VLC落后一大截,于是我重开VLC串流,发现,还是慢。

两小时过去了,代码仍在跑中,没有崩溃,速度仍比VLC快,我估摸着大概快个几秒钟。

测试效果如下图:左侧为我的代码,右侧为VLC播放器,使用OPENCV显示,可以看到左侧已经写了下面一行,而右侧还没写,显然慢于左侧。
在这里插入图片描述
所以,最后胜利归我,嘿嘿。

好了,本节到这里就完了,做好这些基本工作,接下来我可能会修改上一节中的代码,使其搭配最新的api,而不再警告,要么就是引入ROS系统。

如果我的文章对你有帮助,欢迎点赞、评论、关注。

发布了43 篇原创文章 · 获赞 51 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Hanghang_/article/details/104893135
今日推荐