1# Interface (AVMetadataExtractor) 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 11开始支持。 13 14元数据获取类,用于从媒体资源中获取元数据、缩略图。在调用AVMetadataExtractor的方法前,需要先通过[media.createAVMetadataExtractor](arkts-apis-media-f.md#mediacreateavmetadataextractor11)构建一个AVMetadataExtractor实例。 15 16获取音频或视频元数据、视频缩略图的demo可参考:[使用AVMetadataExtractor提取音视频元数据信息(ArkTS)](../../media/media/avmetadataextractor.md)。 17 18## 导入模块 19 20```ts 21import { media } from '@kit.MediaKit'; 22``` 23 24## 属性 25 26**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 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| dataSrc<sup>11+</sup> | [AVDataSrcDescriptor](arkts-apis-media-i.md#avdatasrcdescriptor10) | 是 | 是 | 流式媒体资源描述,通过该属性设置数据源。在获取元数据之前,必须设置数据源属性,只能设置fdSrc和dataSrc的其中一个。<br/> 当应用从远端获取音视频媒体文件,在应用未下载完整音视频资源时,可以设置dataSrc提前获取该资源的元数据。| 32 33## setUrlSource<sup>20+</sup> 34 35setUrlSource(url: string, headers?: Record\<string, string>): void 36 37网络点播资源地址描述,通过该接口设置数据源。只支持获取网络[fetchMetadata](#fetchmetadata11)(元数据)和[fetchFrameByTime](#fetchframebytime20)(缩略图),在获取之前,必须设置媒体资源URL。 38 39**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 40 41**参数:** 42 43| 参数名 | 类型 | 必填 | 说明 | 44| -------- | -------------------------------------------- | ---- | ----------------------------------- | 45| url | string | 是 | 媒体资源URL。<br/>1. 支持的视频格式包括:mp4、mpeg-ts、mkv。<br/>2. 支持的音频格式包括:m4a、aac、mp3、ogg、wav、flac、amr。<br/>**支持路径示例**:<br/>1. http网络播放:`http\://xx`。<br/>2. https网络播放:`https\://xx`。<br/>**说明:** 不支持设置hls/dash、直播资源。| 46| headers | Record\<string, string> | 否 | 支持访问网络资源HttpHeader自定义。默认为空。| 47 48**示例:** 49 50```ts 51import { BusinessError } from '@kit.BasicServicesKit'; 52import { media } from '@kit.MediaKit'; 53 54let avMetadataExtractor: media.AVMetadataExtractor | undefined = undefined; 55 56media.createAVMetadataExtractor(async (error: BusinessError, extractor: media.AVMetadataExtractor) => { 57 if (extractor != null) { 58 avMetadataExtractor = extractor; 59 console.info('Succeeded in creating AVMetadataExtractor'); 60 let url = "http://xx"; 61 let headers: Record<string, string> = { 62 "User-Agent" : "User-Agent-Value" 63 }; 64 avMetadataExtractor.setUrlSource(url, headers); 65 } else { 66 console.error(`Failed to create AVMetadataExtractor, error message:${error.message}`); 67 } 68}); 69``` 70 71## fetchFrameByTime<sup>20+</sup> 72 73fetchFrameByTime(timeUs: number, options: AVImageQueryOptions, param: PixelMapParams): Promise\<image.PixelMap> 74 75获取视频缩略图。使用Promise异步回调。 76 77**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 78 79**参数:** 80 81| 参数名 | 类型 | 必填 | 说明 | 82| -------- | -------------------------------------------- | ---- | ----------------------------------- | 83| timeUs | number | 是 | 需要获取的缩略图在视频中的时间点,单位为微秒(us)。 | 84| options | [AVImageQueryOptions](arkts-apis-media-e.md#avimagequeryoptions12) | 是 | 需要获取的缩略图时间点与视频帧的对应关系。 | 85| param | [PixelMapParams](arkts-apis-media-i.md#pixelmapparams12) | 是 | 需要获取的缩略图的格式参数。 | 86 87**返回值:** 88 89| 类型 | 说明 | 90| -------------- | ---------------------------------------- | 91| Promise\<[image.PixelMap](../apis-image-kit/arkts-apis-image-PixelMap.md)> | Promise对象,返回视频缩略图对象。 | 92 93**错误码:** 94 95以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md) 96 97| 错误码ID | 错误信息 | 98| -------- | ----------------------------------------- | 99| 5400102 | Operation not allowed. Returned by promise. | 100| 5400106 | Unsupported format. Returned by promise. | 101| 5400108 | Parameter check failed. Returned by promise. | 102 103**示例:** 104 105```ts 106import { BusinessError } from '@kit.BasicServicesKit'; 107import { image } from '@kit.ImageKit'; 108import { media } from '@kit.MediaKit'; 109 110let avMetadataExtractor: media.AVMetadataExtractor | undefined = undefined; 111let pixel_map : image.PixelMap | undefined = undefined; 112 113// 初始化入参。 114let timeUs: number = 0; 115let queryOption: media.AVImageQueryOptions = media.AVImageQueryOptions.AV_IMAGE_QUERY_PREVIOUS_SYNC; 116let param: media.PixelMapParams = { 117 width : 300, 118 height : 300 119}; 120// 获取缩略图。 121media.createAVMetadataExtractor((error: BusinessError, extractor: media.AVMetadataExtractor) => { 122 if (extractor != null) { 123 avMetadataExtractor = extractor; 124 console.info('Succeeded in creating AVMetadataExtractor'); 125 avMetadataExtractor.fetchFrameByTime(timeUs, queryOption, param).then((pixelMap: image.PixelMap) => { 126 pixel_map = pixelMap; 127 }).catch((error: BusinessError) => { 128 console.error(`Failed to fetch FrameByTime, error message:${error.message}`); 129 }); 130 } else { 131 console.error(`Failed to create AVMetadataExtractor, error message:${error.message}`); 132 } 133}); 134``` 135 136## fetchMetadata<sup>11+</sup> 137 138fetchMetadata(callback: AsyncCallback\<AVMetadata>): void 139 140异步方式获取媒体元数据。通过注册回调函数获取返回值。 141 142**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 143 144**参数:** 145 146| 参数名 | 类型 | 必填 | 说明 | 147| -------- | -------------------------------------------- | ---- | ----------------------------------- | 148| callback | AsyncCallback\<[AVMetadata](arkts-apis-media-i.md#avmetadata11)> | 是 | 回调函数。异步返回音视频元数据对象(AVMetadata)。| 149 150**错误码:** 151 152以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 153 154| 错误码ID | 错误信息 | 155| -------- | ------------------------------------------ | 156| 5400102 | Operation not allowed. Returned by callback. | 157| 5400106 | Unsupported format. Returned by callback. | 158 159**示例:** 160 161```ts 162import { BusinessError } from '@kit.BasicServicesKit'; 163import { media } from '@kit.MediaKit'; 164 165async function test() { 166 // 创建AVMetadataExtractor对象。 167 let avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor(); 168 avMetadataExtractor.fetchMetadata((error: BusinessError, metadata: media.AVMetadata) => { 169 if (error) { 170 console.error(`Failed to fetch Metadata, err = ${JSON.stringify(error)}`); 171 return; 172 } 173 console.info(`Succeeded in fetching Metadata, genre: ${metadata.genre}`); 174 }); 175} 176``` 177 178## fetchMetadata<sup>11+</sup> 179 180fetchMetadata(): Promise\<AVMetadata> 181 182异步方式获取媒体元数据。通过Promise获取返回值。 183 184**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 185 186**返回值:** 187 188| 类型 | 说明 | 189| -------------- | ---------------------------------------- | 190| Promise\<[AVMetadata](arkts-apis-media-i.md#avmetadata11)> | Promise对象。异步返回音视频元数据对象(AVMetadata)。 | 191 192**错误码:** 193 194以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 195 196| 错误码ID | 错误信息 | 197| -------- | ----------------------------------------- | 198| 5400102 | Operation not allowed. Returned by promise. | 199| 5400106 | Unsupported format. Returned by promise. | 200 201**示例:** 202 203```ts 204import { BusinessError } from '@kit.BasicServicesKit'; 205import { media } from '@kit.MediaKit'; 206 207async function test() { 208 // 创建AVMetadataExtractor对象。 209 let avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor(); 210 avMetadataExtractor.fetchMetadata().then((metadata: media.AVMetadata) => { 211 console.info(`Succeeded in fetching Metadata, genre: ${metadata.genre}`); 212 }).catch((error: BusinessError) => { 213 console.error(`Failed to fetch Metadata, error message:${error.message}`); 214 }); 215} 216``` 217 218## fetchAlbumCover<sup>11+</sup> 219 220fetchAlbumCover(callback: AsyncCallback\<image.PixelMap>): void 221 222异步方式获取音频专辑封面。通过注册回调函数获取返回值。 223 224**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 225 226**参数:** 227 228| 参数名 | 类型 | 必填 | 说明 | 229| -------- | -------------------------------------------- | ---- | ----------------------------------- | 230| callback | AsyncCallback\<[image.PixelMap](../apis-image-kit/arkts-apis-image-PixelMap.md)> | 是 | 回调函数。异步返回专辑封面。 | 231 232**错误码:** 233 234以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 235 236| 错误码ID | 错误信息 | 237| -------- | ------------------------------------------ | 238| 5400102 | Operation not allowed. Return by callback. | 239| 5400106 | Unsupported format. Returned by callback. | 240 241**示例:** 242 243```ts 244import { BusinessError } from '@kit.BasicServicesKit'; 245import { image } from '@kit.ImageKit'; 246import { media } from '@kit.MediaKit'; 247 248async function test() { 249 // 创建AVMetadataExtractor对象。 250 let avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor(); 251 let pixel_map : image.PixelMap | undefined = undefined; 252 253 avMetadataExtractor.fetchAlbumCover((error: BusinessError, pixelMap: image.PixelMap) => { 254 if (error) { 255 console.error(`Failed to fetch AlbumCover, error = ${JSON.stringify(error)}`); 256 return; 257 } 258 pixel_map = pixelMap; 259 }); 260} 261``` 262 263## fetchAlbumCover<sup>11+</sup> 264 265fetchAlbumCover(): Promise\<image.PixelMap> 266 267异步方式获取专辑封面。通过Promise获取返回值。 268 269**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 270 271**返回值:** 272 273| 类型 | 说明 | 274| -------------- | ---------------------------------------- | 275| Promise\<[image.PixelMap](../apis-image-kit/arkts-apis-image-PixelMap.md)> | Promise对象。异步返回专辑封面。 | 276 277**错误码:** 278 279以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 280 281| 错误码ID | 错误信息 | 282| -------- | ----------------------------------------- | 283| 5400102 | Operation not allowed. Returned by promise. | 284| 5400106 | Unsupported format. Returned by promise. | 285 286**示例:** 287 288```ts 289import { BusinessError } from '@kit.BasicServicesKit'; 290import { image } from '@kit.ImageKit'; 291import { media } from '@kit.MediaKit'; 292 293async function test() { 294 // 创建AVMetadataExtractor对象。 295 let avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor(); 296 let pixel_map : image.PixelMap | undefined = undefined; 297 298 avMetadataExtractor.fetchAlbumCover().then((pixelMap: image.PixelMap) => { 299 pixel_map = pixelMap; 300 }).catch((error: BusinessError) => { 301 console.error(`Failed to fetch AlbumCover, error message:${error.message}`); 302 }); 303} 304``` 305 306## release<sup>11+</sup> 307 308release(callback: AsyncCallback\<void>): void 309 310异步方式释放资源。通过注册回调函数获取返回值。 311 312**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 313 314**参数:** 315 316| 参数名 | 类型 | 必填 | 说明 | 317| -------- | -------------------------------------------- | ---- | ----------------------------------- | 318| callback | AsyncCallback\<void> | 是 |回调函数。当释放资源成功,err为undefined,否则为错误对象。 | 319 320**错误码:** 321 322以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 323 324| 错误码ID | 错误信息 | 325| -------- | ------------------------------------------ | 326| 5400102 | Operation not allowed. Returned by callback. | 327 328**示例:** 329 330```ts 331import { BusinessError } from '@kit.BasicServicesKit'; 332import { media } from '@kit.MediaKit'; 333 334async function test() { 335 // 创建AVMetadataExtractor对象。 336 let avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor(); 337 avMetadataExtractor.release((error: BusinessError) => { 338 if (error) { 339 console.error(`Failed to release, err = ${JSON.stringify(error)}`); 340 return; 341 } 342 console.info(`Succeeded in releasing.`); 343 }); 344} 345``` 346 347## release<sup>11+</sup> 348 349release(): Promise\<void> 350 351异步方式释放资源。通过Promise获取返回值。 352 353**系统能力:** SystemCapability.Multimedia.Media.AVMetadataExtractor 354 355**返回值:** 356 357| 类型 | 说明 | 358| -------------- | ---------------------------------------- | 359| Promise\<void> | 异步方式释放资源release方法的Promise返回值。 | 360 361**错误码:** 362 363以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 364 365| 错误码ID | 错误信息 | 366| -------- | ----------------------------------------- | 367| 5400102 | Operation not allowed. Returned by promise. | 368 369**示例:** 370 371```ts 372import { BusinessError } from '@kit.BasicServicesKit'; 373import { media } from '@kit.MediaKit'; 374 375async function test() { 376 // 创建AVMetadataExtractor对象。 377 let avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor(); 378 avMetadataExtractor.release().then(() => { 379 console.info(`Succeeded in releasing.`); 380 }).catch((error: BusinessError) => { 381 console.error(`Failed to release, error message:${error.message}`); 382 }); 383} 384``` 385