web播放rtsp流视频,使用webrtc毫秒级延迟

这篇具有很好参考价值的文章主要介绍了web播放rtsp流视频,使用webrtc毫秒级延迟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、zlmediakit环境搭建和编译

1)、下载zlmediakit

2)、安装依赖

3)、编译webrtc

4)、启动zlmediakit

二、播放webrtc视频

1)、动态添加拉流代理

2)、播放视频 

三、嵌入到自己的vue项目中。

1)、拷贝demo到自己的vue项目中

2)、mkcert生成证书


背景:需要在web应用中播放摄像头的rtsp流视频,并且延迟需要做到1秒以内。试过网上很多方法,都不能做到1秒内的延迟,可能有这种方案,只是我还没找到。所以我尝试了使用zlmediakit的webrtc功能进行播放。效果不错,视频画面很实时,目前只做了初步尝试,实际应用还需要研究。下面是我的步骤:

 系统:在ubuntu20.04和树莓派的raspberrypi系统都有尝试。

一、zlmediakit环境搭建和编译

1)、下载zlmediakit

#下载代码
git clone https://github.com/ZLMediaKit/ZLMediaKit.git
cd ZLMediaKit
#千万不要忘记执行这句命令
git submodule update --init

2)、安装依赖

  • gcc
#一般系统都会自带gcc,可以使用命令gcc -v 查看版本

#如果没有的话使用以下命令安装
sudo apt-get install build-essential
  • cmake
#先查看系统有没有已经安装
cmake --version

#没安装就使用以下命令安装
sudo apt-get install cmake
  • openssl
#首先查看是否已经安装
openssl version
#没安装使用以下命令安装
sudo apt-get install libssl-dev

3)、编译webrtc

  • 编译libsrtp
#依次执行以下命令
git clone https://gitee.com/mirrors/cisco-libsrtp.git
cd cisco-libsrtp
./configure --enable-openssl
make -j4
sudo make install
  •  编译Zlmediakit

回到zlmediakit目录下 

#依次执行以下命令
mkdir build
cd build
cmake -DENABLE_WEBRTC=on ../
cmake --build . --target MediaServer

 当进度变成100%就是编译完成了,可以看到目录下多了一个release目录。

webrtc播放rtsp,音视频,webrtc

4)、启动zlmediakit

cd release/linux/Debug
#通过-h可以了解启动参数
./MediaServer -h
#以守护进程模式启动
./MediaServer -d &

  建议先使用sudo ./MediaServer 启动,可以方便查看日志webrtc播放rtsp,音视频,webrtc

这时候zlmediakit已经启动了, 可以在浏览器输入虚拟机地址加上/webrtc访问webrtc播放demo

webrtc播放rtsp,音视频,webrtc

这时候还不能播放视频,需要将摄像头视频流注册到zlmediakit中,可以使用zlm的restful接口添加拉流代理,下面将有介绍。

二、播放webrtc视频

1)、动态添加拉流代理

在zlm官方文档中,有对restful接口的说明https://github.com/zlmediakit/ZLMediaKit/wiki/MediaServer%E6%94%AF%E6%8C%81%E7%9A%84HTTP-API

我们只需要使用这个动态添加拉流代理的接口即可

webrtc播放rtsp,音视频,webrtc

首先打开api工具,我这里使用的是apipost,当然还有其他的比如postman、apifox都是可以的。 

输入请求地址,发送的请求是post请求

webrtc播放rtsp,音视频,webrtc

根据文档中所需要填入的参数,我们这里将几个必选的参数加上,其中secret需要我们在配置文件中查看,打开/ZlmediaKit/release/linux/Debug目录,有一个config.ini文件,使用nano config.ini命令打开,可以看到secret的内容,我们将后面的字符串复制下来

webrtc播放rtsp,音视频,webrtc

在api工具中,我们在query里填入参数如下:

webrtc播放rtsp,音视频,webrtc

 secret就是我们刚刚获取的密钥。

vhost就填入运行zlm机器的ip就行。

app是流应用名,可以写live。

stream是流id,我们需要保证每个流id是唯一的,可以使用当前时间的时间戳,时间戳可以在ctool.dev中获取。

url为摄像头rtsp流地址,以海康摄像头为例,流地址组成格式为:rtsp://账号:密码@ip:554/h264/ch1/sub/av_stream,这里使用的是sub子码流,如果想用主码流换成main即可。

填写完成后点击发送,可以看到响应code为0,还响应了一个key,这个key就是我们拼接播放地址所需要的

webrtc播放rtsp,音视频,webrtc

2)、播放视频 

打开前面那个/webrtc/播放demo界面,将url中的ip和stream的值改成实际的值就可以点击开始播放了。

webrtc播放rtsp,音视频,webrtc

到此web中使用webrtc播放rtsp视频就结束了。下面我将介绍在自己的vue项目中播放的方法。

三、嵌入到自己的vue项目中。

1)、拷贝demo到自己的vue项目中

在release/linux/Debug目录下有一个www目录,进入后有一个webrtc目录,将里卖弄的index.html和ZLMRTCClient.js拷贝出来。

webrtc播放rtsp,音视频,webrtc

将ZLMRTCClient.js拷贝到自己的vue项目中,在文件的最下方加入

export {
	ZLMRTCClient
}

创建一个player.vue文件,将index.html文件中的内容拷贝到.vue文件下,根据自己的需求,将一些选项隐藏掉,将值改为固定的即可,文末我会给出我的player.vue完整代码。

因为webrtc是基于https协议的,我们还需要解决证书问题,这里我选用一个开源项目mckert来生成证书。

2)、mkcert生成证书

我这里使用windows本地开发的,所以直接在mkcert官网下载exe文件就可以。

https://github.com/FiloSottile/mkcert/releases

下载后将整个exe文件拖入终端命令行,加上-install,如下图

webrtc播放rtsp,音视频,webrtc

回车执行安装。

在工程下新建一个keys文件夹,进入到keys文件夹下,再次将exe拖入终端,执行如下命令

webrtc播放rtsp,音视频,webrtc

这时候keys文件夹下会生成两个文件

webrtc播放rtsp,音视频,webrtc

我使用的是vite搭建的vue项目,所以我在vite.config.js中配置以下内容

server:{
    https:{
        key: 'keys/localhost+1-key.pem',
        cert: 'keys/localhost+1.pem',
    }
}

重启系统便可以看到访问地址变成了https开头

webrtc播放rtsp,音视频,webrtc

这时候便可以在你的项目中播放摄像头rtsp视频流了。

下面是我的player.vue代码,写的比较粗糙,凑合用。我只保留了输入url和开始停止按钮。手动输入正确的url点击开始就可以播放了。文章来源地址https://www.toymoban.com/news/detail-757309.html

<template>
  <div class="play-content">
    <div>
      <video id="video" controls autoplay style="text-align: left;width: 60%;">
        Your browser is too old which doesn't support HTML5 video.
      </video>
    </div>
    <div>
      <p>
        <label for="streamUrl">url:</label>
        <input
          type="text"
          style="co"
          v-model="PlayUrl"
          id="streamUrl"
        />
      </p>
      <button @click="start()">开始(start)</button>
      <button @click="stop()">停止(stop)</button>
    </div>
  </div>
</template>

<script setup>
import {ZLMRTCClient} from '../../utils/ZLMRTCClient'
import {ref}from 'vue'

var player = null
var recvOnly = false
var resArr = []

var ishttps = 'https:' == document.location.protocol ? true : false
var isLocal = 'file:' == document.location.protocol ? true : false
var url =
  document.location.protocol +
  '//' +
  window.location.host +
  '/index/api/webrtc?app=live&stream=test&type=play'
if (!ishttps && !isLocal) {
  alert(
    '本demo需要在https的网站访问 ,如果你要推流的话(this demo must access in site of https if you want push stream)'
  )
}
if (isLocal) {
  url = 'http://127.0.0.1' + '/index/api/webrtc?app=live&stream=test&type=play'
}
// document.getElementById('streamUrl').value = url
const PlayUrl = ref(url)

const start_play = () => {
  let h = 720
  let w = 1280

  player = new ZLMRTCClient.Endpoint({
    element: document.getElementById('video'), // video 标签
    debug: true, // 是否打印日志
    zlmsdpUrl: document.getElementById('streamUrl').value, //流地址
    simulcast: false,
    useCamera: true,
    audioEnable: true,
    videoEnable: true,
    recvOnly: recvOnly,
    resolution: { w: w, h: h },
    usedatachannel: false
  })

  player.on(ZLMRTCClient.Events.WEBRTC_ICE_CANDIDATE_ERROR, function (e) {
    // ICE 协商出错
    console.log('ICE 协商出错')
  })

  player.on(ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS, function (e) {
    //获取到了远端流,可以播放
    console.log('播放成功', e.streams)
  })

  player.on(ZLMRTCClient.Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED, function (e) {
    // offer anwser 交换失败
    console.log('offer anwser 交换失败', e)
    stop()
  })


  player.on(ZLMRTCClient.Events.CAPTURE_STREAM_FAILED, function (s) {
    // 获取本地流失败

    console.log('获取本地流失败')
  })

  player.on(ZLMRTCClient.Events.WEBRTC_ON_CONNECTION_STATE_CHANGE, function (state) {
    // RTC 状态变化 ,详情参考 https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/connectionState
    console.log('当前状态==>', state)
  })

  player.on(ZLMRTCClient.Events.WEBRTC_ON_DATA_CHANNEL_OPEN, function (event) {
    console.log('rtc datachannel 打开 :', event)
  })

  // player.on(ZLMRTCClient.Events.WEBRTC_ON_DATA_CHANNEL_MSG, function (event) {
  //   console.log('rtc datachannel 消息 :', event.data)
  //   document.getElementById('msgrecv').value = event.data
  // })
  player.on(ZLMRTCClient.Events.WEBRTC_ON_DATA_CHANNEL_ERR, function (event) {
    console.log('rtc datachannel 错误 :', event)
  })
  player.on(ZLMRTCClient.Events.WEBRTC_ON_DATA_CHANNEL_CLOSE, function (event) {
    console.log('rtc datachannel 关闭 :', event)
  })
}

const start = () => {
  stop()

  let h = 720
  let w = 1280

  if (!recvOnly) {
    ZLMRTCClient.isSupportResolution(w, h)
      .then((e) => {
        start_play()
      })
      .catch((e) => {
        alert('not support resolution')
      })
  } else {
    start_play()
  }
}
const stop = () => {
  if (player) {
    player.close()
    player = null
    var remote = document.getElementById('video')
    if (remote) {
      remote.srcObject = null
      remote.load()
    }

  }
}
</script>

<style scoped>
.play-content{
  background-color: black;
  border: red 1px solid;
  width: 100%;
  height: 100%;
  color: white;
}
</style>

到了这里,关于web播放rtsp流视频,使用webrtc毫秒级延迟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP

    一对一音视频通话使用场景 一对一音视频通话都需要稳定、清晰和流畅,以确保良好的用户体验,常用的使用场景如下: 社交应用 :社交应用是一种常见的使用场景,用户可以通过音视频通话进行面对面的交流; 在线教育: 老师和学生可以通过音视频通话功能进行实时互

    2024年02月13日
    浏览(52)
  • 【音视频处理】RTMP、HLS、HTTP-FLV、WebRTC、RTSP的区别?直播协议详解

      大家好,欢迎来到停止重构的频道。 本期我们详细讨论 直播的相关协议 ,包括:HTTP-FLV、HLS、RTMP、Web-RTC、RTSP等等。 我们将会详细介绍这些协议的工作原理、应用场景、及延迟的原因。 我们按这样的顺序讨论​ 1、  RTMP、HTTP-FLV  2、  HLS  3、  Web-RTC  4、  RTSP  RTM

    2024年02月02日
    浏览(48)
  • WebRTC音视频采集和播放示例及MediaStream媒体流解析

    示例代码——同时打开摄像头和麦克风,并在页面显示画面和播放捕获的声音 API解析 mediaDevices MediaStream媒体流 代码 效果 1. mediaDevices mediaDevices 是 Navigator 只读属性,返回一个 MediaDevices 对象,该对象可提供对相机和麦克风等媒体输入设备的连接访问,也包括屏幕共享。 语法

    2023年04月08日
    浏览(40)
  • VUE+webrtc-streamer实现实时视频播放(监控设备-rtsp)

    首先说明目前我只完成了本地测试,因还没确定技术选型所以暂无项目应用,先做一下储备,后续项目应用的话这篇文章会持续更新。 监控设备播放效果如下:基于公司环境测试了大华和海康的监控设备(H264编码)可以正确播放 1、下载webrtc-streamer,本机测试我下载的最新

    2024年02月01日
    浏览(39)
  • VUE+webrtc-streamer 实现实时视频播放(监控设备-rtsp)

    下图则启动成功,此时在浏览器访问127.0.0.1:8000可以看到本机监控画面 地址:https://github.com/mpromonet/webrtc-streamer/releases 注意:第三步在本机启动服务所以 new WebRtcStreamer(id,serverUrl)中URL传入127.0.0.1端口可 文章参考链接:https://blog.csdn.net/liona_koukou/article/details/126605137

    2024年02月02日
    浏览(57)
  • 【Vue2 + webrtc-steamer】rtsp流在Web端实时播放

    操作系统:Win10 vue版本:vue2 必须将rtsp通过 播放器插件/服务器/… 转换为 flv/webrtc/… 最新在线可用rtsp码流地址(可用 flv播放器 测试): rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 rtmp地址 rtmp://ns8.indexforce.com/home/mystream https地址 : MP4 : https://baikevideo.cdn.bcebos.com/med

    2024年02月02日
    浏览(41)
  • 怎样使用ovsyunlive在web网页上直接播放rtsp/rtmp视频

    业务中需要在网页中直接播放rtsp和rtmp视频,多方比较测试发现ovsyunlive的播放器能直接播放rtsp/rtmp视频,还是非常方便简洁,使用过程如下: 1,Windows系统在github上面下载ovsyunlive绿色包下载解压。 github地址:https://github.com/ccallcn/ovsyunlive 详细使用详见说明 2,启动前修改ovs

    2024年02月02日
    浏览(40)
  • VUE3+TS+VITE+webrtc-streamer实现实时视频播放(监控设备-rtsp,进来保你成)

    目录 1、下载webrtc-streamer,下载最新window版本  2、解压下载包  3、双击webrtc-streamer.exe启动服务  4、引入webrtc-streamer         1、将下载包中html文件夹下webrtcstreamer.js文件和html/libs文件夹下adapter.min.js文件复制到VUE项目public目录下 2、在index.html文件里引入这两个js文件 5、使

    2024年02月05日
    浏览(41)
  • WebRTC音视频通话-WebRTC本地视频通话使用ossrs服务搭建

    iOS开发-ossrs服务WebRTC本地视频通话服务搭建 之前开发中使用到了ossrs,这里记录一下ossrs支持的WebRTC本地服务搭建。 ossrs是什么呢? SRS(Simple Realtime Server)是一个简单高效的实时视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT等多种实时流媒体协议。 官网地址:https://ossrs.net/lt

    2024年02月12日
    浏览(46)
  • WebRTC实战-第二章-使用WebRTC实现音视频通话

    、 什么是WebRTC|WebRTC入门到精通必看|快速学会音视频通话原理|WebRTC超全资料分享FFmpeg/rtmp/hls/rtsp/SRS WebRTC **WebRTC详细指南** http://www.vue5.com/webrtc/webrtc.html WEBRTC三种类型(Mesh、MCU 和 SFU)的多方通信架构 WebRTC API包括媒体捕获,音频和视频编码和解码,传输层和会话管理 。 假设

    2023年04月12日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包