流媒体传输协议

  1. 流媒体传输协议:全称Real-Time Transport Protocol,一种传输层协议
  2. 常见的流媒体传输协议如下所示:
    1. rtsp
    2. rtmp
    3. hlv
    4. hls
    5. HTTP-FLV(HDL)

海康摄像头流地址信息

  1. 安装海康设备网络搜索软件SADP,这个软件可以搜索同一局域网同一网段的所有在线设备,以及设备的信息
  2. 启用onvif协议,然后根据onvif协议可以获取摄像头的rtsp流地址信息

ffmpeg安装及配置

1.ffmpeg的安装
2.ffmpeg命令行工具的使用

参考官方文档

  1. -i:输入
  2. -c[:stream_specifier] codec:
  3. -f:指定输入或者输出文件的格式
  4. -re:Read input at native frame rate
  5. -stream_loop number:Set number of times input stream shall be looped. Loop 0 means no loop, loop -1 means infinite loop.
  6. -vcodec codec:设置视频的编码方式为codec
  7. -acodec codec:设置声音的编码方式为codec

推流

通常会将局域网内的摄像头流推流到流媒体服务器,推流具有如下方式:

  1. 方式1:使用ffmpeg命令行工具
  2. 方式2:基于ffmpeg开发推流模块
  3. 方式3:使用obs工具

流媒体服务器的搭建

环境:ubantu

1.方案1:基于ZLMediaKit搭建流媒体服务器
  1. 编译流媒体服务框架ZLMediaKit
  2. 运行
cd ZLMediaKit/release/linux/Debug
./MediaServer -d &
  1. 选择推流时是否需要鉴权
    1. 如果需要鉴权,则在推流时传递secret参数,其值在ZLMediaKit项目下的配置文件config.ini中
    2. 推流默认不需要鉴权,[hook]节点下的enable的值为0
  2. 推送rtsp流测试
    1. 使用一个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
    
    1. 推送成功后,MediaServer控制台输出如下信息
  3. 播放:播放根据播放的url规则进行播放
    1. url分为以下几个部分
      1. 协议:比如说rtsp、
      2. 虚拟主机vhost:该字段可以是域名,也可以是IP。如果是IP则对应的虚拟主机为 __defaultVhost__
      3. 服务端口号:如果不指定端口号则使用协议的默认端口号。比如说rtsp协议的默认端口号为554
      4. 应用名:live
      5. 流ID:test
      6. 参数:secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
    2. 示例播放url
    rtmp://192.168.108.53/live/test?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
    
    
  4. 基于ZLMediaKit搭建的流媒体服务器的关闭:
killall -2 MediaServer
2.方案2:基于nginx搭建流媒体服务器
  1. 安装nginx:版本为nginx-1.24.0
    1. 下载nginx源码:
    wget https://nginx.org/download/nginx-1.24.0.tar.gz
    
    1. 解压:
    tar -zxvf nginx-1.24.0.tar.gz
    
    1. 配置:安装到指定的目录
    cd nginx-1.24.0/
    ./configure --prefix=/usr/local/nginx
    
    1. 编译及安装
    make -j 4 && make install
    
    1. 查看nginx的版本:nginx -V
    2. 运行nginx:nginx
  2. nginx安装nginx-rtmp-module模块
    1. 下载
    git clone https://github.com/arut/nginx-rtmp-module.git
    
    1. 配置
    cd nginx-1.24.0/
    ./configure --add-module=第一步安装的nginx-rtmp-module的路径
    --prefix=/usr/local/nginx
    
    1. 编译安装
    make -j 4 && make install
    
  3. 示例:将一个海康的rtsp流转rtmp流
    1. 云服务器上设置安全组,开放1935端口
    2. 修改配置文件nginx.conf,配置参考地址
    rtmp {
    
        server {
     
            listen 1935;
     
    		
    		# 节点的名称和rtmp的部分路径相匹配
            application live {
     
                live on;
     
                max_connections 1024;
     
            }
     
        }
     
    }
    
    1. 启动nginx服务:./nginx -c /usr/local/nginx/conf/nginx.conf ,以指定的配置文件启动nginx
    2. 将局域网海康视频流推送到流媒体服务器:
    ffmpeg -i rtsp://user:password@192.168.0.107:554/D11  -c:v libx264 -f flv rtmp://ip/live
    
    1. 本地使用vlc工具模拟拉流,成功显示
  4. 示例:将多个海康的rtsp流转rtmp流,
    1. 更改nginx配置,如下所示:
    worker_processes  4;
    
    rtmp_auto_push on;
    
    rtmp {
     
        server {
     
            listen 1935;
     
    		
    		# 节点的名称和rtmp的部分路径相匹配
            application live {
     
                live on;
     
                max_connections 1024;
     
            }
        }
     
    }
    
    1. 使用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
    
    1. 问题:这种方案延迟严重,待解决

拉流

拉流具有如下方式

  1. 使用VLC工具
  2. 使用ffplay