HarmonyOS鸿蒙Next中从PhotoPickerComponent选择的视频如何判断是否是HDR视频

HarmonyOS鸿蒙Next中从PhotoPickerComponent选择的视频如何判断是否是HDR视频 在PhotoPickerComponent组件选择视频的回调中会返回视频资源的uri,如何判断选择的视频是否是HDR vivid视频

3 回复
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { dataSharePredicates } from '@kit.ArkData';

async checkVideoHDRType() {
  try {
    let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(this.context);
    let predicates = new dataSharePredicates.DataSharePredicates();
    predicates.equalTo('uri', this.uris); // 使用获取的URI
    // 关键:请求HDR类型字段
    let fetchOption: photoAccessHelper.FetchOptions = {
      fetchColumns: [
        photoAccessHelper.PhotoKeys.HDR_TYPE // 专用于HDR类型的字段
      ],
      predicates: predicates
    };
    let fetchResult = await phAccessHelper.getAssets(fetchOption);
    const asset = await fetchResult.getFirstObject();
    const hdrType = asset.get(photoAccessHelper.PhotoKeys.HDR_TYPE);
    // 判断是否为HDR视频
    if (hdrType === photoAccessHelper.HdrType.HDR_VIVID ||
        hdrType === photoAccessHelper.HdrType.HDR_HLG) {
      console.log('该视频是HDR视频');
    } else {
      console.log('该视频不是HDR视频');
    }
  } catch (err) {
    console.error('获取HDR信息失败', err);
  }
}

更多关于HarmonyOS鸿蒙Next中从PhotoPickerComponent选择的视频如何判断是否是HDR视频的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,通过PhotoPickerComponent选择视频后,可以使用VideoMetadata类获取视频元数据。调用getVideoMetadata()方法,然后通过isHdr()方法判断是否为HDR视频。示例代码片段:videoMetadata.isHdr()返回布尔值。

在HarmonyOS Next中,从PhotoPickerComponent获取视频URI后,可以通过@ohos.file.fs@ohos.multimedia.media模块来解析视频的元数据,进而判断是否为HDR视频。

具体步骤如下:

  1. 获取文件描述符:使用fs.openSync()通过URI打开视频文件,获取文件描述符(FD)。
  2. 创建媒体元数据提取器:使用media.createMediaMetadataExtractor()创建元数据提取器实例。
  3. 设置数据源:调用提取器的setSource()方法,将文件描述符作为数据源传入。
  4. 提取元数据:使用fetchMetadata()获取视频的元数据对象。
  5. 判断HDR属性:从元数据中查询关键属性。HDR视频通常会在元数据中携带特定的色彩格式或传输特性信息。
    • 关键属性:您可以重点检查track-description中的color-standardcolor-transfercolor-range字段。例如,color-transfer值为smpte-st-2084(PQ)或arib-std-b67(HLG)通常表示HDR视频。color-standard值为bt2020也常与HDR关联。
    • 直接方法:更直接的方式是检查是否存在代表HDR的特定键值,例如"has-hdr""hdr-format"(具体键名需参考实际元数据输出或官方文档)。"hdr-format"的值可能是hdr10hlg等。

代码示例参考

import fs from '@ohos.file.fs';
import media from '@ohos.multimedia.media';

async function isHDRVideo(videoUri: string): Promise<boolean> {
  let isHDR = false;
  try {
    // 1. 打开文件获取FD
    let file = fs.openSync(videoUri, fs.OpenMode.READ_ONLY);
    let fd = file.fd;

    // 2. 创建并配置元数据提取器
    let metadataExtractor = media.createMediaMetadataExtractor();
    metadataExtractor.setSource(fd);

    // 3. 提取元数据
    let metadata = metadataExtractor.fetchMetadata();

    // 4. 分析元数据判断HDR
    // 示例:检查是否存在'HDR'相关键值或特定的色彩传输特性
    for (let key in metadata) {
      if (key.includes('hdr') || key.includes('HDR')) {
        // 根据实际键名判断,例如 metadata['hdr-format'] 存在
        isHDR = true;
        break;
      }
      // 或检查具体的色彩传输值
      if (key === 'color-transfer' && (metadata[key] === 'smpte-st-2084' || metadata[key] === 'arib-std-b67')) {
        isHDR = true;
        break;
      }
    }

    // 5. 释放资源
    metadataExtractor.release();
    fs.closeSync(file);
  } catch (error) {
    console.error('判断HDR视频失败:', error);
  }
  return isHDR;
}

// 使用示例:在PhotoPickerComponent的回调中获取uri后调用
// let hdrCheckResult = await isHDRVideo(videoUri);

注意事项

  • 请根据实际从fetchMetadata()返回的元数据对象结构,调整判断逻辑中的键名(key)。
  • 处理完成后,务必调用release()释放提取器资源,并用fs.closeSync()关闭文件。
  • 建议查阅HarmonyOS Next官方关于MediaMetadataExtractor的API文档,以获取最准确的元数据键值定义。

通过解析视频的元数据信息,您可以可靠地判断从PhotoPickerComponent选择的视频是否为HDR Vivid或其他格式的HDR视频。

回到顶部