草庐IT

vue中实现视频直播(萤石云)/实时视频:

Sun Peng 2023-04-12 原文

文章目录


法一:使用ezuikit-js插件(accessToken+url)

适用情况:

1. 安装
  npm install ezuikit-js --save
2. 使用:
<template>
	<div id="video-container"></div>
</template>

<script>
import  EZUIKit from 'ezuikit-js';
export default {
    name: '',
    data() {
        return {
        	player:null,
        }
    },
    created(){
    	this.getVideoData()
    },
    methods:{
    	getVideoData(){
    		....
    		this.player = new EZUIKit.EZUIKitPlayer({
     			id: 'video-container', // 视频容器ID
     			accessToken: 'at.3bvmj4ycamlgdwgw1ig1jruma0wpohl6-48zifyb39c-13t5am6-yukyi86mz',
   				url: 'ezopen://open.ys7.com/203751922/1.live',
   				audio: 0, // 是否默认开启声音 0 - 关闭 1 - 开启
   				autoplay: true,
                width: 408,
                height: 237
			})
    	},
    },
    beforeDestroy() {
        this.player && this.player.stop() //销毁并停止直播视频
    }
}
</script>
3.初始化时可传参数:
参数名类型描述是否必选
idString播放器容器DOM的idY
accessTokenString授权过程获取的access_tokenY
urlString视频ezopen协议播放地址Y
audioint是否默认开启声音 1:打开(默认) 0:关闭N
widthint视频宽度,默认值为容器容器DOM宽度N
heightint视频高度,默认值为容器容器DOM高度N
templetestring播放器模板,可以通过选定模板,使用内置的播放器样式,组件 simple:极简版;standard:标准版;security:安防版(预览回放);vioce:语音版N
headerArray视频头部可选UI组件,可选值:capturePicture:截图,save:录像保存,zoom:电子放大N
footerArray视频底部部可选UI组件,可选值:talk:对讲,broadcast:语音播报,hd:高清标清切换,fullScreen:全屏N
pluginArray按需加载插件,可选值: talk:对讲N
handleSuccessfunction播放成功回调N
handleErrorfunction播放错误回调N
openSoundCallBackfunction开启声音回调N
closeSoundCallBackfunction关闭回调N
startSaveCallBackfunction开始录像回调N
stopSaveCallBackfunction结束录像回调N
capturePictureCallBackfunction截图回调N
fullScreenCallBackfunction全屏回调N
getOSDTimeCallBackfunction获取OSD时间回调N
4.可调用的方法:
方法名类型描述使用示例
playfunction开始播放player.play()
stopfunction结束播放player.stop()
openSoundString开启声音player.openSound()
closeSoundString关闭声音player.closeSound()
startSaveint开始录像player.startSave()
stopSaveint结束录像player.stopSave()
capturePicturefunction视频截图player.capturePicture()
fullScreenfunction全屏player.fullScreen()
getOSDTimefunction获取播放时间回调player.getOSDTime()
startTalkfunction开始对讲player.startTalk()
stopTalkfunction结束对讲player.stopTalk()
5.萤石云:

官网

开发文档

使用方法

6.最终效果:

法二:使用ezuikit.js文件(链接)

优点:不需要做控件按钮功能

适用情况:

1、官网下载js包

https://open.ys7.com/mobile/download.html

资源地址:https://download.csdn.net/download/weixin_53791978/86512096

2、(把下载好的ezuikit.js js包)放进vue 的 static 下

这里报错ezuikit is not undefined,就放到public下

3、public在index.html引入
<script src="static/ezuikit.js"></script>
4、使用:
<video id="videoCamera"
     style="object-fit: fill; width: 100%; height: 100%; background: #000;"
     :src="formData.videoCamera" autoplay="true" controls playsInline webkit-playsinline>
</video>  //记得给宽高

<script>
export default{
	data(){
		return{
			formData:{},
			palyer:null,// 页面跳转时注意关闭视频流,vue跳转原有任务不会停止或者在beforeDestroy销毁掉
		}
	},
	mounted(){
	
	},
	methods:{
		//获取播放地址
        getVideoCameraAddr(id, index) {
            const This = this
            let param = {
                id: id
            }
            videoCameraAddr(param).then(res => {
                if (res.data.code == 0) {
                        This.formData.videoCamera = res.data.data
                        This.palyer = null
                        setTimeout(function () {
                            This.player = new EZUIKit.EZUIPlayer('videoCamera')
                        }, 0)
                } else {
                    This.$message.error('获取视频监控摄相机播放地址失败' + res.data.msg)
                }
            })
        },
	},
	beforeDestroy(){
		this.palyer = null
	}
}
</script>

法三:后端只给设备号

相关JS文件:https://download.csdn.net/download/weixin_53791978/87231692

<section class="sectionVideo">
  <div class="video_warp_item" v-for="(item, index) in liveAddress" :key="index">
     <video :id=item.tdh :src="item.url" autoplay muted controls playsInline webkit-playsinline></video>
  </div>
</section>
<script>
import { videoCameraId } from '@/api/manage/videoAPI.js'
import $ from 'jquery'  //  npm i jquery


export default {
    name: 'dashboard',
    data() {
        return {
            accessToken: '',
            liveAddress: [],
            diveType: '',
            players: [],
        }
    },
    methods: {
        // 获取磅点摄像头ID列表
        getbagndianID() {
            const This = this

            // 获取萤石云的accessToken
            $.ajax({
                "url": 'https://open.ys7.com/api/lapp/token/get',
                "type": 'POST',
                "dataType": "json",
                "data": {
                    appKey: '412f919adde14fe3af396d5bef2c6db1', //String	appKey	Y
                    appSecret: '7566546bfc7adc4f55b86af93703599c' //	String	appSecret	Y
                },
                "cache": false,
                "success": function (response) {
                    This.accessToken = response.data.accessToken;
                }
            })

            let param = {
                deptId: This.formData.deptId,
                stationId: This.formData.stationId,
                pageNum: "1", //	string	true	当前页数
                pageSize: "100", //	string	true	每页条数
            }
            videoCameraId(param).then(res => {
                if (res.success) {
                    // 根据列表长度获取播放地址
                    if (res.result.list.length <= 0) {
                        This.$message.error('暂无数据,磅点摄相机列表为空' + res.data.msg)
                    } else {
                        res.result.list.forEach((item, index) => {
                            this.getDeviceInfo(item.id, index, item.deviceNumber, This.accessToken);
                        })
                    }
                } else {
                    This.$message.error('获取视频监控摄相机ID列表失败' + res.data.msg)
                }
            })
        },
        // 查询设备类型
        getDeviceInfo(id, indexer, deviceNum, accessToken) {
            const that = this
            $.ajax({
                "url": 'https://open.ys7.com/api/lapp/device/info',
                "header": {
                    'Content-Type': 'application/x-www-form-urlencoded'
                },
                "type": 'POST',
                "dataType": "json",
                "data": {
                    accessToken: accessToken, //	String	授权过程获取的access_token	Y
                    deviceSerial: deviceNum, // G66585615  J29276929
                },
                "success": function (res) {
                    if (res.code == 200) {
                        if (res.data.model.indexOf('IPC') >= 0) { //摄像机
                            this.diveType = 1;
                            that.liveAddress = []
                            this.getUrl(accessToken, deviceNum, 1);
                            setTimeout(() => {
                                if (that.liveAddress.length > 0) {
                                    that.players = [];
                                    that.liveAddress.forEach((item, i) => {
                                        let player = new EZUIKit.EZUIPlayer(item.tdh)
                                        that.players.push(player);
                                    })
                                }
                            }, 500)
                        } else { //录像机
                            this.diveType = 2;
                            let tdS = [];
                            // 获取设备通道号
                            $.ajax({
                                "url": 'https://open.ys7.com/api/lapp/device/camera/list',
                                "header": {
                                    'Content-Type': 'application/x-www-form-urlencoded' //multipart/form-data text/plain
                                },
                                "type": 'POST',
                                "dataType": "json",
                                "data": {
                                    accessToken: accessToken, //	String	授权过程获取的access_token	Y
                                    deviceSerial: deviceNum
                                },
                                "success": function (response) {
                                    response.data.forEach((item) => {
                                        if (item.status == 1) { tdS.push(item) }
                                    })
                                    that.liveAddress = []
                                    tdS.forEach((item) => {
                                        that.getUrl(accessToken, deviceNum, item.channelNo);
                                    })
                                    setTimeout(() => {
                                        if (that.liveAddress.length > 0) {
                                            that.players = [];
                                            that.liveAddress.forEach((item, i) => {
                                                let player = new EZUIKit.EZUIPlayer(item.tdh)
                                                that.players.push(player);
                                            })
                                        }
                                    }, 500)
                                }
                            })
                        }
                    }
                },
            });
        },
        // 获取视频播放地址
        getUrl(accessToken, id, typeId) {
            const that = this
            $.ajax({
                "url": 'https://open.ys7.com/api/lapp/v2/live/address/get',
                "type": 'POST',
                "data": {
                    accessToken: accessToken, //	String	授权过程获取的access_token	Y
                    deviceSerial: id,
                    protocol: 2,
                    channelNo: typeId,
                },
                "dataType": "json",
                "success": function (res) {
                    let item = {
                        tdh: 'm' + res.data.id,
                        url: res.data.url
                    }
                    that.liveAddress.push(item)
                }
            })
        },
    },
    //销毁视频
    destroyed() {
        for (var j = 0; j < this.players.length; j++) {
            this.players[j].stop();
        }
    }
}
</script>

有关vue中实现视频直播(萤石云)/实时视频:的更多相关文章

  1. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  2. ruby-on-rails - 如何在 Ruby on Rails 中实现无向图? - 2

    我需要在RubyonRails中实现无向图G=(V,E)并考虑构建一个Vertex和一个Edge模型,其中Vertex有_多条边。由于边恰好连接两个顶点,您将如何在Rails中执行此操作?您是否知道任何有助于实现此类图表的gem或库(对重新发明轮子不感兴趣;-))? 最佳答案 不知道有任何现有库在ActiveRecord之上提供图形逻辑。您可能必须实现自己的Vertex、EdgeActiveRecord支持的模型(请参阅Rails安装的rails/activerecord中的vertex.rb和edge.rb/test/fixtur

  3. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  6. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  7. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  8. ruby - 在 Ruby 中实现 to_int 和 to_str 的后果 - 2

    我haveaclass它公开了一个字符串值和一个int值(分别是命令输出和退出代码)。除了通过to_s和to_i公开它们之外,我还使用to_str和to_int,如下所示:classStatusdefto_s@outputendalias:to_str:to_sdefto_i@status.exitstatusendalias:to_int:to_iend我的想法是能够在尽可能多的情况下使用这个对象。将其强制转换为字符串或整数会增加可用性。例如,我可以将对象与字符串连接起来:a_string="Outputwas:"+results(我想用这个作为int强制转换的例子,但是Fixnum

  9. ruby - 在 Ruby 中实现二叉树 - 2

    我一直在尝试在Ruby中实现BinaryTree类,但我得到了stackleveltoodeep错误,尽管我似乎没有在该特定代码段中使用任何递归:1.classBinaryTree2.includeEnumerable3.4.attr_accessor:value5.6.definitialize(value=nil)7.@value=value8.@left=BinaryTree.new#stackleveltoodeephere9.@right=BinaryTree.new#andhere10.end11.12.defempty?13.(self.value==nil)?true:

  10. ruby - 如何在 Ruby 中实现私有(private)内部类 - 2

    来自Java,我正在尝试在Ruby中实现LinkedList。我在Java中实现它的通常方法是有一个名为LinkedList的类和一个名为Node的私有(private)内部类,其中LinkedList的每个对象都作为Node对象。classLinkedListprivateclassNodeattr_accessor:val,:nextendend我不想将Node类暴露给外部世界。然而,通过Ruby中的这个设置,我可以使用这个访问LinkedList类之外的私有(private)Node类对象-node=LinkedList::Node.new我知道,在Ruby1.9中,我们可以使用

随机推荐