1# Interface (AVTranscoder) 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视频转码管理类,用于视频转码。在调用AVTranscoder的方法前,需要先通过[createAVTranscoder()](arkts-apis-media-f.md#mediacreateavtranscoder12)构建一个AVTranscoder实例。 15 16视频转码demo可参考:[视频转码开发指导](../../media/media/using-avtranscoder-for-transcodering.md) 17 18## 导入模块 19 20```ts 21import { media } from '@kit.MediaKit'; 22``` 23 24## 属性 25 26**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 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)传递给 AVTranscoder 实例之后,请不要通过该资源句柄做其他读写操作,包括但不限于将同一个资源句柄传递给多个 AVPlayer / AVMetadataExtractor / AVImageGenerator / AVTranscoder。同一时间通过同一个资源句柄读写文件时存在竞争关系,将导致视频转码数据获取异常。 | 31| fdDst<sup>12+</sup> | number | 否 | 否 | 目标媒体文件描述,通过该属性设置数据输出。在创建AVTranscoder实例后,必须设置fdSrc和fdDst属性。<br>**说明:** <br> - 将资源句柄(fd)传递给 AVTranscoder 实例之后,请不要通过该资源句柄做其他读写操作,包括但不限于将同一个资源句柄传递给多个 AVPlayer / AVMetadataExtractor / AVImageGenerator / AVTranscoder。同一时间通过同一个资源句柄读写文件时存在竞争关系,将导致视频转码数据获取异常。 | 32 33## prepare<sup>12+</sup> 34 35prepare(config: AVTranscoderConfig): Promise\<void> 36 37异步方式进行视频转码的参数设置。通过Promise获取返回值。 38 39**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 40 41**参数:** 42 43| 参数名 | 类型 | 必填 | 说明 | 44| ------ | -------------------------------------- | ---- | -------------------------- | 45| config | [AVTranscoderConfig](arkts-apis-media-i.md#avtranscoderconfig12) | 是 | 配置视频转码的相关参数。 <!--RP1--><!--RP1End-->| 46 47**返回值:** 48 49| 类型 | 说明 | 50| -------------- | ------------------------------------------ | 51| Promise\<void> | 异步视频转码prepare方法的Promise返回值。 | 52 53**错误码:** 54 55以下错误码的详细介绍请参见[通用错误码说明文档](../errorcode-universal.md)和[媒体错误码](errorcode-media.md)。 56 57| 错误码ID | 错误信息 | 58| -------- | -------------------------------------- | 59| 401 | The parameter check failed. Return by promise. | 60| 5400102 | Operation not allowed. Return by promise. | 61| 5400103 | IO error. Return by promise. | 62| 5400105 | Service died. Return by promise. | 63| 5400106 | Unsupported format. Returned by promise. | 64 65**示例:** 66 67```ts 68import { BusinessError } from '@kit.BasicServicesKit'; 69import { media } from '@kit.MediaKit'; 70 71async function test() { 72 // 创建转码实例。 73 let avTranscoder = await media.createAVTranscoder(); 74 // 配置参数以实际硬件设备支持的范围为准。 75 let avTranscoderConfig: media.AVTranscoderConfig = { 76 audioBitrate : 200000, 77 audioCodec : media.CodecMimeType.AUDIO_AAC, 78 fileFormat : media.ContainerFormatType.CFT_MPEG_4, 79 videoBitrate : 3000000, 80 videoCodec : media.CodecMimeType.VIDEO_AVC, 81 }; 82 83 avTranscoder.prepare(avTranscoderConfig).then(() => { 84 console.info('prepare success'); 85 }).catch((err: BusinessError) => { 86 console.error('prepare failed and catch error is ' + err.message); 87 }); 88} 89``` 90 91## start<sup>12+</sup> 92 93start(): Promise\<void> 94 95异步方式开始视频转码。通过Promise获取返回值。 96 97需要[prepare()](#prepare12)事件成功触发后,才能调用start方法。 98 99**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 100 101**返回值:** 102 103| 类型 | 说明 | 104| -------------- | ------------------------------------- | 105| Promise\<void> | 异步开始视频转码方法的Promise返回值。 | 106 107**错误码:** 108 109以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 110 111| 错误码ID | 错误信息 | 112| -------- | -------------------------------------- | 113| 5400102 | Operation not allowed. Return by promise. | 114| 5400103 | IO error. Return by promise. | 115| 5400105 | Service died. Return by promise. | 116 117**示例:** 118 119```ts 120import { BusinessError } from '@kit.BasicServicesKit'; 121import { media } from '@kit.MediaKit'; 122 123async function test() { 124 // 创建转码实例。 125 let avTranscoder = await media.createAVTranscoder(); 126 avTranscoder.start().then(() => { 127 console.info('start AVTranscoder success'); 128 }).catch((err: BusinessError) => { 129 console.error('start AVTranscoder failed and catch error is ' + err.message); 130 }); 131} 132``` 133 134## pause<sup>12+</sup> 135 136pause(): Promise\<void> 137 138异步方式暂停视频转码。通过Promise获取返回值。 139 140需要[start()](#start12)事件成功触发后,才能调用pause方法,可以通过调用[resume()](#resume12)接口来恢复转码。 141 142**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 143 144**返回值:** 145 146| 类型 | 说明 | 147| -------------- | ------------------------------------- | 148| Promise\<void> | 异步暂停视频转码方法的Promise返回值。 | 149 150**错误码:** 151 152以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 153 154| 错误码ID | 错误信息 | 155| -------- | -------------------------------------- | 156| 5400102 | Operation not allowed. Return by promise. | 157| 5400103 | IO error. Return by promise. | 158| 5400105 | Service died. Return by promise. | 159 160**示例:** 161 162```ts 163import { BusinessError } from '@kit.BasicServicesKit'; 164import { media } from '@kit.MediaKit'; 165 166async function test() { 167 // 创建转码实例。 168 let avTranscoder = await media.createAVTranscoder(); 169 avTranscoder.pause().then(() => { 170 console.info('pause AVTranscoder success'); 171 }).catch((err: BusinessError) => { 172 console.error('pause AVTranscoder failed and catch error is ' + err.message); 173 }); 174} 175``` 176 177## resume<sup>12+</sup> 178 179resume(): Promise\<void> 180 181异步方式恢复视频转码。通过Promise获取返回值。 182 183需要在[pause()](#pause12)事件成功触发后,才能调用resume方法。 184 185**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 186 187**返回值:** 188 189| 类型 | 说明 | 190| -------------- | ------------------------------------- | 191| Promise\<void> | 异步恢复视频转码方法的Promise返回值。 | 192 193**错误码:** 194 195以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 196 197| 错误码ID | 错误信息 | 198| -------- | -------------------------------------- | 199| 5400102 | Operation not allowed. Return by promise. | 200| 5400103 | IO error. Return by promise. | 201| 5400105 | Service died. Return by promise. | 202 203**示例:** 204 205```ts 206import { BusinessError } from '@kit.BasicServicesKit'; 207import { media } from '@kit.MediaKit'; 208 209async function test() { 210 // 创建转码实例。 211 let avTranscoder = await media.createAVTranscoder(); 212 avTranscoder.resume().then(() => { 213 console.info('resume AVTranscoder success'); 214 }).catch((err: BusinessError) => { 215 console.error('resume AVTranscoder failed and catch error is ' + err.message); 216 }); 217} 218``` 219 220## cancel<sup>12+</sup> 221 222cancel(): Promise\<void> 223 224异步方式取消视频转码。通过Promise获取返回值。 225 226需要在[prepare()](#prepare12)、[start()](#start12)、[pause()](#pause12)或[resume()](#resume12)事件成功触发后,才能调用cancel方法。 227 228**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 229 230**返回值:** 231 232| 类型 | 说明 | 233| -------------- | ------------------------------------- | 234| Promise\<void> | 异步取消视频转码方法的Promise返回值。 | 235 236**错误码:** 237 238以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 239 240| 错误码ID | 错误信息 | 241| -------- | -------------------------------------- | 242| 5400102 | Operation not allowed. Return by promise. | 243| 5400103 | IO error. Return by promise. | 244| 5400105 | Service died. Return by promise. | 245 246**示例:** 247 248```ts 249import { BusinessError } from '@kit.BasicServicesKit'; 250import { media } from '@kit.MediaKit'; 251 252async function test() { 253 // 创建转码实例。 254 let avTranscoder = await media.createAVTranscoder(); 255 avTranscoder.cancel().then(() => { 256 console.info('cancel AVTranscoder success'); 257 }).catch((err: BusinessError) => { 258 console.error('cancel AVTranscoder failed and catch error is ' + err.message); 259 }); 260} 261``` 262 263## release<sup>12+</sup> 264 265release(): Promise\<void> 266 267异步方式释放视频转码资源。通过Promise获取返回值。 268 269释放视频转码资源之后,该AVTranscoder实例不能再进行任何操作。 270 271**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 272 273**返回值:** 274 275| 类型 | 说明 | 276| -------------- | ------------------------------------------- | 277| Promise\<void> | 异步释放视频转码资源方法的Promise返回值。 | 278 279**错误码:** 280 281以下错误码的详细介绍请参见[媒体错误码](errorcode-media.md)。 282 283| 错误码ID | 错误信息 | 284| -------- | --------------------------------- | 285| 5400102 | Operation not allowed. Return by promise. | 286| 5400105 | Service died. Return by promise. | 287 288**示例:** 289 290```ts 291import { BusinessError } from '@kit.BasicServicesKit'; 292import { media } from '@kit.MediaKit'; 293 294async function test() { 295 // 创建转码实例。 296 let avTranscoder = await media.createAVTranscoder(); 297 avTranscoder.release().then(() => { 298 console.info('release AVTranscoder success'); 299 }).catch((err: BusinessError) => { 300 console.error('release AVTranscoder failed and catch error is ' + err.message); 301 }); 302} 303``` 304 305## on('progressUpdate')<sup>12+</sup> 306 307on(type: 'progressUpdate', callback: Callback\<number>): void 308 309注册转码进度更新事件,并通过注册的回调方法通知开发者。开发者只能注册一个进度更新事件的回调方法,当开发者重复注册时,以最后一次注册的回调接口为准。 310 311**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 312 313**参数:** 314 315| 参数名 | 类型 | 必填 | 说明 | 316| -------- | -------- | ---- | ------------------------------------------------------------ | 317| type | string | 是 | 进度更新事件回调类型,支持的事件:'progressUpdate',在转码过程中系统会自动触发此事件。 | 318| callback | [Callback\<number>](../apis-basic-services-kit/js-apis-base.md#callback) | 是 | 进度更新事件回调方法,progress: number,表示当前转码进度。 | 319 320**示例:** 321 322```ts 323import { media } from '@kit.MediaKit'; 324 325async function test() { 326 // 创建转码实例。 327 let avTranscoder = await media.createAVTranscoder(); 328 avTranscoder.on('progressUpdate', (progress: number) => { 329 console.info('avTranscoder progressUpdate = ' + progress); 330 }); 331} 332``` 333 334## off('progressUpdate')<sup>12+</sup> 335 336off(type:'progressUpdate', callback?: Callback\<number>): void 337 338取消注册转码进度更新事件。 339 340**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 341 342**参数:** 343 344| 参数名 | 类型 | 必填 | 说明 | 345| ------ | ------ | ---- | ------------------------------------------------------------ | 346| type | string | 是 | 进度更新事件回调类型,支持的事件:'progressUpdate'。 | 347| callback | [Callback\<number>](../apis-basic-services-kit/js-apis-base.md#callback) | 否 | 已注册的进度更新事件回调。由于当前回调注册时,仅会保留最后一次注册的回调,建议此参数缺省。 | 348 349**示例:** 350 351```ts 352import { media } from '@kit.MediaKit'; 353 354async function test() { 355 // 创建转码实例。 356 let avTranscoder = await media.createAVTranscoder(); 357 avTranscoder.off('progressUpdate'); 358} 359``` 360 361## on('error')<sup>12+</sup> 362 363on(type: 'error', callback: ErrorCallback): void 364 365注册AVtranscoder的错误事件,该事件仅用于错误提示。如果AVTranscoder上报error事件,开发者需要通过[release()](#release12)退出转码操作。 366 367开发者只能订阅一个错误事件的回调方法,当开发者重复订阅时,以最后一次订阅的回调接口为准。 368 369**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 370 371**参数:** 372 373| 参数名 | 类型 | 必填 | 说明 | 374| -------- | ------------- | ---- | ------------------------------------------------------------ | 375| type | string | 是 | 转码错误事件回调类型'error'。 <br>- 'error':录制过程中发生错误,触发该事件。 | 376| callback | [ErrorCallback](../apis-basic-services-kit/js-apis-base.md#errorcallback) | 是 | 转码错误事件回调方法。 | 377 378**错误码:** 379 380以下错误码的详细介绍请参见[通用错误码说明文档](../errorcode-universal.md)和[媒体错误码](errorcode-media.md)。 381 382| 错误码ID | 错误信息 | 383| -------- | ------------------------------------------ | 384| 401 | The parameter check failed. | 385| 801 | Capability not supported. | 386| 5400101 | No memory. | 387| 5400102 | Operation not allowed. | 388| 5400103 | I/O error. | 389| 5400104 | Time out. | 390| 5400105 | Service died. | 391| 5400106 | Unsupported format. | 392 393**示例:** 394 395```ts 396import { BusinessError } from '@kit.BasicServicesKit'; 397import { media } from '@kit.MediaKit'; 398 399async function test() { 400 // 创建转码实例。 401 let avTranscoder = await media.createAVTranscoder(); 402 avTranscoder.on('error', (err: BusinessError) => { 403 console.info('case avTranscoder.on(error) called, errMessage is ' + err.message); 404 }); 405} 406``` 407 408## off('error')<sup>12+</sup> 409 410off(type:'error', callback?: ErrorCallback): void 411 412取消注册转码错误事件,取消后不再接收到AVTranscoder的错误事件。 413 414**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 415 416**参数:** 417 418| 参数名 | 类型 | 必填 | 说明 | 419| ------ | ------ | ---- | ------------------------------------------------------------ | 420| type | string | 是 | 转码错误事件回调类型'error'。 <br>- 'error':转码过程中发生错误,触发该事件。 | 421| callback | [ErrorCallback](../apis-basic-services-kit/js-apis-base.md#errorcallback) | 否 | 错误事件回调方法。 | 422 423**示例:** 424 425```ts 426import { media } from '@kit.MediaKit'; 427 428async function test() { 429 // 创建转码实例。 430 let avTranscoder = await media.createAVTranscoder(); 431 avTranscoder.off('error'); 432} 433``` 434 435## on('complete')<sup>12+</sup> 436 437on(type: 'complete', callback: Callback\<void>): void 438 439注册转码完成事件,并通过注册的回调方法通知开发者。开发者只能注册一个进度更新事件的回调方法,当开发者重复注册时,以最后一次注册的回调接口为准。 440 441当AVTranscoder上报complete事件时,当前转码操作已完成,开发者需要通过[release()](#release12)退出转码操作。 442 443**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 444 445**参数:** 446 447| 参数名 | 类型 | 必填 | 说明 | 448| -------- | -------- | ---- | ------------------------------------------------------------ | 449| type | string | 是 | 完成事件回调类型,支持的事件:'complete',在转码过程中系统会自动触发此事件。 | 450| callback | [Callback\<void>](../apis-basic-services-kit/js-apis-base.md#callback) | 是 | 完成事件回调方法。 | 451 452**示例:** 453 454```ts 455import { media } from '@kit.MediaKit'; 456 457async function test() { 458 let avTranscoder: media.AVTranscoder | undefined = undefined; 459 // 创建转码实例。 460 avTranscoder = await media.createAVTranscoder(); 461 avTranscoder.on('complete', async () => { 462 console.info('avTranscoder complete'); 463 if (avTranscoder != undefined) { 464 // 开发者须在此监听转码完成事件。 465 // 须等待avTranscoder.release()释放转码实例之后,再对转码后的文件进行转发、上传、转存等处理。 466 await avTranscoder.release(); 467 avTranscoder = undefined; 468 } 469 }); 470} 471``` 472 473## off('complete')<sup>12+</sup> 474 475off(type:'complete', callback?: Callback\<void>): void 476 477取消注册转码完成事件。 478 479**系统能力:** SystemCapability.Multimedia.Media.AVTranscoder 480 481**参数:** 482 483| 参数名 | 类型 | 必填 | 说明 | 484| ------ | ------ | ---- | ------------------------------------------------------------ | 485| type | string | 是 | 转码完成事件回调类型,支持的事件:'complete'。 | 486| callback | [Callback\<void>](../apis-basic-services-kit/js-apis-base.md#callback) | 否 | 完成事件回调方法。 | 487 488**示例:** 489 490```ts 491import { media } from '@kit.MediaKit'; 492 493async function test() { 494 // 创建转码实例。 495 let avTranscoder = await media.createAVTranscoder(); 496 avTranscoder.off('complete'); 497} 498``` 499