《鸿蒙开发-答案之书》获取视频第一帧和视频时间
typescript
/**
* 获取视频信息
*```
*let result = await MySightUtil.getSightInfo(this.sightUri);
*let base64 : string = result[0];
*let duration : number = result[1]
*```
* @param uri 视频地址
* @returns 第一个数据是缩略图 base64 字符串,第二个是视频时长(单位秒)
*/
public static async getSightInfo(uri: string): Promise<[string, number]> {
let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
let fdSrc: media.AVFileDescriptor = {
fd: file.fd
};
// 视频第一帧
let base64 = '';
try {
// 获取第一帧
let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();
// 设置fdSrc
avImageGenerator.fdSrc = fdSrc;
// 初始化入参
let timeUs = 0;
let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC;
let param: media.PixelMapParams = {};
// 获取缩略图(promise模式)
let pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param);
// 释放资源(promise模式)
await avImageGenerator.release();
const MAX_SIZE = 240;
const MIN_SIZE = 100;
await calculateThumbnailScaling(pixelMap, MAX_SIZE, MIN_SIZE);
const imagePackerApi: image.ImagePacker = image.createImagePacker();
let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 80 };
let data: ArrayBuffer = await imagePackerApi.packing(pixelMap, packOpts);
let buf: buffer.Buffer = buffer.from(data);
base64 = buf.toString('base64', 0, buf.length);
} catch (error) {
let err = error as BusinessError;
hilog.error(0x0000, '', `error code: ${err.code}, error message: ${err.message}`);
}
// 视频时长
let duration: number = 0;
try {
// 获取视频时长
let aVMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor();
aVMetadataExtractor.fdSrc = fdSrc;
let metadata = await aVMetadataExtractor.fetchMetadata();
aVMetadataExtractor.release();
// 毫秒
duration = new Number(metadata.duration).valueOf();
hilog.error(0x0000, 'IM-APP', `metadata: %{public}s`, JSON.stringify(metadata));
} catch (error) {
let err = error as BusinessError;
hilog.error(0x0000, '', `error code: ${err.code}, error message: ${err.message}`);
}
return [base64, duration / 1000];
}