播放海康摄像头直播流使用笔记

1、将海康摄像头绑定到萤石云平台,并查看直播流

2、项目中使用

1、安装hls

javascript 复制代码
cnpm i hls.js 

2、封装组件(在components文件夹下新建bodyCapture文件夹下index.vue)

html 复制代码
<template>
  <el-dialog
    title="遗体抓拍"
    class="body_capture_dialog"
    :visible.sync="$parent.bodyCaptureDialogVisible"
    width="70%"
    @closed="handleClose"
  >
    <el-row v-loading="loading">
      <div class="container">
        <div class="video_box">
          <video :controls="false" id="video" :muted="true" :autoplay="true">
            <source type="application/x-mpegURL" />
          </video>
        </div>

        <!-- <div class="preview-box">
        <img v-if="imgUrl" width="550" :src="imgUrl" alt="" />
        <span v-else>截图预览</span>
      </div> -->
      </div>
    </el-row>
    <span slot="footer" class="dialog-footer">
      <!-- <el-button @click="dialogVisible = false">取 消</el-button> -->
      <el-button type="primary" @click="handleScreenshot">抓 拍</el-button>
    </span>
  </el-dialog>
</template>

<script>
import axios from "axios";
import store from "@/store";
import { getToken } from "@/utils/auth";
import HLS from "hls.js";
let hls = new HLS();

export default {
  name: "bodyCapture",
  data() {
    return {
      imgUrl: "",
      loading: false,
    };
  },
  props: {
    businessCode: {
      type: String,
      default: "",
    },
  },
  mounted() {
    this.$nextTick(() => {
      this.start();
    });
  },
  methods: {
    handleClose() {
      this.$parent.bodyCaptureDialogVisible = false;
    },
    //点击播放
    start() {
      this.loading = true;
      if (HLS.isSupported()) {
        let video = document.getElementById("video");
        hls.attachMedia(video);
        hls.loadSource(
          "https://open.ys7.com/v3/openlive/F6****38_1_1.m3u8?expire=***&id=*******&t=e******2bec967e593dc9eca&ev=100"
        );
        hls.on(HLS.Events.MANIFEST_PARSED, () => {
          video.play();
          this.loading = false;
          console.log("加载成功");
        });
        hls.on(HLS.Events.ERROR, (event, data) => {
          console.log("加载失败");
        });
      }
    },
    // 截图
    handleScreenshot() {
      let video = document.getElementsByTagName("video")[0]; // 获取video节点
      let canvas = document.createElement("canvas"); // 创建canvas节点
      let w = window.innerWidth;
      let h = (window.innerWidth / 16) * 9;
      canvas.width = w;
      canvas.height = h; // 设置宽高
      const ctx = canvas.getContext("2d");
      ctx.drawImage(video, 0, 0, w, h); // video写入到canvas
      console.log(canvas.toDataURL("image/png"), "截图");
      this.imgUrl = canvas.toDataURL("image/png"); // 生成截图地址
      this.updatePhoto(this.imgUrl);
    },
    //上传
    updatePhoto(imgUrl) {
      //数据
      let postdata = {
        businessCode: this.businessCode,
        documentTypeCode: 1,
      };
      let formData = {
        data: postdata,
      };
      let url = imgUrl.split(";base64,")[1];
      formData.certificatesImageFile = url;
      //文件上传,传输地址加上api,路径修改为全路径,因此前面要加/api
      axios({
        method: "post",
        baseURL: ROOT,
        withCredentials: true,
        timeout: 5000,
        url: "/api/photo-archival/save-photo-archival",
        headers: {
          "Content-Type": "application/json",
          token: store.getters.token ? getToken() : null,
        },
        data: formData,
      })
        .then((res) => {
          const { data } = res;
          if (data && data.code == 1) {
            this.$message.success("上传成功");
            this.handleClose();
          } else if (data && data.message) {
            this.$message(data.message);
            return;
          }
        })
        .catch((error) => {
          this.$message(error);
        });
    },
  },
};
</script>

<style lang="scss" scoped>
.container {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  .video_box {
    width: 100%;
    height: 720px;
  }
}
</style>

3、组件使用

html 复制代码
<el-button
          type="primary"
          @click="bodyCapture()"
          v-if="businessCode"

        >遗体抓拍
        </el-button>
<!-- 遗体抓拍 -->
<BodyCapture :businessCode="businessCode" v-if="bodyCaptureDialogVisible" />

data:(){
 return {
      bodyCaptureDialogVisible:false,
    }
},
 methods: {
    //遗体抓拍点击
    bodyCapture(){
      this.bodyCaptureDialogVisible=true
    },
}

tips:海康摄像机解绑https://sms.hikvision.com/dmBuC1

相关推荐
使一颗心免于哀伤17 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
_落纸3 天前
三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
笔记
Alice-YUE3 天前
【CSS学习笔记3】css特性
前端·css·笔记·html
2303_Alpha3 天前
SpringBoot
笔记·学习
Hello_Embed3 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中3 天前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Grassto3 天前
RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
笔记
Magnetic_h3 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
周周记笔记3 天前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅3 天前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin