实时视频解决方案 RTSP转RTMP,并转发FLV格式流
最近公司有个项目,要可以看各个设备的实时视频,本来在两天内找了一些参考材料写了一下,里面的链接都是对我开发很有启发的帖子
方案来源参考
方案一: html5 + websocket_rtsp_proxy 实现视频流直播
- 服务器安装streamedian服务器
- 客户端通过video标签播放
缺点:收费的,免费版有很多限制
暂未尝试
方案2 VLC插件
放弃,chrome不支持
方案3:ffmpeg + nginx + videojs,rtsp转rtmp播放
rtmp的播放严重依赖flash,而由于flash本身的安全,现代浏览器大多禁用flash
所以需要结合nginx 作为流媒体服务器,在接收rtmp流的同时 转发 flv 格式流出来
方案4 ffmpeg + video,rtsp转hls播放
以下主要介绍一下我尝试方案3和方案4的过程
方案 3 过程
nginx安装 nginx-http-flv-module 模块
nginx配置
可以通过nginx服务同时分发rtmp流和http-flv流。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | rtmp { server { listen 1935 ; application live { live on; } application history { live on; } application hls { live on; hls on; hls_path temp/hls; hls_fragment 8s; } } } http { ...... server { listen 8080 ; server_name localhost; location /live { flv_live on; chunked_transfer_encoding on; #open 'Transfer-Encoding: chunked' response add_header 'Access-Control-Allow-Credentials' 'true' ; #add additional HTTP header add_header 'Access-Control-Allow-Origin' '*' ; #add additional HTTP header add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; add_header 'Cache-Control' 'no-cache' ; } } ...... } |
安装ffmpeg
yum安装
下载安装
在window平台安装nginx模块
这个比较复杂,我还没去尝试,因为已经确定服务会部署在 centos 7 上
window安装ffmpeg
https://zhuanlan.zhihu.com/p/118362010
Path添加环境变量
bin目录下执行 ffmpeg –version 验证安装成功
ffmpeg推流 将rtsp转为rtmp
1
我试了没有成功
ffmpeg -i "rtsp://admin:a1234567@192.168.33.3:554" -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/live/"
2
我试了没有成功
ffmpeg -rtsp_transport tcp -i rtsp://admin:a1234567@192.168.33.3:554 -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/live/
3
执行下面推流成功! 让他视频转rtmp
ffmpeg -rtsp_transport tcp -i rtsp://admin:a1234567@192.168.33.3:554 -vcodec h264 -f flv -an rtmp://localhost:1935/live/room
rtmp://localhost:1935/live/room

使用VLC测试可以正常播放

http部分配置
和上面的nginx.conf一样,这个部分作用主要是转发flv
location /live { flv_live on; chunked_transfer_encoding on; #open 'Transfer-Encoding: chunked' response add_header 'Access-Control-Allow-Credentials' 'true'; #add additional HTTP header add_header 'Access-Control-Allow-Origin' '*'; #add additional HTTP header add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; add_header 'Cache-Control' 'no-cache'; }
访问可以下载无后缀类型文件
使用 flv.js 实现网页播放
flv.js 构建出错
直接下载js
问题:
使用 flv.js 过程产生的常见问题
使用flv
问题:
chrome自动播放失败解决
flv.js 不支持rtmp视频流
videojs播放rtmp流
提示 No compatible source was found for this video
解决方案:
1.将文件放到服务器上,就是别用本地文件的方式打开
方案 4 过程
该方案只要ffmpeg ,不需要nginx代理 http-flv ,但是播放端不好处理
ffmpeg 推流
ffmpeg -i "rtsp://admin:a1234567@192.168.33.3:554" -c copy -f hls -hls_time 2.0 -hls_list_size 0 -hls_wrap 15 "C:/Users/HLF/Desktop/videojs/hls/test.m3u8"

VLC可以播放,但是播放完片段会暂停

问题:播放完片段后会卡住,不知道要怎么使它连续播放
视频大小
25帧 360p (480x360)
1分钟视频大小 接近 3M
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!