1# Interface (AVImageGenerator) 2<!--Kit: Media Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @wang-haizhou6--> 5<!--Designer: @HmQQQ--> 6<!--Tester: @xchaosioda--> 7<!--Adviser: @zengyawen--> 8 9> **说明:** 10> 11> - 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 12> - 本Interface首批接口从API version 12开始支持。 13 14视频缩略图获取类,用于从视频资源中获取缩略图。在调用AVImageGenerator的方法前,需要先通过[createAVImageGenerator()](arkts-apis-media-f.md#mediacreateavimagegenerator12)构建一个AVImageGenerator实例。 15 16获取视频缩略图的demo可参考:[获取视频缩略图开发指导](../../media/media/avimagegenerator.md)。 17 18## 导入模块 19 20```ts 21import { media } from '@kit.MediaKit'; 22``` 23 24## 属性 25 26**系统能力:** SystemCapability.Multimedia.Media.AVImageGenerator 27 28| 名称 | 类型 | 只读 | 可选 | 说明 | 29| --------------------------------------------------- | ------------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ | 30| fdSrc<sup>12+</sup> | [AVFileDescriptor](arkts-apis-media-i.md#avfiledescriptor9) | 否 | 是 | 媒体文件描述,通过该属性设置数据源。<br/> **使用示例**:<br/>假设一个连续存储的媒体文件,地址偏移:0,字节长度:100。其文件描述为AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }。<br>**说明:** <br> 将资源句柄(fd)传递给AVImageGenerator实例之后,不允许通过该资源句柄做其他读写操作,包括但不限于将同一个资源句柄传递给多个AVPlayer/AVMetadataExtractor/AVImageGenerator/AVTranscoder。同一时间通过同一个资源句柄读写文件时存在竞争关系,将导致视频缩略图数据获取异常。 | 31 32## fetchFrameByTime<sup>12+</sup> 33 34fetchFrameByTime(timeUs: number, options: AVImageQueryOptions, param: PixelMapParams, callback: AsyncCallback\<image.PixelMap>): void 35 36异步方式获取视频缩略图。通过注册回调函数获取返回值。 37 38**系统能力:** SystemCapability.Multimedia.Media.AVImageGenerator 39 40**参数:** 41 42| 参数名 | 类型 | 必填 | 说明 | 43| -------- | -------------------------------------------- | ---- | ----------------------------------- | 44| timeUs | number | 是 | 需要获取的缩略图在视频中的时间点,单位为微秒(μs)。 | 45| options | [AVImageQueryOptions](arkts-apis-media-e.md#avimagequeryoptions12) | 是 | 需要获取的缩略图时间点与视频帧的对应关系。 | 46| param | [PixelMapParams](arkts-apis-media-i.md#pixelmapparams12) | 是 | 需要获取的缩略图的格式参数。 | 47| callback | AsyncCallback\<[image.PixelMap](../apis-image-kit/arkts-apis-image-PixelMap.md)> | 是 | 回调函数。获取缩略图成功时,err为undefined,data为PixelMap实例,否则为错误对象。 | 48 49**错误码:** 50 51以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 52 53| 错误码ID | 错误信息 | 54| -------- | ------------------------------------------ | 55| 5400102 | Operation not allowed. Returned by callback. | 56| 5400106 | Unsupported format. Returned by callback. | 57 58**示例:** 59 60```ts 61import { BusinessError } from '@kit.BasicServicesKit'; 62import { image } from '@kit.ImageKit'; 63import { media } from '@kit.MediaKit'; 64 65let avImageGenerator: media.AVImageGenerator | undefined = undefined; 66let pixel_map : image.PixelMap | undefined = undefined; 67 68// 初始化入参。 69let timeUs: number = 0; 70 71let queryOption: media.AVImageQueryOptions = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC; 72 73let param: media.PixelMapParams = { 74 width : 300, 75 height : 300, 76}; 77 78// 获取缩略图。 79media.createAVImageGenerator((err: BusinessError, generator: media.AVImageGenerator) => { 80 if(generator != null){ 81 avImageGenerator = generator; 82 console.info(`Succeeded in creating AVImageGenerator`); 83 avImageGenerator.fetchFrameByTime(timeUs, queryOption, param, (error: BusinessError, pixelMap) => { 84 if (error) { 85 console.error(`Failed to fetch FrameByTime, err = ${JSON.stringify(error)}`); 86 return; 87 } 88 pixel_map = pixelMap; 89 }); 90 } else { 91 console.error(`Failed to creat AVImageGenerator, error message:${err.message}`); 92 }; 93}); 94``` 95 96## fetchFrameByTime<sup>12+</sup> 97 98fetchFrameByTime(timeUs: number, options: AVImageQueryOptions, param: PixelMapParams): Promise<image.PixelMap> 99 100异步方式获取视频缩略图。通过Promise获取返回值。 101 102**系统能力:** SystemCapability.Multimedia.Media.AVImageGenerator 103 104**参数:** 105 106| 参数名 | 类型 | 必填 | 说明 | 107| -------- | -------------------------------------------- | ---- | ----------------------------------- | 108| timeUs | number | 是 | 需要获取的缩略图在视频中的时间点,单位为微秒(μs)。 | 109| options | [AVImageQueryOptions](arkts-apis-media-e.md#avimagequeryoptions12) | 是 | 需要获取的缩略图时间点与视频帧的对应关系。 | 110| param | [PixelMapParams](arkts-apis-media-i.md#pixelmapparams12) | 是 | 需要获取的缩略图的格式参数。 | 111 112**返回值:** 113 114| 类型 | 说明 | 115| -------------- | ---------------------------------------- | 116| Promise\<[image.PixelMap](../apis-image-kit/arkts-apis-image-PixelMap.md)> | Promise对象,返回视频缩略图对象。 | 117 118**错误码:** 119 120以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 121 122| 错误码ID | 错误信息 | 123| -------- | ----------------------------------------- | 124| 5400102 | Operation not allowed. Returned by promise. | 125| 5400106 | Unsupported format. Returned by promise. | 126 127**示例:** 128 129```ts 130import { BusinessError } from '@kit.BasicServicesKit'; 131import { image } from '@kit.ImageKit'; 132import { media } from '@kit.MediaKit'; 133 134let avImageGenerator: media.AVImageGenerator | undefined = undefined; 135let pixel_map : image.PixelMap | undefined = undefined; 136 137// 初始化入参。 138let timeUs: number = 0; 139 140let queryOption: media.AVImageQueryOptions = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC; 141 142let param: media.PixelMapParams = { 143 width : 300, 144 height : 300, 145}; 146 147// 获取缩略图。 148media.createAVImageGenerator((err: BusinessError, generator: media.AVImageGenerator) => { 149 if(generator != null){ 150 avImageGenerator = generator; 151 console.info(`Succeeded in creating AVImageGenerator`); 152 avImageGenerator.fetchFrameByTime(timeUs, queryOption, param).then((pixelMap: image.PixelMap) => { 153 pixel_map = pixelMap; 154 }).catch((error: BusinessError) => { 155 console.error(`Failed to fetch FrameByTime, error message:${error.message}`); 156 }); 157 } else { 158 console.error(`Failed to creat AVImageGenerator, error message:${err.message}`); 159 }; 160}); 161``` 162 163## fetchScaledFrameByTime<sup>20+</sup> 164 165fetchScaledFrameByTime(timeUs: number, queryMode: AVImageQueryOptions, outputSize?: OutputSize):Promise\<image.PixelMap\> 166 167支持按比例缩放提取视频缩略图。使用Promise异步回调。 168 169**系统能力:** SystemCapability.Multimedia.Media.AVImageGenerator 170 171**参数:** 172 173| 参数名 | 类型 | 必填 | 说明 | 174| ---------- | --------------------------------------------- | ---- | ---------------------------------------------------- | 175| timeUs | number | 是 | 在视频中需要获取的缩略图的时间点,单位为微秒(μs)。 | 176| queryMode | [AVImageQueryOptions](arkts-apis-media-e.md#avimagequeryoptions12) | 是 | 需要获取的缩略图时间点与视频帧的对应关系。 | 177| outputSize | [OutputSize ](arkts-apis-media-i.md#outputsize20) | 否 | 定义帧的输出大小。默认按原图大小显示。 | 178 179**返回值:** 180 181| 类型 | 说明 | 182| ------------------------------------------------------------ | --------------------------------- | 183| Promise\<[image.PixelMap](../apis-image-kit/arkts-apis-image-PixelMap.md)> | Promise对象。返回视频缩略图对象。 | 184 185**错误码:** 186 187以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 188 189| 错误码ID | 错误信息 | 190| -------- | ------------------------------------------- | 191| 5400102 | Operation not allowed. Returned by promise. | 192| 5400106 | Unsupported format. Returned by promise. | 193 194**示例:** 195 196```ts 197import { BusinessError } from '@kit.BasicServicesKit'; 198import { image } from '@kit.ImageKit'; 199import { media } from '@kit.MediaKit'; 200let avImageGenerator: media.AVImageGenerator | undefined = undefined; 201let pixel_map : image.PixelMap | undefined = undefined; 202// 初始化入参。 203let timeUs: number = 0; 204let queryOption: media.AVImageQueryOptions = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC; 205let outputSize: media.OutputSize = { 206 width : 300, 207 height : 300, 208}; 209// 获取缩略图。 210media.createAVImageGenerator((err: BusinessError, generator: media.AVImageGenerator) => { 211 if(generator != null){ 212 avImageGenerator = generator; 213 console.info(`Succeeded in creating AVImageGenerator`); 214 avImageGenerator.fetchScaledFrameByTime(timeUs, queryOption, outputSize).then((pixelMap: image.PixelMap) => { 215 pixel_map = pixelMap; 216 }).catch((error: BusinessError) => { 217 console.error(`Failed to fetch ScaledFrameByTime, error message:${error.message}`); 218 }); 219 } else { 220 console.error(`Failed to creat AVImageGenerator, error message:${err.message}`); 221 }; 222}); 223``` 224 225## release<sup>12+</sup> 226 227release(callback: AsyncCallback\<void>): void 228 229异步方式释放资源。通过注册回调函数获取返回值。 230 231**系统能力:** SystemCapability.Multimedia.Media.AVImageGenerator 232 233**参数:** 234 235| 参数名 | 类型 | 必填 | 说明 | 236| -------- | -------------------------------------------- | ---- | ----------------------------------- | 237| callback | AsyncCallback\<void> | 是 | 回调函数。当释放资源成功,err为undefined,否则为错误对象。 | 238 239**错误码:** 240 241以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 242 243| 错误码ID | 错误信息 | 244| -------- | ------------------------------------------ | 245| 5400102 | Operation not allowed. Returned by callback. | 246 247**示例:** 248 249```ts 250import { BusinessError } from '@kit.BasicServicesKit'; 251import { media } from '@kit.MediaKit'; 252 253let avImageGenerator: media.AVImageGenerator | undefined = undefined; 254 255//释放资源。 256media.createAVImageGenerator((err: BusinessError, generator: media.AVImageGenerator) => { 257 if(generator != null){ 258 avImageGenerator = generator; 259 console.info(`Succeeded in creating AVImageGenerator`); 260 avImageGenerator.release((error: BusinessError) => { 261 if (error) { 262 console.error(`Failed to release, err = ${JSON.stringify(error)}`); 263 return; 264 } 265 console.info(`Succeeded in releasing`); 266 }); 267 } else { 268 console.error(`Failed to creat AVImageGenerator, error message:${err.message}`); 269 }; 270}); 271``` 272 273## release<sup>12+</sup> 274 275release(): Promise\<void> 276 277异步方式释放资源。通过Promise获取返回值。 278 279**系统能力:** SystemCapability.Multimedia.Media.AVImageGenerator 280 281**返回值:** 282 283| 类型 | 说明 | 284| -------------- | ---------------------------------------- | 285| Promise\<void> | 异步方式释放资源release方法的Promise返回值。 | 286 287**错误码:** 288 289以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 290 291| 错误码ID | 错误信息 | 292| -------- | ----------------------------------------- | 293| 5400102 | Operation not allowed. Returned by promise. | 294 295**示例:** 296 297```ts 298import { BusinessError } from '@kit.BasicServicesKit'; 299import { media } from '@kit.MediaKit'; 300 301let avImageGenerator: media.AVImageGenerator | undefined = undefined; 302 303//释放资源 304media.createAVImageGenerator((err: BusinessError, generator: media.AVImageGenerator) => { 305 if(generator != null){ 306 avImageGenerator = generator; 307 console.info(`Succeeded in creating AVImageGenerator`); 308 avImageGenerator.release().then(() => { 309 console.info(`Succeeded in releasing.`); 310 }).catch((error: BusinessError) => { 311 console.error(`Failed to release, error message:${error.message}`); 312 }); 313 } else { 314 console.error(`Failed to creat AVImageGenerator, error message:${err.message}`); 315 }; 316}); 317``` 318