uni-app video 获取视频总时长

uni-app video 获取视频总时长

接到公司的一个需求,在uni-app开发的小程序和h5页面的商品详情轮播图中添加一个视频,后台返回视频src,但没有返视频时间,怎么办呢,只能自己动手了。记录一下实现过程中遇到的一些的问题。

在这里插入图片描述

html

<view class="swiper-box">
	<swiper circular="true" autoplay="true" @change="swiperChange">
		<swiper-item v-for="swiper in swiperList" :key="swiper.id">
			<image mode="aspectFill" :src="swiper.img"></image>
		</swiper-item>
	</swiper>
	<view class="indicator">{{ currentSwiper + 1 }}/{{ swiperList.length }}</view>
	<view class="video_play" v-if="isPlay&&videoSrc" @click="toPlay">
		<view class="play_icon">
			<view class="video_time">{{videoTime}}</view>
		</view>
	</view>
	<view class="video_box"  v-if="!isPlay">
		<video id="swiperVideo" :src="videoSrc" controls="controls" oncanplaythrough="oncanplaythrough" @loadedmetadata="loadedmetadata"></video>
		<view class="pause_play">
			<view class="pause_btn" @click="outPlay">退出播放</view>
		</view>
	</view>
</view>

部分data数据:

data() {
	return {
	isPlay:[],
	videoSrc:'',
	isPlay:false,
	videoTime:0,
	videoContext:'',
	}
},
methods:{
   // 查看官方文档,通过loadedmetadata方法获取时长,但是loadedmetadata函数无法触发
   loadedmetadata(){//无效果
		console.log("loadedmetadata")
	},
	oncanplaythrough(){//无效果
		console.log("oncanplaythrough") 
	},
	toPlay() {
		this.videoContext = uni.createVideoContext('swiperVideo')
			this.isPlay = false;
			this.videoContext.play()
		},
		outPlay() {
			this.videoContext.pause();
			this.videoContext.stop();
			this.videoContext.seek(); // 初始化播放进度
			this.videoContext=""
			this.isPlay = true;
		},
		formatSeconds(value) {
			let theTime = parseInt(value);// 秒
			let middle= 0;// 分
			if(theTime > 60) {
			    middle= parseInt(theTime/60);
			    theTime = parseInt(theTime%60);	
			}
			return `${middle>9?middle:'0'+middle}′${theTime>9?theTime:'0'+theTime}″`;
		},
		getGoodsDetail() {
			uni.request({
			// 发送请求,后台返回数据
			...
				success: (res) => {
       				let audioContext = uni.createInnerAudioContext();
						audioContext.volume=0;
						audioContext.autoplay = true;
						audioContext.src = this.goodsData.video || "";
						let that = this;
						// 必须写在onCanplay里面,否则获取不到
						audioContext.onCanplay(()=> {
						    audioContext.duration; 
							audioContext.buffered;
							//如果不写上面2行,打印audioContext,duration,buffered都有值,但打印audioContext.duration或audioContext.buffered值为0
							setTimeout(() => {
								if(audioContext.duration*1>0||audioContext.buffered*1>0) {
								// 部分iphone手机audioContext.duration 会为为0,所以判断audioContext.duration是否为0
									that.videoTime = that.formatSeconds(audioContext.duration==0?audioContext.buffered:audioContext.duration);
								}
							}, 1000)
						})
    			}
			})
		},
}

总结

各位大佬们,觉得有用,可以收藏点赞,给点鼓励,有不同意见的欢迎留言,谢谢大家。

<think>好的,用户的问题是如何在UniApp中使用video组件获取视频总时长。我需要先回想一下相关的API和文档。记得在UniApp中,video组件有相关的上下文方法,可能需要使用createVideoContext来操作。 根据引用内容,用户提到在uni-app中,video组件可以通过videoContext来操作,比如引用[1]中的createVideoContext方法。而引用[4]中提到音频播放时获取duration的问题,可能需要类似的解决方法。比如,使用事件监听或者定时器来确保获取到正确的时长。 首先,用户需要获取视频总时长,应该是在video组件加载后能够获取的属性。可能需要监听视频的加载完成事件,比如onLoadedMetadata事件,然后通过videoContext获取duration属性。不过,在UniApp的文档中,可能需要查看video组件的具体事件和方法。 另外,引用[2]中提到在UC浏览器上设置进度的问题,可能需要先播放视频才能获取正确的时长,或者在timeupdate事件中处理。但总时长一般是在元数据加载后就能获取的,所以可能需要使用onLoadedMetadata事件。 可能的步骤是:在video组件中绑定onLoadedMetadata事件,当元数据加载完成后,通过createVideoContext获取视频实例,然后访问duration属性。但需要注意,有些情况下可能需要延迟获取,比如使用定时器或者在onCanplay事件中处理,类似于引用[4]中处理音频duration的方法。 因此,正确的做法应该是: 1. 在template中定义video组件,并设置id。 2. 在onReady生命周期中使用createVideoContext获取video上下文。 3. 监听onLoadedMetadata事件,或者在onCanplay时获取duration。 4. 可能需要使用定时器确保获取到正确的值,因为有时候元数据加载可能需要时间。 综合这些信息,给出示例代码,并提醒用户注意可能的异步问题,以及不同平台的兼容性。</think>在 UniApp获取 video 组件视频总时长,需要通过 `createVideoContext` API 结合事件监听实现。具体步骤如下: ### 一、实现步骤 1. **绑定 video 组件** 在模板中设置 `video` 组件的 `id` 和 `@loadedmetadata` 事件: ```html <template> <video id="myVideo" src="/static/video.mp4" @loadedmetadata="handleMetaData" controls ></video> </template> ``` 2. **获取视频上下文对象** 在 `onReady` 生命周期中通过 `uni.createVideoContext` 获取控制对象: ```javascript export default { onReady() { this.videoContext = uni.createVideoContext('myVideo'); }, methods: { handleMetaData() { // 通过定时器确保获取到正确的 duration setTimeout(() => { console.log('视频总时长:', this.videoContext.duration); }, 500); } } } ``` ### 二、关键原理 - **`@loadedmetadata` 事件**:视频元数据加载完成后触发,此时可以获取视频总时长[^1][^3] - **`createVideoContext`**:用于操作 video 组件的核心 API,可访问 `duration` 属性 - **定时器延迟获取**:部分平台(如 H5)可能出现 `duration` 初始化延迟,需要异步获取[^4] ### 三、注意事项 1. 小程序平台需在 `video` 组件初始化完成后再调用 `createVideoContext` 2. UC 浏览器等特殊环境可能需要先调用 `play()` 才能获取准确时长[^2] 3. 若直接获取 `duration` 为 0,可通过 `setTimeout` 延迟处理[^4]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值