RTMP(Real Time Messaging Protocol)实时消息传输协议,基于TCP协议,一种流媒体协议,默认使用端口1935。用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。
RTMP 是应用层协议,要靠传输层协议(通常是TCP)来提供可靠传输,传输层建立连接之后,RTMP 也要通过 “握手” 来建立 RTMP connection。
Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器。占有内存小,并发能力强,性能效率高,稳定性强,支持热部署。
热部署:程序在运行状态时,如果修改源码了,不用重新启动即可生效。
了解下面几个概念:
(1)正向代理&反向代理

典型的例子就是VPN。当我们电脑登录了VPN之后,代理服务器就代理了我们的电脑,由它来向真正的服务器发起请求,真正的服务器将请求的内容发给代理服务器,代理服务器再将请求内容发给我们的电脑。在这个过程中,我们电脑(client)知道 server的存在,但是 server 不知道我们的电脑,server 不知道我们是通过 VPN 来访问的,对于 server 来说,就是代理服务器向它发起请求而已。

例如我们访问百度都是通过同一个域名 www.baidu.com,但是背后真正被访问的服务器可能是广州的服务器,可能是杭州的服务器等等,所以域名为 www.baidu.com 的这台服务器就是一个反向代理,代理了背后真正的服务器。所以对于用户来说,感知的只有域名为 www.baidu.com 这台服务器,背后的服务器不管怎么动态扩容,用户都是不感知的。
(2)负载均衡
随着业务的不断增长和用户的不断增多,一台服务已经满足不了系统要求了,这个时候就出现了服务器集群。
那发起的请求到底分给哪台服务器来处理?怎么个分配法? 这就需要使用到负载均衡,负载均衡可以将工作分配到不同服务器上处理。有轮询法也有加权轮询法。
Nginx 还带有**健康检查**(服务器心跳检查)功能,会定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态。
(3)动静分离
将静态内容(如HTML,css,jpg等)动态内容分离。对静态内容,可以先进行缓存。
是 Nginx 中的一个模块,使 Nginx 可以支持 RTMP,用于音视频的点播、直播。
Nginx 加上 nginx-rtmp-module 模块作为 RTMP 服务端。
环境:Ubuntu 16.04
(1)安装依赖库
源码编译依赖gcc环境,并且部分 nginx 模块依赖于3个以上的库,其中包括:zlib,pcre,openssl,如果没有安装这3个库,则需要先安装
首先使用 dpkg 命令查看自己需要的软件是否安装。
例如查看zlib是否安装:dpkg -l | grep zlib
sudo apt-get install openssl libssl-dev
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g-dev
(2)下载编译
将安装包下载到指定目录文件夹
cd /opt/nginx //进入目录
wget http://nginx.org/download/nginx-1.12.2.tar.gz //下载安装包
tar zxvf nginx-1.12.2.tar.gz //解压
(3)配置
cd nginx-1.12.2
./configure --help //列出大部分常用模块和编译选项
./configure //配置
默认情况下nginx将被配置到 /usr/local/nginx 目录下
(4)编译安装
make&&make install
(5)验证是否安装成功
/usr/local/nginx/sbin/nginx -v
如果有跟下图一样输出版本号,则安装成功啦!

(6)启动 nginx 服务
/usr/local/nginx/sbin/nginx
查看nginx进程信息
ps -ef|grep nginx
其中 master process 是主进程,1416 为主进程号,worker process 是工作进程。
nginx有一个主进程,多个工作进程,主进程主要用于读取和评估配置,维护工作进程;工作进程是对请求进行实际处理,工作进程的数量可以进行配置。
(7)加入自启动服务和系统服务
#!/bin/bash
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME
# If the daemon file is not found, terminate the script.
test -x $DAEMON || exit 0
d_start() {
$DAEMON || echo -n " already running"
}
d_stop() {
$DAEMON –s quit || echo -n " not running"
}
d_reload() {
$DAEMON –s reload || echo -n " could not reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
reload)
echo -n "Reloading $DESC configuration..."
d_reload
echo "reloaded."
;;
restart)
echo -n "Restarting $DESC: $NAME"
d_stop
# Sleep for two seconds before starting again, this should give the
# Nginx daemon some time to perform a graceful stop.
sleep 2
d_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
exit 3
;;
esac
exit 0
注意上述的路径,如果和默认配置的不同则需要修改!
chmod a+x /etc/init.d/nginx
在末尾添加一句 export PATH=/usr/local/nginx/sbin:$PATH
source /etc/bash.bashrc
此时需要 chkconfig 命令,如果没有此命令可以在终端输入以下命令安装
sudo apt install sysv-rc-conf
sudo cp /usr/sbin/sysv-rc-conf /usr/sbin/chkconfig
chkconfig nginx on
重启虚拟机,进行测试!
(8)检测服务是否可用
启动
service nginx start
停止
service nginx stop
重启
service nginx restart
查看状态
service nginx status
出现的问题:
使用 service nginx start 来启动 nginx 时出现 Failed to start nginx.service:unit not found
原因:没有添加 nginx.service
解决:安装 chkconfig,用 sysv-rc-conf 替代,但是没有 add 和 del 命令。
使用 on 选项将服务加到自启
chkconfig nginx on
这时需要重启虚拟机,才能生效!!!
(1)浏览器打开 https://github.com/arut/nginx-rtmp-module 网址下载 nginx-rtmp-module 插件
或直接使用以下命令下载到 ubuntu 指定的目录下:
cd /opt/nginx/
wget -O nginx-rtmp-module.tar.gz https://codeload.github.com/arut/nginx-rtmp-module/legacy.tar.gz/master
tar zxvf nginx-rtmp-module.tar.gz
(2)重新进入之前解压过的 nginx 文件夹,配置 makefile,加入 NRM 模块
./configure --add-module=/opt/nginx/nginx-rtmp-module --prefix=/usr/local/nginx/ --with-debug
注意:/opt/nginx/nginx-rtmp-module 要替换成你自己的路径
(3)编译安装
make&&make install
(4)启动nginx
./nginx
至此 NRM 组件安装完成!
前提:Linux 下安装有 ffmpeg(Ubuntu下使用 apt install ffmpeg 命令来安装)
(1)配置 Nginx
打开 Nginx 的配置文件:vi /usr/local/nginx/conf/nginx.conf
在对应位置添加如下内容:
#RTMP服务器的配置信息
rtmp {
server {
listen 1935; #监听的端口(默认)
chunk_size 4096; #数据传输块的大小(默认)
application video {
play /opt/nginx/video; #视频文件存放的位置,访问方式:rtmp://localhost:1935/video
}
}
}

注意:存放视频文件的文件夹包括里面的文件以及访问此文件所经过的文件层级都需要具有可读和可进入的权限,否则无法播放
(2)新建文件夹video,用于存放推流的音视频文件。并且拷贝一个MP4文件到该目录下,后面推流要用
mkdir /opt/nginx/video
(3)设置权限指令
chmod -R 555 /opt/nginx/video
(4)设置好之后需要对配置文件重新加载
service nginx reload
service nginx restart
如果无效,则还需重新启动 ubuntu 系统!!!
另外:在对配置文件重新加载前,可以先验证配置文件的正确性。
如果修改了配置文件 /usr/local/nginx/conf/nginx.conf,则在 nginx 启动之前,最好检查一下配置文件是否正确,以免在重启 nginx 之后出现错误,影响服务器的稳定运行,具体执行命令如下:
/usr/local/nginx/sbin/nginx -t
如果配置文件被正确执行则结果如下图所示:

(5)用 ffplay 进行接流播放
ffplay rtmp://192.168.137.9:1935/video/test.mp4
其中,192.168.137.9 改成你的虚拟机的IP地址
如果播放不成功,检查一下是否 url 路径编写出错,如果还是不行可以重新启动再做尝试。
出现的问题:
用 ffplay 播放时,出现下面的一些错误:
① RTMP_Connect0, failed to connect socket. 111 (Connection refused)
原因:没有开启nginx服务,或者是因为配置没有生效。如果 reload 和 restart 后还是不行,就重启虚拟机!
② [h264 @ 0x7fd620007dc0] missing picture in access unit with size 13705
[h264 @ 0x7fd620007dc0] no frame!
RTMP_ReadPacket, failed to read RTMP packet header
我觉得出现上述问题,要么是 URL 写错,如果检查之后,URL 并没有错误,那就是 mp4 视频文件有问题。我就是换了个文件来播放就可以了。😒无语,搞了我好久。
虚拟机下不能使用电脑自带的摄像头,所以需要自己额外连接一个摄像头,连接成功后,在 /dev 目录下会有一个字符设备文件 /dev/video0,这个文件就是指摄像头设备。
(1)配置 nginx
vi /usr/local/nginx/conf/nginx.conf
在对应位置添加如下内容:
application live {
live on; #开启直播
}

(2)设置好之后需要对配置文件重新加载
service nginx reload
service nginx restart
如果无效,则还需重新启动 ubuntu 系统!!!
(3)执行推流命令
ffmpeg -i /dev/video0 -codec libx264 -g 10 -f flv rtmp://192.168.137.9:1935/live/stream0
推流的 rtmp 格式:rtmp://192.168.xxx.xxx/live/streamname(IP地址修改为你的虚拟机的IP地址)
live 要与上面配置文件 nginx.conf 设置的直播标签名一致,streamname 是自己为流取的名称(任意名称)
只需要在接流时 url 格式与推流对应设置的 url 相同即可。
(4)ffplay 接流播放
ffplay rtmp://192.168.137.9:1935/live/stream0
出现的问题:
拉流的时候一直接收不到,一直没反应
解决:不要用 root 用户登录虚拟机,使用普通用户登录再来拉流
也不知道到底是不是这原因,反正切换普通用户登录后来拉流,确实就接收到流了。只是延时太长了,5s以上的延时。
注意:在 root 用户登录下,不要直接 su xxx 来切换用户,这时候会报错:No protocol specified
解决:关闭虚拟机,重新开启后用普通用户来登录。
(1)使用 apt-get 安装软件包时出现 E:Unable to locate package libssl-dev
解决:初次使用阿里云服务器,需要执行 apt-get update 更新软件包
(2)执行 make&&make install 安装 Nginx 时报错 src/os/unix/ngx_user.c:36:7: error: ‘struct crypt_data’ has no member named ‘current_salt’
可能是系统版本太高了。
解决:把报错的那一行代码注释掉
(3)接着编译,报错 src/core/ngx_murmurhash.c:37:11: error: this statement may fall through [-Werror=implicit-fallthrough=] 等信息
解决:进入到 nginx-1.12.2 目录下(即解压的目录),再进入当前目录下的 objs 文件夹,打开文件 Makefile,把下面这一行的 -Werror 去掉

-Werror: gcc将所有的警告当成错误进行处理
(4)Ubuntu20 下安装 sysv-rc-conf 报错:E: Unable to locate package sysv-rc-conf
解决:
sudo vi /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
sudo apt-get update
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p