1. OEM视频网闸

  1. 支持sip/rtsp/rtmp等主流视频流协议;

  2. 支持TCP双向传输信令和数据;

2. 激光/光闸单向采集

  1. 硬件视频采集卡;

  2. 软件近实时采集图像视频,通过单向设备传输,一帧一帧播放,无法传音频;

  3. ffmpeg将流按时间片进行切割保存本地,然后单向摆渡文件,再推流还原;

  4. ffmpeg拉流(rtsp/rtmp),转底层单向通道,ffmpeg接收底层流,ffmpeg推流(rtsp/rtmp)

3.RTSP服务搭建

  1. 下载路径:https://github.com/bluenviron/mediamtx/releases

  2. 解压执行./mediamtx, 默认配置文件yml;

  3. 本地文件推流RTSP

    1
    2
    3
    4
    5
    6
    
    ffmpeg -re -stream_loop -1 -i sysj_0QuI4OYme98ha.ts -c copy -f rtsp rtsp://192.168.48.180:8554/mystream
    #简单对参数说明
    -re  是以流的方式读取
    -stream_loop -1   表示无限循环读取
    -i  就是输入的文件
    -f  格式化输出到哪里
    

4. RTMP服务搭建

  1. 下载rtmp模块

    1
    
    git clone https://github.com/arut/nginx-rtmp-module.git
    
  2. 手动编译安装nginx

    1
    2
    3
    4
    
    cd nginx-1.8.1
    ./configure --add-module=../nginx-rtmp-module
    make
    sudo make install
    
  3. 配置文件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    rtmp {                #RTMP服务
        server {
           listen 1935;  #//服务端口
           chunk_size 4096;   #//数据传输块的大小
           application vod {
               play /opt/video; #//视频文件存放位置。
           }
           application live{ #直播开启
               live on;
           }
       }
    }
    
  4. 测试

    1
    2
    
    ffmpeg -i xx.mp4 -f flv rtmp://192.168.200.177:1935/live
    vlc拉起串流播放
    

4.拉流

  1. 拉rtsp流

    -hide_banner -y

    这会阻止版权声明、构建选项和库版本打印到控制台。

    -loglevel error

    我从大多数 RTSP 相机流收到了很多警告消息。我们可以使用其他命令行选项修复大多数警告,我不希望这些警告在正常使用期间填满我的日志。

    -rtsp_transport tcp

    我们这里的选项是TCP或UDP。在我录制UDP流的实验中,视频文件经常损坏。我认为这是由于无法保证的数据包交付或订单。我尝试调整各种 FFmpeg 设置,例如缓冲区大小,但无法获得在 UDP 上保存可靠性的文件。不过,它确实提供了一个很好的低延迟、更轻带宽的实时流媒体选项。

    -use_wallclock_as_timestamps 1

    这会在视频源中重建时间戳。在我对各种网络摄像机的实验中,需要这样做才能使保存的视频正确搜索。我认为这解决了某些网络摄像机的不同帧速率问题,以及某些品牌的流不包括正确的时间戳的问题。

    -i rtsp://username:password@192.168.1.123:554/stream1

    这是我们要用作输入的 RTSP 视频流的地址。每台摄像机都有一个不同的URL,您可以通过在线搜索找到该URL。上面的网址是Tapo C310。如果照相机需要用户名和密码,则以IP地址为前缀。

    -vcodec copy
    -acodec copy

    这些参数告诉 FFmpeg 不要重新编码视频或音频流,而只是复制它们。这将最大限度地减少 CPU 使用率,这对于在 Raspberry PI 等设备上录制多个流非常有用。权衡是视频可能会比重新编码为更有效的格式更大。“复制”视频流文件的质量和大小将取决于特定的摄像机及其设置。

    -f segment

    接下来的几个参数告诉 FFmpeg 将视频流保存到较小的片段文件,而不是写入一个永无止境的文件。

    -reset_timestamps 1

    这会将每个段文件开头的时间戳重置为零。需要修复无法搜索的视频文件的问题。我认为这是由于时间戳保存不正确。

    -segment_time 900

    这告诉 FFmpeg,在启动新文件之前,每个文件应该有 15 分钟(900 秒)长。

    -segment_atclocktime 1

    这使得 FFmpeg 在“圆形”时间开始和结束录制文件,例如 09:00、09:15、09:30 等。开始和结束时间不会完全按照时间,因为视频必须在关键帧上开始和停止。不过,您可以预期文件的开始/结束时间在回合时间的几秒钟内。

    -segment_format mkv

    将视频另存为 .mkv 文件。我选择了 .mkv 而不是 .mp4,因为 .mkv 提供的对腐败的恢复能力有所提高。我尝试在录制流时拔掉相机上的插头,以模拟有人偷走相机。.mkv文件记录到断电的那一刻,而.mp4文件经常损坏且无法播放。

    -strftime 1
    %Y%m%dT%H%M%S.mkv

    这是视频文件的命名约定。字母和百分号的集合是一个格式字符串,它告诉 FFmpeg 如何使用日期来命名此文件。我们使用这种类似ISO8601格式,因为它允许我们通过按字母顺序排序来按日期对文件进行排序。从 2022–01–30 21:30:00 开始的视频将另存为 20220130T213000.mkv(给予或花费几秒钟)。您还可以在此字符串之前添加一个目录,以将视频保存在与运行命令行的其他位置。例如 Windows上的“C:\Users\you\Videos\front_door%Y%m%dT%H%M%S.mkv”。

    1
    
    ffmpeg -hide_banner -y -loglevel error -rtsp_transport tcp -use_wallclock_as_timestamps 1 -i rtsp://username:password@192.168.1.123:554/stream1 -vcodec copy -acodec copy -f segment -reset_timestamps 1 -segment_time 900 -segment_format mkv -segment_atclocktime 1 -strftime 1 %Y%m%dT%H%M%S.mkv
    
    1
    2
    3
    4
    5
    6
    7
    8
    
    if [ -z "$1" ]; then
      IP_ADDRESS=10.164.208.102
    else
      IP_ADDRESS=$1
    fi
    
    # FFMPEG command for creating segments from RTSP stream
    ffmpeg -i rtsp://@${IP_ADDRESS}:5554/playlist.m3u  -c copy -map 0 -f segment -strftime 1 -segment_time 60 -segment_format mp4 "%Y%m%d-%H%M.mp4"
    
  2. 拉rtmp流

4. 推流

  1. rtsp2rtsp

    ffmpeg -i rtsp://admin:admin1234@192.168.1.64:554/h264/ch1/sub/av_stream -codec copy -f rtsp rtsp://192.168.1.223:554/stream/

  2. 文件推rtsp

    ffmpeg -re -i test.mp4 -codec copy -f rtsp rtsp://192.168.200.177:8554/stream

  3. 文件推rtmp

    ffmpeg -re -i test_mk4.mkv -vcodec copy -codec copy -f flv rtmp://192.18.0.182:1935/livevideo

  4. 拉取激光底层数据推流rtmp

    ffmpeg -i udp://10.1.1.3:12346 -vcodec copy -f flv rtmp://192.168.200.115:1935/live

  5. 拉rtsp流推底层通道数据流

    ffmpeg -rtsp_transport tcp -i rtsp://192.168.200.177:8554/stream -vcodec copy -f mpegts udp://10.1.1.3:12346

  6. usb摄像头推流rtsp

    sudo ffmpeg -f v4l2 -video_size 480x480 -i /dev/video0 -c libx264 -f rtsp -rtsp_transport tcp rtsp://192.168.200.177:8554/stream

    sudo ffmpeg -r 30 -i /dev/video0 -vcodec h264 -max_delay 100 -f flv -g 5 -b 700000 rtmp://192.168.200.115:1935/live