怎么把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
616 0
|
网络协议 Linux
音视频学习之rtsp推拉流学习2(流媒体服务器ZLMediaKit)
音视频学习之rtsp推拉流学习2(流媒体服务器ZLMediaKit)
2124 0
|
JavaScript 前端开发 网络安全
Video.js实现在html页面播放rtmp流媒体
Video.js实现在html页面播放rtmp流媒体
1957 0
|
Web App开发 应用服务中间件 Go
尝鲜:如何搭建一个简单的webrtc服务器
前几天我一朋友问我有关webrtc的事,简单了解了下相关知识,搭建了一个webrtc的服务,以及经历的各种踩坑事件,感觉踩坑主要是Python、Node、OpenSSL等版本问题和证书问题导致。本来以为很简单的搭建,但在搭建的过程中遇到各种阻碍,写一篇文章梳理一下。
13296 0
|
5月前
|
监控 Java 开发工具
Springboot秒集成-视频推拉流
在工作中需要用到视频的推拉流服务,刚开始准备使用netty服务自己实现RTSP推拉流服务,但在RTSP解包时卡住,自己实现难度确实有点大,后来在网上找到了Zlm4j库,它是基于ZLMediaKit服务实现的Jna版本,可以很容易的集成到Springboot中,在此也。希望本篇博客可以帮助到想快速实现视频推拉流服务的朋友。
611 11
|
监控 Java Linux
Jetson 学习笔记(十二):CSI摄像头实现rtsp流的传输并对动态获取多路流进行探索
本文是关于如何在Jetson设备上使用CSI摄像头实现RTSP流传输的详细教程,包括安装依赖、编译gst-rtsp-server、测试、源代码介绍以及如何动态获取多路流的RTSP服务器。
1083 2
Jetson 学习笔记(十二):CSI摄像头实现rtsp流的传输并对动态获取多路流进行探索
|
应用服务中间件 Linux nginx
FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作
这篇博客介绍了如何使用FFmpeg实现RTSP推流到RTMP服务器,并使用ffplay进行拉流操作,包括在Windows和Linux系统下的命令示例,以及如何通过HTML页面显示视频流。
3179 0
|
Web App开发 移动开发 编解码
浏览器播放RTSP视频流几种解决方案
Streamedian 提供了一种“html5_rtsp_player + websock_rtsp_proxy”的技术方案,可以通过html5的video标签直接播放RTSP的视频流。
2130 0
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
3318 6
|
Web App开发 移动开发 前端开发
web端实现rtsp实时推流视频播放可行性方案
总之,要在Web端实现RTSP实时推流视频播放,需要使用适当的前端技术(如HTML5 Video或WebRTC),以及媒体服务器或流转换器来处理RTSP流。这需要一些开发和配置工作,但是可以实现实时视频流的播放。具体的实现方案可能会根据您的需求和技术栈而有所不同,所以需要仔细评估和选择适合您的解决方案。
2487 0