单向视频流解决方案
文章目录
1. OEM视频网闸
-
支持sip/rtsp/rtmp等主流视频流协议;
-
支持TCP双向传输信令和数据;
2. 激光/光闸单向采集
-
硬件视频采集卡;
-
软件近实时采集图像视频,通过单向设备传输,一帧一帧播放,无法传音频;
-
ffmpeg将流按时间片进行切割保存本地,然后单向摆渡文件,再推流还原;
-
ffmpeg拉流(rtsp/rtmp),转底层单向通道,ffmpeg接收底层流,ffmpeg推流(rtsp/rtmp)
3.RTSP服务搭建
-
下载路径:https://github.com/bluenviron/mediamtx/releases
-
解压执行./mediamtx, 默认配置文件yml;
-
本地文件推流RTSP
1 2 3 4 5 6ffmpeg -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服务搭建
-
下载rtmp模块
1git clone https://github.com/arut/nginx-rtmp-module.git -
手动编译安装nginx
1 2 3 4cd nginx-1.8.1 ./configure --add-module=../nginx-rtmp-module make sudo make install -
配置文件
1 2 3 4 5 6 7 8 9 10 11 12rtmp { #RTMP服务 server { listen 1935; #//服务端口 chunk_size 4096; #//数据传输块的大小 application vod { play /opt/video; #//视频文件存放位置。 } application live{ #直播开启 live on; } } } -
测试
1 2ffmpeg -i xx.mp4 -f flv rtmp://192.168.200.177:1935/live vlc拉起串流播放
4.拉流
-
拉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”。
1ffmpeg -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.mkv1 2 3 4 5 6 7 8if [ -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" -
拉rtmp流
4. 推流
-
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/
-
文件推rtsp
ffmpeg -re -i test.mp4 -codec copy -f rtsp rtsp://192.168.200.177:8554/stream
-
文件推rtmp
ffmpeg -re -i test_mk4.mkv -vcodec copy -codec copy -f flv rtmp://192.18.0.182:1935/livevideo
-
拉取激光底层数据推流rtmp
ffmpeg -i udp://10.1.1.3:12346 -vcodec copy -f flv rtmp://192.168.200.115:1935/live
-
拉rtsp流推底层通道数据流
ffmpeg -rtsp_transport tcp -i rtsp://192.168.200.177:8554/stream -vcodec copy -f mpegts udp://10.1.1.3:12346
-
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