有个项目用到摄像头预览,之前摄像头的实现都是针对海康的sdk实现,需要浏览器安装插件,且仅适用于ie浏览器,查网上资料找到能够使用ffmpeg+nginx反向代理实现。
ffmpeg和nginx都没有自己编译,在网上找的资源下载的。之前没接触过该项内容,走了不少弯路,谨记之
取流地址:
ffmpeg -rtsp_transport tcp -i "rtsp://用户名:密码@ip:端口号/h264/ch1/main/av_stream" -vcodec libx264 -an -acodec copy -f flv "rtmp://nginx服务器地址:端口号/video/room"
h264:摄像头视频编码格式,有H264和H265
-an:在推流时加上 -an 参数,关掉音频流,刚开始因为没加-an,一切都觉得没问题,就是预览不了,浏览器控制台一直报错(anonymous) @ flv-demuxer.js:19213logger.js:32 [e] > DemuxException: type = CodecUnsupported, info = Flv: Unsupported audio codec idx: 7,参考https://www.gitmemory.com/issue/bilibili/flv.js/470/518572689
/video:nginx中设置的rtmp中application的名字
/room: 自定义,和调用时候保持一致即可
先用VLC测试取流地址是否可用
nginx代理
nginx需要编译nginx-http-flv-module,也是直接下载网上编译好的。。
主要配置:
http { include mime.types; default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; server { server_name localhost; listen 19888; location /flv { flv_live on; chunked_transfer_encoding on; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; }
location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; }
location /stat.xsl { root html/nginx-http-flv-module/; }
location /control { rtmp_control all; }
location /rtmp-publisher { root html/nginx-http-flv-module/test; } location / { root html/nginx-http-flv-module/test/www; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
rtmp { server { listen 11935; chunk_size 4000; application video { live on; } } }
其中mime.types中要把支持的视频格式给加进去
video/3gpp 3gpp 3gp; video/mp2t ts; video/mp4 mp4; video/mpeg mpeg mpg; video/quicktime mov; video/webm webm; video/x-flv flv; video/x-m4v m4v; video/x-mng mng; video/x-ms-asf asx asf; video/x-ms-wmv wmv; video/x-msvideo avi;
之前没加,能推到nginx,就是视频看不了。。
前端展示
可通过http方式和rtmp方式,目前测的remp在360浏览器的video标签中能够使用,在谷歌中不行
remp调用地址:rtmp://nginx服务器地址:端口号/video/room
http调用地址:http://localhost:19888/flv?port=11935&app=video&stream=room
localhost:nginx服务器ip地址
19888:http协议的端口号
flv:nginx的http协议的 location /flv
11935:nginx的rtmp的端口号
video:nginx的rtmp的application的名字
room:自定义,和上面room保持一致
用VLC测试代理地址是否可用
前端html,http调用
<!DOCTYPE html> <html lang="en"> <head> <title>HTML5 直播</title> <!--<script src="./dist/flv.min.js"></script> --> <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/0.0.2/flv.min.js"></script> </head> <body> <video id="videoElement" muted></video> </body> <script> if (flvjs.isSupported()) { var videoElement = document.getElementById('videoElement'); var flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'http://localhost:19888/flv?port=11935&app=video&stream=room' }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); flvPlayer.play(); } </script> </html>前端html,rtmp调用
<!DOCTYPE html> <html lang="en"> <head> <link href="http://vjs.zencdn.net/5.19/video-js.min.css" rel="stylesheet"> <script src="http://vjs.zencdn.net/5.19/video.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/videojs-flash@2/dist/videojs-flash.min.js"></script> </head> <body> <video id="video" controls preload="auto" width="1280" height="720" data-setup="{}"> <source src="rtmp://localhost:11935/video/room" type="rtmp/hlv"> </video> </body> </html>后续需要继续研究云台控制和多个摄像头如何集成项目中
demo下载地址:https://download.csdn.net/download/ran11121/12805117