HarmonyOS鸿蒙Next中如何获取视频文件的时长

HarmonyOS鸿蒙Next中如何获取视频文件的时长

当前需求是使用picker.PhotoSelectOptions 从相册获取视频后,将其拷贝到沙盒。 请问如何获取这个视频文件的时长。

4 回复

可以通过avMetadataExtractor.fetchMetadata获取音视频的元数据,参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-media-V5#ZH-CN_TOPIC_0000001893369157__avmetadataextractor11

更多关于HarmonyOS鸿蒙Next中如何获取视频文件的时长的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


大致意思就是fetchFame,从第一帧到最后一帧来对比,手动记录

async getVideoDuration(path: string, maxDurationEstimate: number = 300,
  intervals: number = 100): Promise<number> {
  try {

    // Create test timestamps at regular intervals based on estimated duration
    const testPoints: number[] = [];
    const intervalDuration = maxDurationEstimate / intervals;

    // Generate test timestamps (converting to milliseconds)
    for (let i = 1; i <= intervals; i++) {
      testPoints.push(Math.floor(i * intervalDuration * 1000));
    }

    // Variable to track max valid timestamp
    let maxValidTimestamp = 0;

    // Create AVImageGenerator once to improve performance
    let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();

    // Set up file descriptor
    const file = await FileUtil.createOrOpen(path);
    const fileDescriptor: media.AVFileDescriptor = {
      fd: file.fd,
      offset: 0,
      length: -1
    };
    avImageGenerator.fdSrc = fileDescriptor;

    // Binary search to find approximate end of video
    let low = 0;
    let high = testPoints.length - 1;
    let lastValidIndex = -1;

    while (low <= high) {
      const mid = Math.floor((low + high) / 2);
      const timestamp = testPoints[mid];

      try {
        // Convert milliseconds to microseconds
        const timeUs = timestamp * 1000;
        const queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_CLOSEST;
        const param: media.PixelMapParams = {
          width: 50, // Very small size for quick testing
          height: 50
        };

        // Attempt to get a frame at this timestamp
        const pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param);

        if (pixelMap) {
          // This timestamp works, so video is at least this long
          lastValidIndex = mid;
          low = mid + 1;
          pixelMap.release();
        }
      } catch (error) {
        // If this timestamp fails, try earlier
        high = mid - 1;
      }
    }

    // Now we know the approximate end of the video (lastValidIndex)
    if (lastValidIndex >= 0) {
      maxValidTimestamp = testPoints[lastValidIndex];
    }

    // Release resources
    await avImageGenerator.release();

    // Convert to seconds with 2 decimal places for logging
    const durationSec = Math.round(maxValidTimestamp / 10) / 100;

    
    return maxValidTimestamp;
  } catch (error) {
    
    return 0;
  }
}

在HarmonyOS鸿蒙Next中,获取视频文件时长可以通过AVPlayerAVMetadataExtractor来实现。以下是具体步骤:

  1. 使用AVPlayer获取时长:

    • 创建AVPlayer实例并设置视频源。
    • 调用getDuration()方法获取视频时长。
    import media from '[@ohos](/user/ohos).multimedia.media';
    
    let avPlayer = new media.AVPlayer();
    avPlayer.url = 'file:///path/to/video.mp4';
    avPlayer.prepare().then(() => {
        let duration = avPlayer.getDuration();
        console.log('视频时长:', duration);
    });
    
  2. 使用AVMetadataExtractor获取时长:

    • 创建AVMetadataExtractor实例并设置视频源。
    • 调用fetchMetadata()方法获取元数据,从中提取视频时长。
    import media from '[@ohos](/user/ohos).multimedia.media';
    
    let metadataExtractor = new media.AVMetadataExtractor();
    metadataExtractor.url = 'file:///path/to/video.mp4';
    metadataExtractor.fetchMetadata().then((metadata) => {
        let duration = metadata['duration'];
        console.log('视频时长:', duration);
    });
    

这两种方法均可在HarmonyOS鸿蒙Next中获取视频文件的时长。

在HarmonyOS鸿蒙Next中,可以通过AVMetadata类获取视频文件的时长。首先,使用AVPlayer加载视频文件,然后通过AVMetadatagetDuration()方法获取视频时长。具体步骤如下:

  1. 创建AVPlayer实例并加载视频。
  2. 使用AVMetadata获取视频元数据。
  3. 调用getDuration()方法获取时长,单位为毫秒。

示例代码:

AVPlayer player = new AVPlayer(context);
player.setSource(new AVFileDescriptor(fileDescriptor));
AVMetadata metadata = player.getMetadata();
long duration = metadata.getDuration();
回到顶部