video-time-slider,用于IVR视频回播的时间选择插件

用于IVR视频回播的时间选择插件,刻度尺的实现参考了vue语法css实现刻度尺,为项目微信小程序制作。基于uni-app开发。目前没找到类似的插件,所以才动手实现了一个,是不是做视频的同行太少了,还是你们太低调了

其实这个可以做成前端通用组件的,因为本人项目只在微信小程序使用此插件,就先做成小程序版本了,其它平台没试过,但是估计都能用。

live-player 配合使用,播放视频挺流畅的。

功能

  • 24小时刻度尺,30分钟分隔
  • 有录像的时间段在刻度尺上标识(支持多个时间段)
  • 回传刻度无录像时间段时间值、刻度有录像时间段时间值(用于接口获取播放视频)
  • 目前刻度尺返回值精确到秒
  • 自动回滚最后有录像时间段

效果图

在这里插入图片描述
在这里插入图片描述

有录像的时间段在刻度尺上标识(支持多个时间段)实现思路

(纯粹记录下,怕自己忘记了,肯定会忘记的)

传参是以时间段的方式,每段录像的开始时间、结束时间为一组。以开始时间、结束时间在刻度尺上的位置,渲染一段带颜色的view,就能实现多个时间段在刻度尺上的标识。

代码实现思路

处理渲染用的开始时间、结束时间数组,形成新的时间段,每个时间段由以下3个元素组成:

1、开始时间位置距(0点)距离,这里代号a

以0点为原点,找到开始时间在刻度尺上的位置,算法在utils.js文件的dateToGrid方法里。难点主要是24小时刻度尺上px长度和真实时间之间的转换。

t1算出开始时间的位置在刻度尺上占多少px格子,然后乘每个格子的宽度,就得到开始时间位置距原点距离poi

let poi = t1 * this.single
2、时间段在刻度尺上的长度,这里代号b

t2算出结束时间的位置在刻度尺上占多少px格子,t2t1就是时间段在刻度尺上的长度len了。

let len = (t2-t1).toFixed(2) * this.single
3、结束时间距(0点)的距离,这里代号c

这个有2种算法:

  • 1、开始时间位置poi加时间段长度len
let left = poi + len
  • 2、计算结束时间位置距开始时间(0点)距离
let left = t2 * this.single

页面渲染

<view class="scale-active">
    <view class='scale-active-time' v-for="(it, idt) in newActiveTime" :key="idt" :style="{marginLeft: idt>0?newActiveTime[idt][0]-newActiveTime[idt-1][2] + 'px':newActiveTime[idt][0] + 'px'}">
        <view class="scale-active-item" :style="{width: it[1] + 'px'}" />
    </view>
</view>
scale-active-time

主要是定位时间段开始渲染的位置。

  • newActiveTime[idt][0] + ‘px’

第一个时间段开始渲染的位置就是a

  • newActiveTime[idt][0]-newActiveTime[idt-1][2] + ‘px’

>0的时间段,用下一个时间段的开始时间位置a减去上一个时间段结束时间位置c,就可以得到下一个时间段开始渲染的位置

scale-active-item

每个时间段view的宽度width

以上,就是时间刻度尺上标识带录像时间段的思路了。

使用

页面引入

import videoTimeSlider from '@/uni_modules/video-time-slider/components/video-time-slider/video-time-slider.vue'

页面调用

<video-time-slider :curDate="2021-11-29"
    :activeTime="[['01:12', '03:43'],['05:22', '07:33'],['12:02', '17:39']]" 
    @value="curValue"
    @active-value="activeValue" />
export default {
    components: {
        videoTimeSlider
    },
    data() {
        return {
            curVal: '00:00'
        };
    },
    methods: {
        curValue(msg) {
            this.curVal = msg
        },
        activeValue(msg) {
            console.log(666, msg)
        }
    }
};

具体看例子

参数说明

参数名默认值说明
curDate2021-11-24日期
activeTime[]时间段,标识可播放录像
styles{…}自定义卡尺样式

style选项

参数名默认值说明
line#dbdbdb刻度颜色
bginner#fbfbfb前景色颜色
bgoutside#dbdbdb背景色颜色
lineSelect#ea3639选中线颜色
fontColo#404040刻度数字颜色
fontSiz12字体大小

方法说明

事件名称说明返回参数
@value刻度无录像时间段时间值时间值字符串
@active-value刻度有录像时间段时间值时间值字符串

版本要求

  • 微信 App iOS 最低版本要求:6.5.21 。
  • 微信 App Android 最低版本要求:6.5.19。
  • 小程序基础库最低版本要求:1.7.0。

注意

如果微信开发者工具报以下错误

TypeError: Cannot read property 'forceUpdate' of undefined

manifest.json文件配置下微信小程序的AppID就行了,不用在意

总结

已上插件市场 video-time-slider

市场上的代码可能会忘记更新,具体看代码了,github上的代码是最新的 video-time-slider

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过使用 AVPlayer 和 AVPlayerLayer 类来实现视频监控进度条和视频回放页面时间轴自定义滑块。下面是一个示例代码片段,演示如何实现: 1.创建一个 AVPlayerLayer,将其添加到您的视图层次结构中,并将其绑定到 AVPlayer。 ``` // 创建 AVPlayer AVPlayer *player = [AVPlayer playerWithURL:[NSURL URLWithString:@"yourVideoURL"]]; [player play]; // 创建 AVPlayerLayer AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; playerLayer.frame = self.view.bounds; [self.view.layer addSublayer:playerLayer]; ``` 2.创建一个 UISlider,并在滑动滑块时更新 AVPlayer 的当前时间。 ``` // 创建 UISlider UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(50, 400, 300, 20)]; [slider addTarget:self action:@selector(handleSlider:) forControlEvents:UIControlEventValueChanged]; [self.view addSubview:slider]; // 滑动滑块处理程序 - (void)handleSlider:(UISlider *)slider { CMTime videoDuration = player.currentItem.duration; double videoDurationSeconds = CMTimeGetSeconds(videoDuration); double newTime = videoDurationSeconds * slider.value; CMTime time = CMTimeMakeWithSeconds(newTime, player.currentTime.timescale); [player seekToTime:time]; } ``` 3.创建一个自定义滑块,并在拖动滑块时更新视频回放页面的时间轴。 ``` // 创建自定义滑块 UIImageView *thumbImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; thumbImageView.image = [UIImage imageNamed:@"yourImage"]; [slider setThumbImage:[UIImage new] forState:UIControlStateNormal]; [slider addSubview:thumbImageView]; // 拖动滑块处理程序 - (void)handlePan:(UIPanGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateChanged) { CGPoint translation = [gesture translationInView:self.view]; CGPoint newCenter = CGPointMake(slider.thumbCenter.x + translation.x, slider.thumbCenter.y); if (newCenter.x > slider.frame.size.width) { newCenter.x = slider.frame.size.width; } else if (newCenter.x < 0) { newCenter.x = 0; } slider.thumbCenter = newCenter; CMTime videoDuration = player.currentItem.duration; double videoDurationSeconds = CMTimeGetSeconds(videoDuration); double newTime = videoDurationSeconds * (newCenter.x / slider.frame.size.width); CMTime time = CMTimeMakeWithSeconds(newTime, player.currentTime.timescale); [player seekToTime:time]; } } ``` 希望这可以帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值