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

