名词解释
|
|
RTSP (Real-Time Streaming Protocol) |
是一种网络协议,用于控制实时流媒体的传输。它是一种应用层协议,通常用于在客户端和流媒体服务器之间建立和控制媒体流的传输。RTSP允许客户端向服务器发送请求,如播放、暂停、停止、前进、后退等,以控制媒体流的播放和操作。RTSP可以与不同的传输协议(如RTP、TCP、UDP)结合使用,以实现实时的音视频流传输。它在视频监控、流媒体直播、视频会议等应用中广泛使用。 |
RTMP |
RTMP(Real-Time Messaging Protocol)是一种用于实时数据传输的网络协议。它通常用于流媒体传输和实时通信应用程序。 RTMP 最初由Adobe开发,用于在Adobe Flash播放器和媒体服务器之间进行音视频传输。它使用TCP作为传输层协议,并支持实时音频、视频和数据的传输。 RTMP可以用于直播、视频会议、在线游戏等应用场景。通过RTMP,用户可以将音视频数据流从客户端上传到媒体服务器,然后其他用户可以通过相同的协议从媒体服务器上获取这些数据流。 |
RTSP和RTMP区别 |
RTSP(Real-Time Streaming Protocol)和RTMP(Real-Time Messaging Protocol)是两种用于实时流媒体传输的协议,它们有以下几个主要区别:
总的来说,RTSP更注重流媒体的控制和会话管理,适用于需要灵活控制的场景;而RTMP更注重实时音视频数据传输和交互,适用于直播和实时通信等场景。选择使用哪种协议应根据具体需求和平台支持进行决策。 |
HTTP-FLV |
HTTP-FLV是将流媒体数据先封装成FLV格式,然后通过HTTP协议传输给客户端,通过HTTP FLV的直播,这里使用了一个HTTP的协议约定,http 的content-length头字段如果不存在,则客户端就会一直接收数据,直到HTTP连接断开为止,其流程很简单,视频客户端发送HTTP请求,不带content-length头字段,服务器响应HTTP,并一直发送FLV的数据;客户端接收响应并一直接收数据直到连接断开。 |
Nginx |
Nginx是一个广泛用于提供静态内容、代理和负载均衡的Web服务器。在这个场景中,Nginx用于接收RTSP流并通过HTTP向客户端提供服务 |
FFmpeg |
FFmpeg是一个强大的开源多媒体框架,允许用户解码、编码、转码、复用、解复用、流式处理、过滤和播放各种类型的媒体文件。在这种情况下,FFmpeg用于解码RTSP流,并将其转码为FLV格式。 |
nginx-http-flv-module |
这是一个专门用于通过HTTP传输实时FLV(Flash Video)流的Nginx模块。它作为Nginx的插件,提供了以流式方式提供FLV文件所需的功能 |
整体是使用nginx搭建HTTP FLV流媒体服务器:
流程:摄像头rtsp视频流->rtmp->http-flv.
rtsp转为rtmp需要借助ffmpeg转化。
rtmp转为http-flv需要借助nginx转化。
nginx-http-flv-module是基于nginx-rtmp-module开发的,包含nginx-rtmp-module所有功能,因此不能nginx-rtmp-module同时安装,其编译安装步骤与nginx-rtmp-module类似
安装依赖库:
nginx编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum -y install gcc gcc-c++
nginx的http模块使用pcre来解析正则表达式,pcre-devel 是使用 pcre 开发的一个二次开发库,nginx需要依赖这两个库,执行如下命令:
yum install -y pcre pcre-devel
nginx使用zlib对http包的内容进行gzip,需要安装此库:
yum install -y zlib zlib-devel
nginx可能需要支持HTTPS,最好在系统中安装好openssl,一般系统自带,可通过如下命令确认:
openssl version
如果安装了会显示版本号,如果提示未安装,执行如下命令安装:
yum install -y openssl openssl-devel
nginx编译和安装
下载nginx:
wget http://nginx.org/download/nginx-1.21.6.tar.gz
下载nginx模块HTTP FLV模块:
wget https://github.com/winshining/nginx-http-flv-module/archive/v1.2.10.tar.gz
或者是
https://github.com/winshining/nginx-http-flv-module.git
下载zip包也可以
解压nginx和HTTP FLV模块:
tar -zxvf nginx-1.21.6.tar.gz
tar -zxvf v1.2.10.tar.gz
nginx编译和安装:
./configure --prefix=/usr/local/nginx --add-module=../nginx-http-flv-module-1.2.10
这里配置了–prefix,配置安装路径,不安装到默认路径,以便安装文件移植和卸载,可直接拷贝次目录下的文件到其他电脑运行如果目录不同,启动时通过-p指定目录即可。
make & makeinstall
启动nginx,验证是否正确,执行命令(注意安装目录下的sbin/nginx):
/usr/local/nginx/sbin/nginx
打开浏览器输入:http://10.45.12.29/,注意ip为本机ip,显示如下内容,即表示安装成功
修改nginx相关配置支持HTTP FLV
在/home/wangdenuan/nginx/conf/nginx.conf文件中增加:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application myapp {
live on;
meta off;#为了兼容flvj.js
hls on;
hls_path /tmp/hls;
hls_fragment 4;
hls_playlist_length 30;
record off;
allow play all;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /hls{
add_header Access-Control-Allow-Origin *;
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/hls;
expires -1;
}
location /flv {
flv_live on;
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header 'Access-Control-Allow-Origin' '*'; #添加额外的 HTTP 头
add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的 HTTP 头
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
其配置与RTMP配置增加了HTTP FLV的URI的配置。
配置完成后,执行:/home/wangdenuan/nginx/sbin/nginx -s reload,使得配置生效。
如果是多个rtmp地址
rtmp {
# 第一个转流地址
server {
listen 1935; #监听的端口号
application hik01 { #自定义的名字
live on;
}
}
# 第二个转流地址
server {
listen 1936; #监听的端口号
application hik02 { #自定义的名字
live on;
}
}
# 第N个转流地址
server {
listen xxxx; #监听的端口号
application xxxx { #自定义的名字
live on;
}
}
}
安装ffmpeg
安装FFmpeg需要先安装其依赖:yasm
yum install yasm -y
# 获取
wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2
# 解压
tar -xvf ffmpeg-4.1.tar.bz2
# 查看
cd ffmpeg-4.1
# 编译
./configure
# 安装
make && make install
如果make报错,并且和yasm相关,那就配置一下yasm的环境变量
以上的在使用的过程中会报错,原因不支持libx264编解码,所以下面的会比较全面。
下载ffmpeg
官网下载linux版的ffmpeg,官网链接:https://ffmpeg.org/
点击 download 按钮,如下图所示:
点击 more releases 超级链接,如下图所示:
选择最新稳定版FFmpeg 5.0.1,点击 Download xz tarball 按钮,如下图所示:
上传ffmpeg到VMware虚拟机
使用xftp将源码包ffmpeg-6.0.tar.xz上传至linux虚拟机(本教程上传至/soft/ffmpeg目录)
解压ffmpeg压缩包
# cd /soft/ffmpeg # tar -xvf ffmpeg-6.0.tar.xz
安装gcc
# yum install -y gcc
安装yasm编译器
进入http://yasm.tortall.net/releases/Release1.3.0.html,下载yasm-1.3.0.tar.gz,上传至/soft/ffmpeg目录下
或者使用 wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
解压yasm
# tar -zxvf yasm-1.3.0.tar.gz
进入解压目录
# cd yasm-1.3.0
编译和安装
# ./configure # make # make install
查看安装结果
# yasm --version
安装nasm
下载:wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz
解压
# tar -xvf nasm-2.14.02.tar.gz
进入目录
# cd nasm-2.14.02
编译和安装
# ./configure # make && make install
查看安装结果
# nasm --version
安装libx264
https://code.videolan.org/videolan/x264/ 访问git,然后下载tar.gz
解压x264
# tar -xvf x264-master.tar.gz
进入解压目录
# cd x264-master
编译和安装
# ./configure --enable-shared # make && make install
查看安装结果
# x264 --version
安装ffmpeg
进入ffmpeg解压目录
# cd /soft/ffmpeg/ffmpeg-6.0
指定安装目录/soft/ffmpeg
# ./configure --enable-libx264 --enable-gpl --prefix=/soft/ffmpeg
安装
# make && make install
修改文件/etc/ld.so.conf
# vim /etc/ld.so.conf
添加两行:
/soft/ffmpeg/lib/ /usr/local/lib/
使修改的文件/etc/ld.so.conf
# ldconfig
查看安装结果
# ./ffmpeg -version
配置环境变量
# vim /etc/profile export PATH=$PATH:/soft/ffmpeg/bin
使环境变量生效
# source /etc/profile
查看ffmpeg版本
# ffmpeg -version
问题1 & 解决办法
执行编译ffmpeg(./configure –enable-libx264 –enable-gpl –prefix=/soft/ffmpeg)时,异常:
解决办法1: 下载pkg-config-0.29.2.tar.gz,地址:https://www.freedesktop.org/wiki/Software/pkg-config/
或者直接 wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz 解压压缩包
# tar zxvf pkg-config-0.29.2.tar.gz
进入解压目录
# cd pkg-config-0.29.2
编译与安装
# ./configure --with-internal-glib # make # make check # make install
查看安装结果
# pkg-config –-version
问题2 & 解决办法
安装ffmpeg后,执行 ./ffmpeg -version 时异常
解决办法2: 修改文件/etc/ld.so.conf
# vim /etc/ld.so.conf
添加两行:
/soft/ffmpeg/lib/ /usr/local/lib/
使修改的文件/etc/ld.so.conf生效
# ldconfig
编译之后查看目标文件的链接情况
# ldd ffmpeg
看到的结果是有几个库没有找到链接库文件, 显示xxx not found, 但是库文件是存在的。 见:解决办法2。
配置ffmpeg环境变量
# vim /etc/profile
在最后增加两行
export FFMPEG_HOME=/soft/ffmpeg/ffmpeg-6.0 export PATH=$PATH:$FFMPEG_HOME/bin
使配置生效
# source /etc/profile
启用ffmpeg进行推流
以下命令需要修改rtsp流地址,rtmp地址以服务器实际配置为准,其他命令暂时复制即可。
-rtsp_transport tcp 是将默认的udp协议转为tcp协议,可以一定程度上解决花屏(丢包)的问题。
# 命令
ffmpeg -rtsp_transport tcp -i [rtsp流地址] flv -r 25 -s 1920*1080 -an [转换后的rtmp流地址]
# 实例
ffmpeg -rtsp_transport tcp -i rtsp://admin:123456@192.168.00.00 -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/hik01/
# 后台运行,在命令前加nohup,后加 &
nohup ffmpeg -rtsp_transport tcp -i rtsp://admin:123456@192.168.00.00 -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/hik01/ &
打开命令提示行,输入如下ffmpeg命令,推送rtmp视频流到rtmp服务器,这里假设rtmp服务器IP为:10.45.12.29
ffmpeg -re -i rtsp://admin:zxm10@@@@10.45.12.141/h264/ch1/main/av_stream -vcodec libx264 -acodec aac -f flv rtmp://10.45.12.29:1935/myapp/mystream
后台运行
nohup ffmpeg -re -i rtsp://admin:zxm10@@@@10.45.12.141/h264/ch1/main/av_stream -vcodec libx264 -acodec aac -f flv rtmp://10.45.12.29:1935/myapp/mystream &
利用VLC等视频工具验证flv流是否可用,VLC下载可自行百度
用VLC播放如下串流:http://10.45.12.29/flv?port=1935&app=myapp&stream=mystream,验证HTTP FLV是否能播放成功