| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <template>
- <!-- 可视监控详情 -->
- <view class="page-panel">
- <!-- 监控区域 -->
- <view class="monitor-area">
- <view class="video-js" ref="video" style="width: 100%;height:510rpx;"></view>
- </view>
- <!-- 监控工具 -->
- <!-- <view class="monitor-tools">
- <view class="row-center tools-btn" @click="controlDirection(8)">
- <text>+</text>
- </view>
- <view class="tools-control">
- <view class="slice up" @click="controlDirection(0)"></view>
- <view class="slice down" @click="controlDirection(1)"></view>
- <view class="slice left" @click="controlDirection(2)"></view>
- <view class="slice right" @click="controlDirection(3)"></view>
- <view class="tools-btn"></view>
- </view>
- <view class="row-center tools-btn" @click="controlDirection(9)">
- <text>━</text>
- </view>
- </view> -->
- </view>
- </template>
- <script>
- import {
- getCameraAddress,
- controlCamera
- } from '@/api/camera.js'
- export default {
- data() {
- return {
- deviceId: '', // 设备号
- // 播放地址
- cameraAddress: '',
- playerVideo: null,
- // 控制参数
- controlParams: {
- device_id: '', //设备号
- ctrl: 'move', //move 控制球机转动 stop 停止球机转动, 转动后需调用停止接口,不然会造成球机一直转
- movenum: 0, // 0-上,1-下,2-左,3-右,8-放大,9-缩小
- }
- };
- },
- onLoad(options) {
- this.deviceId = options.id;
- this.controlParams.device_id = options.id;
- },
- onUnload() {
- if (this.playerVideo) {
- this.playerVideo.dispose();
- }
- },
- async onReady() {
- await this.getCameraAddress();
- let video = document.createElement('video');
- video.id = 'video';
- video.style = 'width: 100%; height:510rpx;';
- video.controls = true;
- video.preload = "auto"
- video.setAttribute('playsinline', true) //IOS微信浏览器支持小窗内播放
- video.setAttribute('webkit-playsinline', true) //这个bai属性是ios 10中设置可以让视频在小du窗内播放,也就是不是全zhi屏播放的video标签的一个属性
- video.setAttribute('x5-video-player-type', 'h5') //安卓 声明启用同层H5播放器 可以在video上面加东西
- let source = document.createElement('source');
- source.src = this.cameraAddress;
- video.appendChild(source);
- this.$refs.video.$el.appendChild(video);
- let that = this;
- this.playerVideo = this.$video('video', {
- poster: '', // 视频封面图地址
- title: '4564564',
- playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
- autoDisable: true,
- preload: 'none', //auto - 当页面加载后载入整个视频 meta - 当页面加载后只载入元数据 none - 当页面加载后不载入视频
- language: 'zh-CN',
- fluid: true, // 自适应宽高
- muted: false, // 是否静音
- aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
- controls: true, //是否拥有控制条 【默认true】,如果设为false ,那么只能通过api进行控制了。也就是说界面上不会出现任何控制按钮
- autoplay: true, //如果true,浏览器准备好时开始回放。 autoplay: "muted", // //自动播放属性,muted:静音播放
- loop: true, // 导致视频一结束就重新开始。 视频播放结束后,是否循环播放
- screenshot: true,
- controlBar: {
- volumePanel: { //声音样式
- inline: false // 不使用水平方式
- },
- timeDivider: true, // 时间分割线
- durationDisplay: true, // 总时间
- progressControl: true, // 进度条
- remainingTimeDisplay: true, //当前以播放时间
- fullscreenToggle: true, //全屏按钮
- pictureInPictureToggle: true, //画中画
- }
- }, function() {
- this.on('error', function(err) { //请求数据时遇到错误
- console.log("请求数据时遇到错误", err)
- });
- this.on('stalled', function(stalled) { //网速失速
- console.log("网速失速", stalled)
- });
- });
- },
- methods: {
- // 获取监控播放地址
- async getCameraAddress() {
- let res = await getCameraAddress({
- device_id: this.deviceId
- });
- let address = eval("(" + res + ")")
- console.log(address.hls);
- this.cameraAddress = address.hls;
- },
- // 控制摄像机
- async controlDirection(movenum) {
- this.controlParams.movenum = movenum;
- this.controlParams.ctrl = 'move'
- let res = await controlCamera(this.controlParams);
- if (!res.data) {
- return;
- }
- this.controlParams.ctrl = 'stop'
- await controlCamera(this.controlParams);
- }
- }
- }
- </script>
- <style lang="scss">
- // 监控区域
- .monitor-area {
- overflow: hidden;
- height: 510rpx;
- border-radius: 5rpx;
- margin-bottom: 24rpx;
- }
- .monitor-tools {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 24rpx;
- }
- .tools-control {
- position: relative;
- width: 305rpx;
- height: 305rpx;
- margin: 0 60rpx;
- background-image: linear-gradient(to right, #323e4d, #444d5e);
- border-radius: 100%;
- .tools-btn {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- margin: auto;
- }
- .slice {
- position: absolute;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 97rpx;
- height: 97rpx;
- margin: auto;
- &:before {
- content: '';
- display: block;
- width: 0;
- margin-right: -24rpx;
- border-color: transparent transparent transparent $color-primary;
- border-width: 24rpx;
- border-style: solid;
- transform: scaleY(0.6);
- }
- &:active {
- opacity: .3;
- }
- }
- .up {
- top: 0;
- left: 0;
- right: 0;
- transform: rotateZ(-90deg);
- }
- .down {
- bottom: 0;
- left: 0;
- right: 0;
- transform: rotateZ(90deg);
- }
- .left {
- top: 0;
- bottom: 0;
- left: 0;
- transform: rotateZ(180deg);
- }
- .right {
- top: 0;
- bottom: 0;
- right: 0;
- }
- }
- .tools-btn {
- width: 110rpx;
- height: 110rpx;
- font-size: 40rpx;
- font-weight: bold;
- color: $color-primary;
- line-height: 1;
- background: #434C5D;
- border-radius: 100%;
- &:active {
- text {
- opacity: .3;
- }
- }
- }
- </style>
|