You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Expo-Video-Player播放视频的已播放时长?

获取Expo-Video-Player的已播放时长

你可以通过已声明的videoRef结合expo-av的播放状态API来获取已播放时长,具体实现如下:

1. 确保正确创建videoRef

首先在组件内用useRef创建视频引用:

import { useRef, useState } from 'react';
import { Video } from 'expo-av';
import ExpoVideoPlayer from 'expo-video-player';

export default function YourVideoComponent() {
  const video = useRef(null);
  // 可选:用状态存储已播放时长,方便组件内复用
  const [playedDuration, setPlayedDuration] = useState(0);
  const videoUrl = "你的视频地址";
  // ...playIcon、replayIcon、pauseIcon等变量定义

2. 实时监听获取已播放时长

在videoProps中添加onPlaybackStatusUpdate回调,实时监听播放状态并提取已播放时长:

<ExpoVideoPlayer
  videoProps={{
    resizeMode: Video.RESIZE_MODE_STRETCH,
    source: { uri: videoUrl },
    // 监听播放状态更新
    onPlaybackStatusUpdate: (status) => {
      if (status.isLoaded && !status.isBuffering) {
        // status.position 即为已播放时长(单位:秒)
        setPlayedDuration(status.position);
        console.log("已播放时长:", status.position.toFixed(2), "秒");
      }
    }
  }}
  inFullscreen={false}
  showControlsOnLoad={true}
  videoBackground="#fff"
  height={200}
  videoRef={video}
  showFullscreenButton={false}
  playIcon={() => playIcon}
  replayIcon={() => replayIcon}
  pauseIcon={() => pauseIcon}
  sliderColor="#CE4A52"
/>

3. 主动获取当前已播放时长

如果需要在特定时机(比如按钮点击)主动获取时长,可调用视频引用的getStatusAsync方法:

const getCurrentDuration = async () => {
  if (!video.current) return;
  const status = await video.current.getStatusAsync();
  if (status.isLoaded) {
    console.log("当前已播放时长:", status.position.toFixed(2), "秒");
    setPlayedDuration(status.position);
  }
};

// 可绑定到按钮触发
// <Button title="查看当前时长" onPress={getCurrentDuration} />

关键说明

  • status.position返回的是秒数,通过toFixed(2)可保留两位小数提升可读性
  • 加入!status.isBuffering判断,避免缓冲阶段获取到不准确的时长值
  • ExpoVideoPlayer基于expo-av的Video组件封装,因此可直接使用Video组件的原生API

内容的提问来源于stack exchange,提问作者jNiuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:50:11