目录
流媒体传输协议
- 流媒体传输协议:全称Real-Time Transport Protocol,一种传输层协议
- 常见的流媒体传输协议如下所示:
- rtsp
- rtmp
- hlv
- hls
- HTTP-FLV(HDL)
海康摄像头流地址信息
- 安装海康设备网络搜索软件SADP,这个软件可以搜索同一局域网同一网段的所有在线设备,以及设备的信息
- 启用onvif协议,然后根据onvif协议可以获取摄像头的rtsp流地址信息
ffmpeg安装及配置
1.ffmpeg的安装
2.ffmpeg命令行工具的使用
- -i:输入
- -c[:stream_specifier] codec:
- -f:指定输入或者输出文件的格式
- -re:Read input at native frame rate
- -stream_loop number:Set number of times input stream shall be looped. Loop 0 means no loop, loop -1 means infinite loop.
- -vcodec codec:设置视频的编码方式为codec
- -acodec codec:设置声音的编码方式为codec
推流
通常会将局域网内的摄像头流推流到流媒体服务器,推流具有如下方式:
- 方式1:使用ffmpeg命令行工具
- 方式2:基于ffmpeg开发推流模块
- 方式3:使用obs工具
流媒体服务器的搭建
环境:ubantu
1.方案1:基于ZLMediaKit搭建流媒体服务器
- 编译流媒体服务框架ZLMediaKit
- 运行
cd ZLMediaKit/release/linux/Debug
./MediaServer -d &
- 选择推流时是否需要鉴权
- 如果需要鉴权,则在推流时传递secret参数,其值在ZLMediaKit项目下的配置文件config.ini中
- 推流默认不需要鉴权,[hook]节点下的enable的值为0
- 推送rtsp流测试
- 使用一个mp4模拟推送rtsp流
// 指定编码方式为h264 ffmpeg -re -stream_loop -1 -i "test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.108.53/live/test?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
- 推送成功后,MediaServer控制台输出如下信息
- 播放:播放根据播放的url规则进行播放
- url分为以下几个部分
- 协议:比如说rtsp、
- 虚拟主机vhost:该字段可以是域名,也可以是IP。如果是IP则对应的虚拟主机为
__defaultVhost__
- 服务端口号:如果不指定端口号则使用协议的默认端口号。比如说rtsp协议的默认端口号为554
- 应用名:live
- 流ID:test
- 参数:
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
- 示例播放url
rtmp://192.168.108.53/live/test?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
- url分为以下几个部分
- 基于ZLMediaKit搭建的流媒体服务器的关闭:
killall -2 MediaServer
2.方案2:基于nginx搭建流媒体服务器
- 安装nginx:版本为nginx-1.24.0
- 下载nginx源码:
wget https://nginx.org/download/nginx-1.24.0.tar.gz
- 解压:
tar -zxvf nginx-1.24.0.tar.gz
- 配置:安装到指定的目录
cd nginx-1.24.0/ ./configure --prefix=/usr/local/nginx
- 编译及安装
make -j 4 && make install
- 查看nginx的版本:
nginx -V
- 运行nginx:
nginx
- nginx安装nginx-rtmp-module模块
- 下载
git clone https://github.com/arut/nginx-rtmp-module.git
- 配置
cd nginx-1.24.0/ ./configure --add-module=第一步安装的nginx-rtmp-module的路径 --prefix=/usr/local/nginx
- 编译安装
make -j 4 && make install
- 示例:将一个海康的rtsp流转rtmp流
- 云服务器上设置安全组,开放1935端口
- 修改配置文件nginx.conf,配置参考地址
rtmp { server { listen 1935; # 节点的名称和rtmp的部分路径相匹配 application live { live on; max_connections 1024; } } }
- 启动nginx服务:
./nginx -c /usr/local/nginx/conf/nginx.conf
,以指定的配置文件启动nginx - 将局域网海康视频流推送到流媒体服务器:
ffmpeg -i rtsp://user:password@192.168.0.107:554/D11 -c:v libx264 -f flv rtmp://ip/live
- 本地使用vlc工具模拟拉流,成功显示
- 示例:将多个海康的rtsp流转rtmp流,
- 更改nginx配置,如下所示:
worker_processes 4; rtmp_auto_push on; rtmp { server { listen 1935; # 节点的名称和rtmp的部分路径相匹配 application live { live on; max_connections 1024; } } }
- 使用ffmpeg推流命令:thread_queue_size参数的值默认为8,根据自己机器的情况进行调整
ffmpeg -re -thread_queue_size 1024 -i rtsp://user:password@192.168.0.107:554/D11 -re -thread_queue_size 1024 -i rtsp://user:password@192.168.0.105:554/D9 -map 0 -f flv rtmp://ip/live/first -map 1 -f flv rtmp://ip/live/second
- 问题:这种方案延迟严重,待解决
拉流
拉流具有如下方式
- 使用VLC工具
- 使用ffplay