怎么把rtsp视频流转成webrtc接口

简介: 【8月更文挑战第8天】将RTSP视频流转换为WebRTC接口涉及多个步骤:首先使用工具如webrtc-streamer、ffmpeg等从RTSP源获取视频流;接着对流进行解码与编码至WebRTC兼容格式(如VP8、H.264);然后利用WebSocket建立客户端与服务器间的双向信令通道;再通过JavaScript创建WebRTC PeerConnection并交换SDP信息;最后添加Track传输视频数据,并在接收端解析显示。使用webrtc-streamer可简化这一过程,其API支持多种操作如添加ICE候选、创建Offer等。




将RTSP视频流转换为WebRTC接口需要进行以下步骤:


获取RTSP视频流:使用相应的库或工具,如webrtc-streamer、ffmpeg、GStreamer等,从RTSP服务器或摄像头获取视频流。


解码和编码:对于获取到的视频流,需要进行解码(将其转换成原始帧数据)和编码(将其转换成WebRTC支持的格式,如VP8、H.264)处理。可以使用FFmpeg或其他多媒体处理库来完成这些操作。


WebRTC信令传输:使用WebSocket或其他实时通信协议,在客户端和服务器之间建立双向通信的信道。这是用于传输音频/视频数据和控制消息的关键步骤。


建立PeerConnection:在客户端使用JavaScript代码创建WebRTC PeerConnection对象,并通过信令通道交换SDP(Session Description Protocol)信息。


传输视频流:在PeerConnection中添加Track以传输视频数据。可以通过调用getUserMedia()方法获取本地视频轨道,并将其添加到PeerConnection中。


接收端解析和显示:在接收端,使用WebRTC API解析接收到的音频/视频数据,并将其显示在浏览器上。



一、webrtc-streamer的API

webrtc-streamer的服务地址:192.168.1.8:8000

查询所有api:http://192.168.1.8:8000/api/help

[

"/api/addIceCandidate",

"/api/call",

"/api/createOffer",

"/api/getAudioDeviceList",

"/api/getIceCandidate",

"/api/getIceServers",

"/api/getMediaList",

"/api/getPeerConnectionList",

"/api/getStreamList",

"/api/getVideoDeviceList",

"/api/hangup",

"/api/help",

"/api/log",

"/api/setAnswer",

"/api/version"

]

二、webrtc-streamer的启动命令介绍

进入解压目录 指定绑定ip端口:./webrtc-streamer -H 192.168.1.8:8123

注意几个细节:

1、-o 这个命令务必要加上,不加的话你会发现你的cpu预览几路马上飙升到100%。

2、 -s/-S/-t/-T这几个命令后面不要有空格。

3、只支持H264的视频码流,H265不支持。

三、webrtc-streamer的安装部署

1.下载地址

   https://github.com/mpromonet/webrtc-streamer/releases

image.png

2.windows版本部署

下载windows版本压缩包,解压后如下图

image.png


在当前目录下输入命令webrtc-streamer.exe -H 192.168.1.227:8000 -o

再次强调 -o  为了不转码,进而降低cpu负荷。

image.png

四、springboot整合webrtc-streamer

            这部分我就快速贴代码了。


          1、前端部分:


                  项目需要引入的js:webrtcstreamer.js、adapter.min.js、jquery-1.7.1.min.js


                  我这里配置了24个video用来测试,分别支持宇视、大华、海康的RTSP流。

<!DOCTYPE html>

<html lang="en">

<head>

   <meta charset="UTF-8">

   <title>Title</title>

   <script type="text/javascript" src="adapter.min.js"></script>

   <script type="text/javascript" src="webrtcstreamer.js"></script>

   <script type="text/javascript" src="jquery-1.7.1.min.js"></script>

   <style>

       video {

           width: 300px;

           height: 200px;

       }

   </style>

</head>

<body>

<p>视频播放</p>

<div>

   <video id="video1" muted autoplay loop controls>muted controls disablePictureInPicture</video>

   <video id="video2" muted autoplay loop controls>muted controls disablePictureInPicture</video>

</div>

<div>

   <video id="video7" muted autoplay loop controls>muted controls disablePictureInPicture</video>

   <video id="video8" muted autoplay loop controls>muted controls disablePictureInPicture</video>

 

</div>

<div>

   <video id="video13" muted autoplay loop controls>muted controls disablePictureInPicture</video>

   <video id="video14" muted autoplay loop controls>muted controls disablePictureInPicture</video>

 

</div>

<div>

   <video id="video19" muted autoplay loop controls>muted controls disablePictureInPicture</video>

   <video id="video20" muted autoplay loop controls>muted controls disablePictureInPicture</video>

 

</div>

<script>

   var cameralist = new Array();

   var camera64 = {type: "hik", ipaddr: "192.168.1.64", username: "admin", password: "hik12345", port: 554};

   window.onload = function () {

       // 初始化内容

       cameralist.push(camera64);

       console.log(cameralist);

   }

   let num = 0;

 

   function getCamera() {

       let obj = cameralist[num];

       console.log(obj);

       num++;

       if (num == 1) {

           num = 0;

       }

       return obj;

   }

 

   let webRtcServer = null;

   let videoMap = new Map();

   $('video').click(function (e) {

       let ID = e.target.id;//获取当前点击事件的元素

       console.log(ID);

       if (videoMap.get(ID) != null) {

           closeVideo(ID, videoMap.get(ID));

       } else {

           let camera = getCamera();

           console.log(camera);

           if (camera.type == "ys") {

               realViewYs("192.168.1.11", ID, camera.username, camera.password, camera.ipaddr, camera.port);

           } else if (camera.type == "dh") {

               realViewDh("192.168.1.11", ID, camera.username, camera.password, camera.ipaddr, camera.port);

           } else {

               realViewHik("112.98.126.2", ID, camera.username, camera.password, camera.ipaddr, camera.port);

           }

       }

   });

 

 

   //预览海康相机

   function realViewHik(serverip, elem, username, password, ipaddr, port) {

       webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":28000");

       let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/ch1/main/av_stream";

       let option = "rtptransport=tcp";

       console.log("rtsp地址:" + rtspUrl);

       webRtcServer.connect(rtspUrl, null, option, null);

       videoMap.set(elem, webRtcServer);

   }

 

   //预览大华相机

   function realViewDh(serverip, elem, username, password, ipaddr, port) {

       webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":8000");

       let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/cam/realmonitor?channel=1&subtype=0";

       let option = "rtptransport=tcp";

       console.log("rtsp地址:" + rtspUrl);

 

       webRtcServer.connect(rtspUrl, null, option, null);

       videoMap.set(elem, webRtcServer);

   }

 

   //预览宇视相机

   function realViewYs(serverip, elem, username, password, ipaddr, port) {

       webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":8000");

       let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/media/video1/multicast";

       console.log("rtsp地址:" + rtspUrl);

       let option = "rtptransport=tcp";

       webRtcServer.connect(rtspUrl, null, option, null);

       videoMap.set(elem, webRtcServer);

   }

 

   function closeVideo(id, webrtc) {

       webrtc.disconnect();

       videoMap.delete(id);

   }

 

   //页面退出时销毁

   // window.onbeforeunload = function () {

   //     alert("页面关闭");

   //     webRtcServer.disconnect();

   // }

   //页面离开或者浏览器关闭的时候触发

   window.onbeforeunload = function (event) {

       $.ajax({

           // url: "../getIp",

           url: "http://127.0.0.1:12344/ard/videocall",

           type: "post",

           contentType: "application/json",

           dataType: "json",

           data: JSON.stringify({"cmd": "close", "url": "https://anruida.app.zihai.shop/?id=zns&pass=ard"}),

           success: function (data) {

           }

       });

       webRtcServer.disconnect();

   };

 

</script>


局域网内访问相机视频就完成了。




目录
相关文章
|
Web App开发 Go API
RTSPtoWebRTC
RTSPtoWebRTC
974 0
|
网络协议 Linux
音视频学习之rtsp推拉流学习2(流媒体服务器ZLMediaKit)
音视频学习之rtsp推拉流学习2(流媒体服务器ZLMediaKit)
3079 0
|
编解码 前端开发 Java
大华相机接入web页面实现人脸识别
大华相机接入web页面实现人脸识别
768 0
|
JavaScript 前端开发 网络安全
Video.js实现在html页面播放rtmp流媒体
Video.js实现在html页面播放rtmp流媒体
2309 0
|
Web App开发 编解码 JavaScript
VUE播放RTSP方案,支持H.265!
VUE播放RTSP方案,支持H.265!如果你问一个前端技术人员,近几年最火的前端框架技术是什么,肯定会有人说VUE,确实VUE凭借其简单特性赢得了大家的喜爱,而近期公司有个项目,需要在VUE框架网页上播放RTSP实时视频。
2217 0
|
Web App开发 编解码 前端开发
VUE网页实时播放海康、大华摄像头RTSP视频流完全方案,300毫秒延迟,支持H.265、可多路同时播放
在遍地都是摄像头的今天,往往需要在各种信息化、数字化、可视化B/S系统中集成实时视频流播放等功能,海康、大华、华为等厂家摄像头或录像机等设备一般也都遵循监控行业标准,支持国际标准的主流传输协议RTSP输出,而Chrome、Firefox、Edge等新一代浏览器从2015年开始取消了NPAPI插件技术支持导致RTSP流无法直接原生播放了
4321 0
|
Web App开发 移动开发 编解码
浏览器播放RTSP视频流几种解决方案
Streamedian 提供了一种“html5_rtsp_player + websock_rtsp_proxy”的技术方案,可以通过html5的video标签直接播放RTSP的视频流。
2974 0
|
10月前
|
监控 Java 开发工具
Springboot秒集成-视频推拉流
在工作中需要用到视频的推拉流服务,刚开始准备使用netty服务自己实现RTSP推拉流服务,但在RTSP解包时卡住,自己实现难度确实有点大,后来在网上找到了Zlm4j库,它是基于ZLMediaKit服务实现的Jna版本,可以很容易的集成到Springboot中,在此也。希望本篇博客可以帮助到想快速实现视频推拉流服务的朋友。
1061 10
|
应用服务中间件 Linux nginx
FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作
这篇博客介绍了如何使用FFmpeg实现RTSP推流到RTMP服务器,并使用ffplay进行拉流操作,包括在Windows和Linux系统下的命令示例,以及如何通过HTML页面显示视频流。
4021 0
|
Web App开发 编解码 前端开发
electron+vue网页直接播放RTSP视频流?
目前大部分摄像头都支持RTSP协议,但是在浏览器限制,最新版的浏览器都不能直接播放RTSP协议,Electron 桌面应用是基于 Chromium 内核的,所以也不能直接播放RTSP,但是我们又有这个需求怎么办呢?
771 112