音视频系列:
音视频系列1:ffmpeg+rtmp拉流
音视频系列2:ffmpeg将H.264解码为RGB
有兴趣的朋友可以看看。
上一节我们采用ffmpeg拉取芒果台视频,并处理成rgb,奈何芒果台不给力,拉流卡卡的,这样就不知道是我代码的问题,还是芒果台服务器的问题了,为了杜绝这个问题发生,我们这一节在本地搭建nginx服务器,用ffmpeg进行本地推流,再用自己的代码和VLC播放器进行PK测试。
为啥要这么做,因为本地推流,本地接收,可以保证推出来的流肯定是流畅的,这样自己代码出了问题(比如很卡)那么就能够第一时间知道,等于排除了服务器的问题。
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
安装完成。
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程序:
/usr/local/nginx/sbin/nginx -s reload
到这里nginx就配置好了。
ffmpeg -re -i sss.mp4 -c copy -f flv rtmp://localhost:1935/live/rtmplive
出现错误:
rtmp://localhost:1935/live/mytv: Input/output error
实际上是地址写错了。
重新来:
ffmpeg -re -i sss.mp4 -c copy -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系统。
如果我的文章对你有帮助,欢迎点赞、评论、关注。