diff --git a/zh-cn/application-dev/media/avplayer-playback.md b/zh-cn/application-dev/media/avplayer-playback.md new file mode 100644 index 0000000000000000000000000000000000000000..bf14c204cedc43a1d601462a5a31482e4fa741a8 --- /dev/null +++ b/zh-cn/application-dev/media/avplayer-playback.md @@ -0,0 +1,520 @@ +# AVPlayer播放器开发指导 + +## 简介 + +AVPlayer主要工作是将Audio/Video媒体资源转码为可供渲染的图像和可听见的音频模拟信号,并通过输出设备进行播放,同时对播放任务进行管理,包括开始播放、暂停播放、停止播放、释放资源、设置音量、跳转播放位置、获取轨道信息等功能控制。 + +## 运作机制 + +该模块提供了播放状态变化示意图[AVPlayerState](../reference/apis/js-apis-media.md#avplayerstate9)、音频播放外部模块交互图和视频播放外部模块交互图。 + +**图1** 播放状态变化示意图 + +![zh-ch_image_avplayer_state_machine](figures/zh-ch_image_avplayer_state_machine.png) + + +**图2** 音频播放外部模块交互图 + +![zh-ch_image_avplayer_audio](figures/zh-ch_image_avplayer_audio.png) + +**说明**:应用通过调用JS接口层提供的AVPlayer js接口实现相应功能时,框架层会通过Player Framework的播放服务解析成音频数据流,音频数据流经过软件解码后输出至Audio Framework的音频服务,由音频子系统输出至硬件接口层的音频HDI,实现音频播放功能。完整的音乐播放器工作需要:应用(应用适配)、Player Framework、Audio Framework、Audio HDI(驱动适配)共同实现。 + +*注意:音频播放需要音频子系统配合* + +1. 应用把url传递给AVPlayer JS。 +2. 播放服务把音频PCM数据流输出给音频服务,音频服务输出给Audio HDI。 + + +**图3** 视频播放外部模块交互图 + +![zh-ch_image_avplayer_video](figures/zh-ch_image_avplayer_video.png) + +**说明**:应用通过调用JS接口层提供的AVPlayer js接口实现相应功能时,框架层会通过Player Framework的播放服务解析成单独的音频数据流和视频数据流,音频数据流经过软件解码后输出至Audio Framework的音频服务,由音频子系统输出至硬件接口层的音频HDI,实现音频播放功能。视频数据流经过硬件(推荐)/软件解码后输出至Graphic Framework的渲染服务(Renderer Service),由RS子系统输出至硬件接口层的显示HDI。完整的视频播放器工作需要:应用(应用适配)、XCompomemt组件、Player Framework、Graphic Framework、Audio Framework、Display HDI(驱动适配)和Audio HDI(驱动适配)共同实现。 + +*注意:视频播放需要显示、音频、解码等多个子系统配合。* + +1. 应用从Xcomponent组件获取surfaceID,[获取方式](../reference/arkui-ts/ts-basic-components-xcomponent.md)。 +2. 应用把url、surfaceID传递给AVPlayer JS。 +3. 播放服务把视频ES数据流输出给Codec HDI,解码获得视频帧(NV12/NV21/RGBA)。 +4. 播放服务把音频PCM数据流输出给音频服务,音频服务输出给Audio HDI。 +5. 播放服务把视频帧(NV12/NV21/RGBA)输出给RS服务,RS服务输出给Display HDI。 + +## 兼容性说明 + +推荐使用主流的播放格式和主流分辨率,不建议开发者自制非常或者异常码流,以免产生无法播放、卡住、花屏等兼容性问题。若发生此类问题不会影响系统,退出码流播放即可。 + +主流的播放格式和主流分辨率如下: + +| 视频容器规格 | 规格描述 | 分辨率 | +| :----------: | :-----------------------------------------------: | :--------------------------------: | +| mp4 | 视频格式:H264/MPEG2/MPEG4/H263 音频格式:AAC/MP3 | 主流分辨率,如1080P/720P/480P/270P | +| mkv | 视频格式:H264/MPEG2/MPEG4/H263 音频格式:AAC/MP3 | 主流分辨率,如1080P/720P/480P/270P | +| ts | 视频格式:H264/MPEG2/MPEG4 音频格式:AAC/MP3 | 主流分辨率,如1080P/720P/480P/270P | +| webm | 视频格式:VP8 音频格式:VORBIS | 主流分辨率,如1080P/720P/480P/270P | + +| 音频容器规格 | 规格描述 | +| :----------: | :----------: | +| m4a | 音频格式:AAC | +| aac | 音频格式:AAC | +| mp3 | 音频格式:MP3 | +| ogg | 音频格式:VORBIS | +| wav | 音频格式:PCM | + +## 开发指导 + +详细API含义可参考:[媒体服务API文档AVPlayer](../reference/apis/js-apis-media.md#avplayer9) + +### 播放流程说明 + +播放的全流程场景包含:创建实例,设置资源,设置窗口(视频),准备播放(获取轨道信息/音量/倍速/焦点模式/缩放模式/设置bitrates),播控(播放/暂停/Seek/音量/停止),重置资源,销毁播放 + +1:创建实例[createAVPlayer()](../reference/apis/js-apis-media.md#mediacreateavplayer9),AVPlayer初始化[idle](#avplayer_state)状态 + +2:设置业务需要的监听事件,搭配全流程场景使用 + +3:设置资源 [url](../reference/apis/js-apis-media.md#avplayer_属性),AVPlayer进入[initialized](#avplayer_state)状态,此时可以设置视频窗口 [surfaceId](../reference/apis/js-apis-media.md#avplayer_属性),支持的规格可参考:[AVPlayer属性说明](../reference/apis/js-apis-media.md#avplayer_属性) + +4:准备播放 [prepare()](../reference/apis/js-apis-media.md#avplayer_prepare),AVPlayer进入[prepared](#avplayer_state)状态 + +5:视频播控:播放 [play()](../reference/apis/js-apis-media.md#avplayer_play),暂停 [pause()](../reference/apis/js-apis-media.md#avplayer_pause),跳转 [seek()](../reference/apis/js-apis-media.md#avplayer_seek),停止 [stop()](../reference/apis/js-apis-media.md#avplayer_stop) 等操作 + +6:重置资源 [reset()](../reference/apis/js-apis-media.md#avplayer_reset),AVPlayer重新进入[idle](#avplayer_state)状态,允许更换资源 [url](../reference/apis/js-apis-media.md#avplayer_属性) + +7:销毁播放 [release()](../reference/apis/js-apis-media.md#avplayer_release),AVPlayer进入[released](#avplayer_state)状态,退出播放 + +> **说明:** +> +> prepared/playing/paused/compeled 状态时,播放引擎处于工作状态,这需要占用系统较多的运行内存,当客户端暂时不使用播放器时,要求调用 reset() 或 release() 回收。 + +### 监听事件 + +| 事件类型 | 说明 | +| ------------------------------------------------- | ------------------------------------------------------------ | +| stateChange | 必要事件,监听播放器的状态机 | +| error | 必要事件,监听播放器的错误信息 | +| durationUpdate | 用于进度条,监听进度条长度,刷新资源时长 | +| timeUpdate | 用于进度条,监听进度条当前位置,刷新当前时间 | +| seekDone | 响应api调用,监听seek()请求完成情况 | +| speedDone | 响应api调用,监听setSpeed()请求完成情况 | +| volumeChange | 响应api调用,监听setVolume()请求完成情况 | +| bitrateDone | 响应api调用,用于HLS协议流,监听setBitrate()请求完成情况 | +| availableBitrates | 用于HLS协议流,监听HLS资源的可选bitrates,用于setBitrate() | +| bufferingUpdate | 用于网络播放,监听网络播放缓冲信息 | +| startRenderFrame | 用于视频播放,监听视频播放首帧渲染时间 | +| videoSizeChange | 用于视频播放,监听视频播放的宽高信息,可用于调整窗口大小、比例 | +| audioInterrupt | 用于视频播放,监听音频焦点切换信息,搭配属性audioInterruptMode使用 | + +### + +### 全量接口示例 + +```js +import media from '@ohos.multimedia.media' +import audio from '@ohos.multimedia.audio'; +import fileIO from '@ohos.fileio' + +const TAG = 'AVPlayerDemo:' +export class AVPlayerDemo { + private count:number = 0 + private avPlayer + private surfaceID:string // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接见上面Xcomponent创建方法 + + // 注册avplayer回调函数 + setAVPlayerCallback() { + // 状态机变化回调函数 + this.avPlayer.on('stateChange', async (state, reason) => { + switch (state) { + case 'idle': // 成功调用reset接口后触发该状态机上报 + console.info(TAG + 'state idle called') + this.avPlayer.release() // 释放avplayer对象 + break; + case 'initialized': // avplayer 设置播放源后触发该状态上报 + console.info(TAG + 'state initialized called ') + this.avPlayer.surfaceId = this.surfaceID // 设置显示画面,当播放的资源为纯音频时无需设置 + this.avPlayer.prepare().then(() => { + console.info(TAG+ 'prepare success'); + }, (err) => { + console.error(TAG + 'prepare filed,error message is :' + err.message) + }) + break; + case 'prepared': // prepare调用成功后上报该状态机 + console.info(TAG + 'state prepared called') + this.avPlayer.play() // 调用播放接口开始播放 + break; + case 'playing': // play成功调用后触发该状态机上报 + console.info(TAG + 'state playing called') + if (this.count == 0) { + this.avPlayer.pause() // 调用暂停播放接口 + } else { + this.avPlayer.seek(10000, media.SeekMode.SEEK_PREV_SYNC) // 前向seek置10秒处,触发seekDone回调函数 + } + break; + case 'paused': // pause成功调用后触发该状态机上报 + console.info(TAG + 'state paused called') + if (this.count == 0) { + this.count++ + this.avPlayer.play() // 继续调用播放接口开始播放 + } + break; + case 'completed': // 播放结束后触发该状态机上报 + console.info(TAG + 'state completed called') + this.avPlayer.stop() //调用播放结束接口 + break; + case 'stopped': // stop接口成功调用后触发该状态机上报 + console.info(TAG + 'state stopped called') + this.avPlayer.reset() // 调用reset接口初始化avplayer状态 + break; + case 'released': + console.info(TAG + 'state released called') + break; + case 'error': + console.info(TAG + 'state error called') + break; + default: + console.info(TAG + 'unkown state :' + state) + break; + } + }) + // 时间上报监听函数 + this.avPlayer.on('timeUpdate', (time:number) => { + console.info(TAG + 'timeUpdate success,and new time is :' + time) + }) + // 音量变化回调函数 + this.avPlayer.on('volumeChange', (vol:number) => { + console.info(TAG + 'volumeChange success,and new volume is :' + vol) + this.avPlayer.setSpeed(media.AVPlayerSpeed.SPEED_FORWARD_2_00_X) // 设置两倍速播放,并触发speedDone回调 + }) + // 视频播放结束触发回调 + this.avPlayer.on('endOfStream', () => { + console.info(TAG + 'endOfStream success') + }) + // seek操作回调函数 + this.avPlayer.on('seekDone', (seekDoneTime:number) => { + console.info(TAG + 'seekDone success,and seek time is:' + seekDoneTime) + this.avPlayer.setVolume(0.5) // 设置音量为0.5,并触发volumeChange回调函数 + }) + // 设置倍速播放回调函数 + this.avPlayer.on('speedDone', (speed:number) => { + console.info(TAG + 'speedDone success,and speed value is:' + speed) + }) + // bitrate设置成功回调函数 + this.avPlayer.on('bitrateDone', (bitrate:number) => { + console.info(TAG + 'bitrateDone success,and bitrate value is:' + bitrate) + }) + // 缓冲上报回调函数 + this.avPlayer.on('bufferingUpdate', (infoType: media.BufferingInfoType, value: number) => { + console.info(TAG + 'bufferingUpdate success,and infoType value is:' + infoType + ', value is :' + value) + }) + // 首帧上报回调函数 + this.avPlayer.on('startRenderFrame', () => { + console.info(TAG + 'startRenderFrame success') + }) + // 视频宽高上报回调函数 + this.avPlayer.on('videoSizeChange', (width: number, height: number) => { + console.info(TAG + 'videoSizeChange success,and width is:' + width + ', height is :' + height) + }) + // 焦点上报回调函数 + this.avPlayer.on('audioInterrupt', (info: audio.InterruptEvent) => { + console.info(TAG + 'audioInterrupt success,and InterruptEvent info is:' + info) + }) + // HLS上报所有支持的比特率 + this.avPlayer.on('availableBitrates', (bitrates: Array) => { + console.info(TAG + 'availableBitrates success,and availableBitrates length is:' + bitrates.length) + }) + } + + async avPlayerDemo() { + // 创建avPlayer实例对象 + this.avPlayer = await media.createAVPlayer() + let fdPath = 'fd://' + let pathDir = "/data/storage/el2/base/haps/entry/files" // pathDir在FA模型和Stage模型的获取方式不同,请参考开发步骤首行的说明,根据实际情况自行获取。 + // path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el2/100/base/ohos.acts.multimedia.media.avplayer/haps/entry/files" 命令,将其推送到设备上 + let path = pathDir + '/H264_AAC.mp4' + await fileIO.open(path).then((fdNumber) => { + fdPath = fdPath + '' + fdNumber + console.info('open fd success fd is' + fdPath) + }, (err) => { + console.info('open fd failed err is' + err) + }).catch((err) => { + console.info('open fd failed err is' + err) + }); + this.avPlayer.url = fdPath + } +} +``` + +### 正常播放场景 + +```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + +const TAG = 'AVPlayerDemo:' +export class AVPlayerDemo { + private avPlayer + private surfaceID:string // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接见上面Xcomponent创建方法 + + // 注册avplayer回调函数 + setAVPlayerCallback() { + // 状态机变化回调函数 + this.avPlayer.on('stateChange', async (state, reason) => { + switch (state) { + case 'idle': // 成功调用reset接口后触发该状态机上报 + console.info(TAG + 'state idle called') + break; + case 'initialized': // avplayer 设置播放源后触发该状态上报 + console.info(TAG + 'state initialized called ') + this.avPlayer.surfaceId = this.surfaceID // 设置显示画面,当播放的资源为纯音频时无需设置 + this.avPlayer.prepare().then(() => { + console.info(TAG+ 'prepare success'); + }, (err) => { + console.error(TAG + 'prepare filed,error message is :' + err.message) + }) + break; + case 'prepared': // prepare调用成功后上报该状态机 + console.info(TAG + 'state prepared called') + this.avPlayer.play() // 调用播放接口开始播放 + break; + case 'playing': // play成功调用后触发该状态机上报 + console.info(TAG + 'state playing called') + break; + case 'paused': // pause成功调用后触发该状态机上报 + console.info(TAG + 'state paused called') + break; + case 'completed': // 播放结束后触发该状态机上报 + console.info(TAG + 'state completed called') + this.avPlayer.stop() //调用播放结束接口 + break; + case 'stopped': // stop接口成功调用后触发该状态机上报 + console.info(TAG + 'state stopped called') + this.avPlayer.release() // 调用reset接口初始化avplayer状态 + break; + case 'released': + console.info(TAG + 'state released called') + break; + case 'error': + console.info(TAG + 'state error called') + break; + default: + console.info(TAG + 'unkown state :' + state) + break; + } + }) + } + + async avPlayerDemo() { + // 创建avPlayer实例对象 + this.avPlayer = await media.createAVPlayer() + let fdPath = 'fd://' + let pathDir = "/data/storage/el2/base/haps/entry/files" // pathDir在FA模型和Stage模型的获取方式不同,请参考开发步骤首行的说明,根据实际情况自行获取。 + // path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el2/100/base/ohos.acts.multimedia.media.avplayer/haps/entry/files" 命令,将其推送到设备上 + let path = pathDir + '/H264_AAC.mp4' + await fileIO.open(path).then((fdNumber) => { + fdPath = fdPath + '' + fdNumber + console.info('open fd success fd is' + fdPath) + }, (err) => { + console.info('open fd failed err is' + err) + }).catch((err) => { + console.info('open fd failed err is' + err) + }); + this.avPlayer.url = fdPath + } +} +``` + +### 视频切换场景 + +```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + +const TAG = 'AVPlayerDemo:' +export class AVPlayerDemo { + private count:number = 0 + private avPlayer + private surfaceID:string // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接见上面Xcomponent创建方法 + + // 注册avplayer回调函数 + setAVPlayerCallback() { + // 状态机变化回调函数 + this.avPlayer.on('stateChange', async (state, reason) => { + switch (state) { + case 'idle': // 成功调用reset接口后触发该状态机上报 + console.info(TAG + 'state idle called') + break; + case 'initialized': // avplayer 设置播放源后触发该状态上报 + console.info(TAG + 'state initialized called ') + this.avPlayer.surfaceId = this.surfaceID // 设置显示画面,当播放的资源为纯音频时无需设置 + this.avPlayer.prepare().then(() => { + console.info(TAG+ 'prepare success'); + }, (err) => { + console.error(TAG + 'prepare filed,error message is :' + err.message) + }) + break; + case 'prepared': // prepare调用成功后上报该状态机 + console.info(TAG + 'state prepared called') + this.avPlayer.loop = true // 设置单曲循环播放,单曲循环播放至结尾后会触发endOfStream回调 + this.avPlayer.play() // 调用播放接口开始播放 + break; + case 'playing': // play成功调用后触发该状态机上报 + console.info(TAG + 'state playing called') + break; + case 'paused': // pause成功调用后触发该状态机上报 + console.info(TAG + 'state paused called') + break; + case 'completed': // 播放结束后触发该状态机上报 + console.info(TAG + 'state completed called') + // 当第二次触发endOfStream回调后取消循环播放,再次播放到结尾后触发completed状态机上报 + this.avPlayer.stop() //调用播放结束接口 + break; + case 'stopped': // stop接口成功调用后触发该状态机上报 + console.info(TAG + 'state stopped called') + this.avPlayer.release() // 调用reset接口初始化avplayer状态 + break; + case 'released': + console.info(TAG + 'state released called') + break; + case 'error': + console.info(TAG + 'state error called') + break; + default: + console.info(TAG + 'unkown state :' + state) + break; + } + }) + // 视频播放结束触发回调 + this.avPlayer.on('endOfStream', () => { + console.info(TAG + 'endOfStream success') + if (this.count == 1) { + this.avPlayer.loop = false // 取消循环播放 + } else { + this.count++ + } + }) + } + + async avPlayerDemo() { + // 创建avPlayer实例对象 + this.avPlayer = await media.createAVPlayer() + let fdPath = 'fd://' + let pathDir = "/data/storage/el2/base/haps/entry/files" // pathDir在FA模型和Stage模型的获取方式不同,请参考开发步骤首行的说明,根据实际情况自行获取。 + // path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el2/100/base/ohos.acts.multimedia.media.avplayer/haps/entry/files" 命令,将其推送到设备上 + let path = pathDir + '/H264_AAC.mp4' + await fileIO.open(path).then((fdNumber) => { + fdPath = fdPath + '' + fdNumber + console.info('open fd success fd is' + fdPath) + }, (err) => { + console.info('open fd failed err is' + err) + }).catch((err) => { + console.info('open fd failed err is' + err) + }); + this.avPlayer.url = fdPath + } +} +``` +### 单曲循环场景 + +```js +import media from '@ohos.multimedia.media' +import fileIO from '@ohos.fileio' + +const TAG = 'AVPlayerDemo:' +export class AVPlayerDemo { + private count:number = 0 + private avPlayer + private surfaceID:string // surfaceID用于播放画面显示,具体的值需要通过Xcomponent接口获取,相关文档链接见上面Xcomponent创建方法 + + async nextVideo() { + let fdPath = 'fd://' + let pathDir = "/data/storage/el2/base/haps/entry/files" // pathDir在FA模型和Stage模型的获取方式不同,请参考开发步骤首行的说明,根据实际情况自行获取。 + // path路径的码流可通过"hdc file send D:\xxx\H264_MP3.mp4 /data/app/el2/100/base/ohos.acts.multimedia.media.avplayer/haps/entry/files" 命令,将其推送到设备上 + let path = pathDir + '/H264_MP3.mp4' + await fileIO.open(path).then((fdNumber) => { + fdPath = fdPath + '' + fdNumber + console.info('open fd success fd is' + fdPath) + }, (err) => { + console.info('open fd failed err is' + err) + }).catch((err) => { + console.info('open fd failed err is' + err) + }); + this.avPlayer.url = fdPath // 再次触发initialized状态机上报 + } + + // 注册avplayer回调函数 + setAVPlayerCallback() { + // 状态机变化回调函数 + this.avPlayer.on('stateChange', async (state, reason) => { + switch (state) { + case 'idle': // 成功调用reset接口后触发该状态机上报 + console.info(TAG + 'state idle called') + await this.nextVideo() // 切换下一个视频播放 + break; + case 'initialized': // avplayer 设置播放源后触发该状态上报 + console.info(TAG + 'state initialized called ') + this.avPlayer.surfaceId = this.surfaceID // 设置显示画面,当播放的资源为纯音频时无需设置 + this.avPlayer.prepare().then(() => { + console.info(TAG+ 'prepare success'); + }, (err) => { + console.error(TAG + 'prepare filed,error message is :' + err.message) + }) + break; + case 'prepared': // prepare调用成功后上报该状态机 + console.info(TAG + 'state prepared called') + this.avPlayer.play() // 调用播放接口开始播放 + break; + case 'playing': // play成功调用后触发该状态机上报 + console.info(TAG + 'state playing called') + break; + case 'paused': // pause成功调用后触发该状态机上报 + console.info(TAG + 'state paused called') + break; + case 'completed': // 播放结束后触发该状态机上报 + console.info(TAG + 'state completed called') + if (this.count == 0) { + this.count++ + this.avPlayer.reset() //调用重置接口准备切换下一个视频 + } else { + this.avPlayer.release() //切换视频后播放至结尾释放avplayer对象 + } + break; + case 'stopped': // stop接口成功调用后触发该状态机上报 + console.info(TAG + 'state stopped called') + break; + case 'released': + console.info(TAG + 'state released called') + break; + case 'error': + console.info(TAG + 'state error called') + break; + default: + console.info(TAG + 'unkown state :' + state) + break; + } + }) + } + + async avPlayerDemo() { + // 创建avPlayer实例对象 + this.avPlayer = await media.createAVPlayer() + let fdPath = 'fd://' + let pathDir = "/data/storage/el2/base/haps/entry/files" // pathDir在FA模型和Stage模型的获取方式不同,请参考开发步骤首行的说明,根据实际情况自行获取。 + // path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el2/100/base/ohos.acts.multimedia.media.avplayer/haps/entry/files" 命令,将其推送到设备上 + let path = pathDir + '/H264_AAC.mp4' + await fileIO.open(path).then((fdNumber) => { + fdPath = fdPath + '' + fdNumber + console.info('open fd success fd is' + fdPath) + }, (err) => { + console.info('open fd failed err is' + err) + }).catch((err) => { + console.info('open fd failed err is' + err) + }); + this.avPlayer.url = fdPath + } +} +``` + +## 相关示例 + +针对AVPlayer播放器开发,有以下相关示例可供参考: + +待补充 \ No newline at end of file diff --git a/zh-cn/application-dev/media/avrecorder.md b/zh-cn/application-dev/media/avrecorder.md new file mode 100644 index 0000000000000000000000000000000000000000..46399704aec81d2126664dbba9db3fd4fc0d80f7 --- /dev/null +++ b/zh-cn/application-dev/media/avrecorder.md @@ -0,0 +1,488 @@ +# 音视频录制开发指导 + +## 简介 + +音视频录制的主要工作是捕获音频信号,接收视频信号,完成音视频编码并保存到文件中,帮助开发者轻松实现音视频录制功能,包括开始录制、暂停录制、恢复录制、停止录制、释放资源等功能控制。它允许调用者指定录制的编码格式、封装格式、文件路径等参数。 + +## 运作机制 + +该模块提供了音视频录制状态变化示意图和音视频录制外部模块交互图。 + +**图1** 音视频录制状态变化示意图 + +![zh-ch_image_video_recorder_state_machine](figures/zh-ch_image_avrecorder_state_machine.png) + +**图2** 视频录制外部模块交互图--待修改 + +![zh-ch_image_video_recorder_zero](figures/zh-ch_image_avrecorder_module_interaction.png) + +**说明**:音频录制时,框架层会通过Native Framework的媒体服务,调用音频子系统通过音频HDI捕获音频数据,通过软件编码封装后保存至文件中,实现音频录制功能。视频录制时,由相机子系统通过视频HDI捕获图像数据,媒体服务将图像数据通过视频编码HDI编码,再将编码后的图像数据封装至文件中,实现视频录制功能。通过音视频录制组合,可分别实现纯音频录制、纯视频录制,音视频录制。 + +## 约束与限制 + +开发者在进行录制功能开发前,需要先对所开发的应用配置麦克风权限(ohos.permission.MICROPHONE)和相机权限(ohos.permission.CAMERA),权限配置相关内容可参考:[访问控制权限申请指导](../security/accesstoken-guidelines.md) + +## 开发指导 + +详细API含义可参考:[媒体服务API文档AVRecorder](../reference/apis/js-apis-media.md#avrecorder9) + +媒体库相关流程含义可参考:[媒体库管理](../reference/apis/js-apis-medialibrary.md) + +相机相关流程含义可参考:[相机管理](../reference/apis/js-apis-camera.md) + +### 音视频录制全流程场景 + +音视频录制全流程场景包含:创建实例、设置录制参数、获取输入surface、开始录制、暂停录制、恢复录制、停止录制、释放资源等流程。 + +音频录制相关配置参数范围,受到设备编解码性能,音频子系统性能等综合限制。 + +视频录制相关配置参数范围,受到设备编解码性能,相机子系统性能等综合限制。 + +``` +import media from '@ohos.multimedia.media' +import camera from '@ohos.multimedia.camera' +import mediaLibrary from '@ohos.multimedia.mediaLibrary' + +export class AVRecorderDemo { + private testFdNumber; // 用于保存fd地址 + + // 获取录制的音频文件fileName对应的fd,需借助媒体库能力。使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA. + async getFd(fileName) { + // 实现方式参考媒体库资料文档。 + this.testFdNumber = "fd://" + fdNumber.toString(); // e.g. fd://54 + } + + // 当promise接口发生错误上上报的错误回调接口 + failureCallback(error) { + console.info('error happened, error message is ' + error.message); + } + + // 当promise接口发生异常时,系统调用的错误回调接口 + catchCallback(error) { + console.info('catch error happened, error message is ' + error.message); + } + + async AVRecorderDemo() { + let AVRecorder; // AVRecorder空对象在createAVRecorder成功后赋值 + let surfaceID; // 从getInputSurface获取surfaceID,传递给相机的videoOutput + await this.getFd('01.mp4'); + + // 音视频录制相关参数配置 + let avProfile = { + audioBitrate : 48000, + audioChannels : 2, + audioCodec : media.CodecMimeType.AUDIO_AAC, + audioSampleRate : 48000, + fileFormat : media.ContainerFormatType.CFT_MPEG_4, + videoBitrate : 48000, + videoCodec : media.CodecMimeType.VIDEO_MPEG4, + videoFrameWidth : 640, + videoFrameHeight : 480, + videoFrameRate : 30 + } + let avConfig = { + audioSourceType : media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, + videoSourceType : media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, + profile : avProfile, + url : 'fd://', + rotation : 0, + location : { latitude : 30, longitude : 130 } + } + + // 创建AVRecorder对象 + await media.createAVRecorder().then((recorder) => { + console.info('case createAVRecorder called'); + if (typeof (recorder) != 'undefined') { + AVRecorder = recorder; + console.info('createAVRecorder success'); + } else { + console.info('createAVRecorder failed'); + } + }, this.failureCallback).catch(this.catchCallback); + + // 对象创建成功后创建on('stateChange')和on('error')监听回调用于监听状态机变化和错误上报 + AVRecorder.on('stateChange', async (state, reason) => { + console.info('case state has changed, new state is :' + state); + switch (state) { + // 用户可以根据需求在不同状态设置自己想要进行的行为 + case 'idle': + // 调用rest接口后触发idle状态;create后也在idle状态 + break; + case 'prepared': + // 调用prepare接口后触发prepared状态; + break; + case 'started': + // 调用start接口后触发started状态; + break; + case 'paused': + // 调用pause接口后触发paused状态; + break; + case 'stopped': + // 调用stop接口后触发stopped状态; + break; + case 'released': + // 调用release接口后触发released状态; + break; + case 'error': + // error状态说明底层出错,用户需排查错误,重新创建avRecorder; + break; + default: + console.info('case state is unknown'); + } + }); + AVRecorder.on('error', (err) => { + // 监听非接口类错误上报 + console.info('case avRecorder.on(error) called, errMessage is ' + err.message); + }); + + // 调用prepare完成音频录制前的准备工作;底层实际是根据prepare的入参来判断是音频录制、视频录制还是音视频录制 + await AVRecorder.prepare(avConfig).then(() => { + console.info('prepare success'); + }, this.failureCallback).catch(this.catchCallback); + + // 包含视频的录制需要调用getInputSurface接口,并将返回值surfaceID传递给camera相关接口 + await AVRecorder.getInputSurface().then((surface) => { + console.info('getInputSurface success'); + surfaceID = surface; // surfaceID给camera的createVideoOutput()作为其中的一个入参 + }, this.failureCallback).catch(this.catchCallback); + + // 视频录制依赖相机相关接口,以下需要先调用相机起流接口后才能继续执行,具体的相机接口调用请参考sample用例 + // 视频录制启动接口 + await AVRecorder.start().then(() => { + console.info('start success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用pause接口时需要暂停camera出流 + await AVRecorder.pause().then(() => { + console.info('pause success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用resume接口时需要恢复camera出流 + await AVRecorder.resume().then(() => { + console.info('resume success'); + }, this.failureCallback).catch(this.catchCallback); + + // 停止camera出流后,停止视频录制 + await AVRecorder.stop().then(() => { + console.info('stop success'); + }, this.failureCallback).catch(this.catchCallback); + + // 重置录制相关配置 + await AVRecorder.reset().then(() => { + console.info('reset success'); + }, this.failureCallback).catch(this.catchCallback); + + // 关闭监听回调,如果用户不自行调用off接口,在调用release后,设置的回调接口也会无效 + AVRecorder.off('stateChange'); + AVRecorder.off('error'); + + // 释放视频录制相关资源并释放camera对象相关资源 + await AVRecorder.release().then(() => { + console.info('release success'); + }, this.failureCallback).catch(this.catchCallback); + + // 相关对象置null + AVRecorder = undefined; + surfaceID = undefined; + } +} +``` + +### 纯音频录制全流程场景 + +纯音频录制全流程场景包含:创建实例、设置录制参数、开始录制、暂停录制、恢复录制、停止录制、释放资源等流程。 + +音频录制相关配置参数范围,受到设备编解码性能,音频子系统性能等综合限制。 + +``` +import media from '@ohos.multimedia.media' +import mediaLibrary from '@ohos.multimedia.mediaLibrary' + +export class AudioRecorderDemo { + private testFdNumber; // 用于保存fd地址 + + // 获取录制的音频文件fileName对应的fd,需借助媒体库能力。使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA + async getFd(fileName) { + // 实现方式参考媒体库资料文档。 + this.testFdNumber = "fd://" + fdNumber.toString(); // e.g. fd://54 + } + + // 当promise接口发生错误上报的错误回调接口 + failureCallback(error) { + console.info('error happened, error message is ' + error.message); + } + + // 当promise接口发生异常时,系统调用的错误回调接口 + catchCallback(error) { + console.info('catch error happened, error message is ' + error.message); + } + + async audioRecorderDemo() { + let audioRecorder; // audioRecorder空对象在createAVRecorder成功后赋值 + await this.getFd('01.m4a'); + // 音频录制相关参数配置 + let audioProfile = { + audioBitrate : 48000, + audioChannels : 2, + audioCodec : media.CodecMimeType.AUDIO_AAC, + audioSampleRate : 48000, + fileFormat : media.ContainerFormatType.CFT_MPEG_4, + } + let audioConfig = { + audioSourceType : media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, + profile : audioProfile, + url : this.testFdNumber, + rotation : 0, + location : { latitude : 30, longitude : 130 } + } + + // 创建audioRecorder对象 + await media.createAVRecorder().then((recorder) => { + console.info('case createAVRecorder called'); + if (typeof (recorder) != 'undefined') { + audioRecorder = recorder; + console.info('createAudioRecorder success'); + } else { + console.info('createAudioRecorder failed'); + } + }, this.failureCallback).catch(this.catchCallback); + + // 对象创建成功后创建on('stateChange')和on('error')监听回调用于监听状态机变化和错误上报 + audioRecorder.on('stateChange', async (state, reason) => { + console.info('case state has changed, new state is :' + state); + switch (state) { + // 用户可以根据需求在不同状态设置自己想要进行的行为 + case 'idle': + // 调用rest接口后触发idle状态;create后也在idle状态 + break; + case 'prepared': + // 调用prepare接口后触发prepared状态; + break; + case 'started': + // 调用start接口后触发started状态; + break; + case 'paused': + // 调用pause接口后触发paused状态; + break; + case 'stopped': + // 调用stop接口后触发stopped状态; + break; + case 'released': + // 调用release接口后触发released状态; + break; + case 'error': + // error状态说明底层出错,用户需排查错误,重新创建avRecorder; + break; + default: + console.info('case state is unknown'); + } + }); + audioRecorder.on('error', (err) => { + // 监听非接口类错误上报 + console.info('case avRecorder.on(error) called, errMessage is ' + err.message); + }); + + // 调用prepare完成音频录制前的准备工作;底层实际是根据prepare的入参来判断是音频录制、视频录制还是音视频录制 + await audioRecorder.prepare(audioConfig).then(() => { + console.info('prepare success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用start接口启动音频录制 + await audioRecorder.start().then(() => { + console.info('start success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用pause接口暂停音频录制 + await audioRecorder.pause().then(() => { + console.info('pause success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用resume接口恢复音频录制 + await audioRecorder.resume().then(() => { + console.info('resume success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用stop接口停止音频录制 + await audioRecorder.stop().then(() => { + console.info('stop success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用reset接口重置录制相关配置 + await audioRecorder.reset().then(() => { + console.info('reset success'); + }, this.failureCallback).catch(this.catchCallback); + + // 关闭监听回调,如果用户不自行调用off接口,在调用release后,设置的回调接口也会无效 + avRecorder.off('stateChange'); + avRecorder.off('error'); + + // 调用release接口释放音频录制相关资源 + await audioRecorder.release().then(() => { + console.info('release success'); + }, this.failureCallback).catch(this.catchCallback); + + // 相关对象置null + audioRecorder = undefined; + } +} + +``` + +### 纯视频录制全流程场景 + +纯视频录制全流程场景包含:创建实例、设置录制参数、获取输入surface、开始录制、暂停录制、恢复录制、停止录制、释放资源等流程。 + +视频录制相关配置参数范围,受到设备编解码性能,相机子系统性能等综合限制。 + +``` +import media from '@ohos.multimedia.media' +import camera from '@ohos.multimedia.camera' +import mediaLibrary from '@ohos.multimedia.mediaLibrary' + +export class VideoRecorderDemo { + private testFdNumber; // 用于保存fd地址 + + // 获取录制的音频文件fileName对应的fd,需借助媒体库能力。使用mediaLibrary需要添加以下权限, ohos.permission.MEDIA_LOCATION、ohos.permission.WRITE_MEDIA、ohos.permission.READ_MEDIA. + async getFd(fileName) { + // 实现方式参考媒体库资料文档。 + this.testFdNumber = "fd://" + fdNumber.toString(); // e.g. fd://54 + } + + // 当promise接口发生错误上上报的错误回调接口 + failureCallback(error) { + console.info('error happened, error message is ' + error.message); + } + + // 当promise接口发生异常时,系统调用的错误回调接口 + catchCallback(error) { + console.info('catch error happened, error message is ' + error.message); + } + + async videoRecorderDemo() { + let videoRecorder; // videoRecorder空对象在createAVRecorder成功后赋值 + let surfaceID; // 从getInputSurface获取surfaceID,传递给相机的videoOutput + await this.getFd('01.mp4'); + + // 纯视频录制相关参数配置 + let videoProfile = { + fileFormat : media.ContainerFormatType.CFT_MPEG_4, + videoBitrate : 48000, + videoCodec : media.CodecMimeType.VIDEO_MPEG4, + videoFrameWidth : 640, + videoFrameHeight : 480, + videoFrameRate : 30 + } + let videoConfig = { + videoSourceType : media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, + profile : videoProfile, + url : 'fd://', + rotation : 0, + location : { latitude : 30, longitude : 130 } + } + + // 创建videoRecorder对象 + await media.createAVRecorder().then((recorder) => { + console.info('case createVideoRecorder called'); + if (typeof (recorder) != 'undefined') { + videoRecorder = recorder; + console.info('createVideoRecorder success'); + } else { + console.info('createVideoRecorder failed'); + } + }, this.failureCallback).catch(this.catchCallback); + + // 对象创建成功后创建on('stateChange')和on('error')监听回调用于监听状态机变化和错误上报 + videoRecorder.on('stateChange', async (state, reason) => { + console.info('case state has changed, new state is :' + state); + switch (state) { + // 用户可以根据需求在不同状态设置自己想要进行的行为 + case 'idle': + // 调用rest接口后触发idle状态;create后也在idle状态 + break; + case 'prepared': + // 调用prepare接口后触发prepared状态; + break; + case 'started': + // 调用start接口后触发started状态; + break; + case 'paused': + // 调用pause接口后触发paused状态; + break; + case 'stopped': + // 调用stop接口后触发stopped状态; + break; + case 'released': + // 调用release接口后触发released状态; + break; + case 'error': + // error状态说明底层出错,用户需排查错误,重新创建avRecorder; + break; + default: + console.info('case state is unknown'); + } + }); + videoRecorder.on('error', (err) => { + // 监听非接口类错误上报 + console.info('case avRecorder.on(error) called, errMessage is ' + err.message); + }); + + // 调用prepare完成音频录制前的准备工作;底层实际是根据prepare的入参来判断是音频录制、视频录制还是音视频录制 + await videoRecorder.prepare(videoConfig).then(() => { + console.info('prepare success'); + }, this.failureCallback).catch(this.catchCallback); + + // 包含视频的录制需要调用getInputSurface接口,并将返回值surfaceID传递给camera相关接口 + await videoRecorder.getInputSurface().then((surface) => { + console.info('getInputSurface success'); + surfaceID = surface; // surfaceID给camera的createVideoOutput()作为其中的一个入参 + }, this.failureCallback).catch(this.catchCallback); + + // 视频录制依赖相机相关接口,以下需要先调用相机起流接口后才能继续执行,具体的相机接口调用请参考sample用例 + // 视频录制启动接口 + await videoRecorder.start().then(() => { + console.info('start success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用pause接口时需要暂停camera出流 + await videoRecorder.pause().then(() => { + console.info('pause success'); + }, this.failureCallback).catch(this.catchCallback); + + // 调用resume接口时需要恢复camera出流 + await videoRecorder.resume().then(() => { + console.info('resume success'); + }, this.failureCallback).catch(this.catchCallback); + + // 停止camera出流后,停止视频录制 + await videoRecorder.stop().then(() => { + console.info('stop success'); + }, this.failureCallback).catch(this.catchCallback); + + // 重置录制相关配置 + await videoRecorder.reset().then(() => { + console.info('reset success'); + }, this.failureCallback).catch(this.catchCallback); + + // 关闭监听回调,如果用户不自行调用off接口,在调用release后,设置的回调接口也会无效 + videoRecorder.off('stateChange'); + videoRecorder.off('error'); + + // 释放视频录制相关资源并释放camera对象相关资源 + await videoRecorder.release().then(() => { + console.info('release success'); + }, this.failureCallback).catch(this.catchCallback); + + // 相关对象置null + videoRecorder = undefined; + surfaceID = undefined; + } +} +``` + + + +### 音视频录制APP + +音视频录制APP案例包含:创建实例、设置录制参数、获取输入surface、开始录制、暂停录制、恢复录制、停止录制、释放资源等流程。 + +详细代码可参考:[AVRecorderDemo]([multimedia_player_framework: Implementation of media playback and recording | 媒体播放和录制功能实现 - Gitee.com](https://gitee.com/openharmony/multimedia_player_framework/tree/master/test/appdemo/AVRecorderDemo)) diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_audio.png b/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_audio.png new file mode 100644 index 0000000000000000000000000000000000000000..23b05d2a51adb734eab3099c36ff438aba895df8 Binary files /dev/null and b/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_audio.png differ diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_state_machine.png b/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_state_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8afdbcbf142fd745cee03fc422caec51cfe41b Binary files /dev/null and b/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_state_machine.png differ diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_video.png b/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_video.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3c6795de742ad057b07223b8051fd2ae576974 Binary files /dev/null and b/zh-cn/application-dev/media/figures/zh-ch_image_avplayer_video.png differ diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_avrecorder_module_interaction.png b/zh-cn/application-dev/media/figures/zh-ch_image_avrecorder_module_interaction.png new file mode 100644 index 0000000000000000000000000000000000000000..99f521f7f9b020212db9c19ee64a38649dbe604b Binary files /dev/null and b/zh-cn/application-dev/media/figures/zh-ch_image_avrecorder_module_interaction.png differ diff --git a/zh-cn/application-dev/media/figures/zh-ch_image_avrecorder_state_machine.png b/zh-cn/application-dev/media/figures/zh-ch_image_avrecorder_state_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..7ffcb21f09365e9b072bdaf48f8b98d7d45a8aaa Binary files /dev/null and b/zh-cn/application-dev/media/figures/zh-ch_image_avrecorder_state_machine.png differ diff --git a/zh-cn/application-dev/reference/apis/js-apis-media.md b/zh-cn/application-dev/reference/apis/js-apis-media.md index 78c725ceaed8d3b32ac8b3a08f6981ae7d04c202..d35a9dd3f903e2bf7e7d52671d0252fc6b0904b6 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-media.md +++ b/zh-cn/application-dev/reference/apis/js-apis-media.md @@ -7,12 +7,12 @@ 媒体子系统包含了音视频相关媒体业务,提供以下常用功能: -- 音频播放([AudioPlayer](#audioplayer)) -- 视频播放([VideoPlayer](#videoplayer8)) -- 音频录制([AudioRecorder](#audiorecorder)) -- 视频录制([VideoRecorder](#videorecorder9)) - -后续将提供以下功能:DataSource音视频播放、音视频编解码、容器封装解封装、媒体能力查询等功能。 +- 音视频播放([AVPlayer](#avplayer9)9+),[AudioPlayer](#audioplayerdeprecated)6+和[VideoPlayer](#videoplayer)8+整合,升级了状态机和错误码,推荐使用 +- 音视频录制([AVRecorder](#avrecorder9)9+),[AudioRecorder](#audiorecorderdeprecated)6+和[VideoRecorder](#videorecorder9)9+整合,推荐使用 +- 音频播放([AudioPlayer](#audioplayerdeprecated)6+),[AVPlayer](#avplayer9)9+发布后停止维护,请使用[AVPlayer](#avplayer9)9+ +- 视频播放([VideoPlayer](#videoplayerdeprecated)8+),[AVPlayer](#avplayer9)9+发布后停止维护,请使用[AVPlayer](#avplayer9)9+ +- 音频录制([AudioRecorder](#audiorecorderdeprecated)6+),[AVRecorder](#avrecorder9)9+发布后停止维护,请使用[AVRecorder](#avrecorder9)9+ +- 视频录制([VideoRecorder](#videorecorder9)9+),[AVRecorder](#avrecorder9)9+发布后停止维护,请使用[AVRecorder](#avrecorder9)9+ ## 导入模块 @@ -20,110 +20,163 @@ import media from '@ohos.multimedia.media'; ``` -## media.createAudioPlayer +## media.createAVPlayer9+ -createAudioPlayer(): [AudioPlayer](#audioplayer) +createAVPlayer(callback: AsyncCallback\): void -同步方式创建音频播放实例。 +异步方式创建音视频播放实例,通过注册回调函数获取返回值。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**返回值:** +**参数:** -| 类型 | 说明 | -| --------------------------- | ------------------------------------------------------------ | -| [AudioPlayer](#audioplayer) | 返回AudioPlayer类实例,失败时返回null。可用于音频播放、暂停、停止等操作。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback\<[AVPlayer](#avplayer9)> | 是 | 回调函数。异步返回AVPlayer实例,失败时返回null。可用于音视频播放。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ------------------------------ | +| 5400101 | No memory. Return by callback. | **示例:** ```js -let audioPlayer = media.createAudioPlayer(); +let avPlayer + +media.createAVPlayer((error, video) => { + if (video != null) { + avPlayer = video; + console.info('createAVPlayer success'); + } else { + console.info(`createAVPlayer fail, error:${error}`); + } +}); ``` -## media.createVideoPlayer8+ +## media.createAVPlayer9+ -createVideoPlayer(callback: AsyncCallback\<[VideoPlayer](#videoplayer8)>): void +createAVPlayer(): Promise\ -异步方式创建视频播放实例,通过注册回调函数获取返回值。 +异步方式创建音视频播放实例,通过Promise获取返回值。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**参数:** +**返回值:** + +| 类型 | 说明 | +| ------------------------------- | ------------------------------------------------------------ | +| Promise\<[AVPlayer](#avplayer9)> | Promise对象。异步返回AVPlayer实例,失败时返回null。可用于录制视频媒体。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------------------- | ---- | ------------------------------ | -| callback | AsyncCallback<[VideoPlayer](#videoplayer8)> | 是 | 回调函数。异步返回VideoPlayer实例,失败时返回null。可用于管理和播放视频媒体。 | +| 错误码ID | 错误信息 | +| -------- | ----------------------------- | +| 5400101 | No memory. Return by promise. | **示例:** ```js -let videoPlayer +let avPlayer -media.createVideoPlayer((error, video) => { - if (video != null) { - videoPlayer = video; - console.info('video createVideoPlayer success'); +media.createAVPlayer().then((video) => { + if (video != null) { + avPlayer = video; + console.info('createAVPlayer success'); } else { - console.info(`video createVideoPlayer fail, error:${error}`); + console.info('createAVPlayer fail'); } +}).catch((error) => { + console.info(`AVPlayer catchCallback, error:${error}`); }); ``` -## media.createVideoPlayer8+ +## media.createAVRecorder9+ -createVideoPlayer(): Promise<[VideoPlayer](#videoplayer8)> +createAVRecorder(callback: AsyncCallback\): void -异步方式创建视频播放实例,通过Promise获取返回值。 +异步方式创建音视频录制实例。通过注册回调函数获取返回值。 +一台设备只允许创建一个录制实例。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -**返回值:** +**参数:** -| 类型 | 说明 | -| ------------------------------------- | ------------------------------------------------------------ | -| Promise<[VideoPlayer](#videoplayer8)> | Promise对象。异步返回VideoPlayer实例,失败时返回null。可用于管理和播放视频媒体。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------ | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback\<[AVRecorder](#avrecorder9)> | 是 | 回调函数。异步返回AVRecorder实例,失败时返回null。可用于录制音视频媒体。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ------------------------------ | +| 5400101 | No memory. Return by callback. | **示例:** ```js -let videoPlayer +let avRecorder -media.createVideoPlayer().then((video) => { - if (video != null) { - videoPlayer = video; - console.info('video createVideoPlayer success'); +media.createAVRecorder((error, recorder) => { + if (recorder != null) { + avRecorder = recorder; + console.info('createAVRecorder success'); } else { - console.info('video createVideoPlayer fail'); + console.info(`createAVRecorder fail, error:${error}`); } -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); }); ``` -## media.createAudioRecorder +## media.createAVRecorder9+ -createAudioRecorder(): AudioRecorder +createAVRecorder(): Promise\ -创建音频录制的实例来控制音频的录制。 +异步方式创建音视频录制实例。通过Promise获取返回值。 一台设备只允许创建一个录制实例。 -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -**返回值:** +**返回值:** -| 类型 | 说明 | -| ------------------------------- | ------------------------------------------------------------ | -| [AudioRecorder](#audiorecorder) | 返回AudioRecorder类实例,失败时返回null。可用于录制音频媒体。 | +| 类型 | 说明 | +| ------------------------------------ | ------------------------------------------------------------ | +| Promise\<[AVRecorder](#avrecorder9)> | Promise对象。异步返回AVRecorder实例,失败时返回null。可用于录制音视频媒体。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------- | +| 5400101 | No memory. Return by promise. | **示例:** ```js -let audioRecorder = media.createAudioRecorder(); +let avRecorder + +media.createAVRecorder().then((recorder) => { + if (recorder != null) { + avRecorder = recorder; + console.info('createAVRecorder success'); + } else { + console.info('createAVRecorder fail'); + } +}).catch((error) => { + console.info(`createAVRecorder catchCallback, error:${error}`); +}); ``` ## media.createVideoRecorder9+ -createVideoRecorder(callback: AsyncCallback\<[VideoRecorder](#videorecorder9)>): void +createVideoRecorder(callback: AsyncCallback\): void 异步方式创建视频录制实例。通过注册回调函数获取返回值。 一台设备只允许创建一个录制实例。 @@ -134,8 +187,8 @@ createVideoRecorder(callback: AsyncCallback\<[VideoRecorder](#videorecorder9)>): **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ----------------------------------------------- | ---- | ------------------------------ | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------------------------------------- | ---- | ------------------------------------------------------------ | | callback | AsyncCallback<[VideoRecorder](#videorecorder9)> | 是 | 回调函数。异步返回VideoRecorder实例,失败时返回null。可用于录制视频媒体。 | **错误码:** @@ -163,7 +216,7 @@ media.createVideoRecorder((error, video) => { ## media.createVideoRecorder9+ -createVideoRecorder(): Promise<[VideoRecorder](#videorecorder9)> +createVideoRecorder(): Promise\ 异步方式创建视频录制实例。通过Promise获取返回值。 一台设备只允许创建一个录制实例。 @@ -203,26 +256,24 @@ media.createVideoRecorder().then((video) => { }); ``` +## AVErrorCode9+ - -## MediaErrorCode8+ - -媒体服务错误类型枚举。 +[媒体错误码](../errorcodes/errorcode-media.md)类型枚举 **系统能力:** SystemCapability.Multimedia.Media.Core -| 名称 | 值 | 说明 | -| -------------------------- | ---- | -------------------------------------- | -| MSERR_OK | 0 | 表示操作成功。 | -| MSERR_NO_MEMORY | 1 | 表示申请内存失败,系统可能无可用内存。 | -| MSERR_OPERATION_NOT_PERMIT | 2 | 表示无权限执行此操作。 | -| MSERR_INVALID_VAL | 3 | 表示传入入参无效。 | -| MSERR_IO | 4 | 表示发生IO错误。 | -| MSERR_TIMEOUT | 5 | 表示操作超时。 | -| MSERR_UNKNOWN | 6 | 表示未知错误。 | -| MSERR_SERVICE_DIED | 7 | 表示服务端失效。 | -| MSERR_INVALID_STATE | 8 | 表示在当前状态下,不允许执行此操作。 | -| MSERR_UNSUPPORTED | 9 | 表示在当前版本下,不支持此操作。 | +| 名称 | 值 | 说明 | +| :------------------------- | ------- | ------------------------------------ | +| AVERR_OK | 0 | 表示操作成功。 | +| AVERR_NO_PERMISSION | 201 | 表示无权限执行此操作。 | +| AVERR_INVALID_PARAMETER | 401 | 表示传入入参无效。 | +| AVERR_UNSUPPORT_CAPABILITY | 801 | 表示当前版本不支持该API能力。 | +| AVERR_NO_MEMORY | 5400101 | 表示系统内存不足或服务数量达到上限。 | +| AVERR_OPERATE_NOT_PERMIT | 5400102 | 表示当前状态不允许或无权执行此操作。 | +| AVERR_IO | 5400103 | 表示数据流异常信息。 | +| AVERR_TIMEOUT | 5400104 | 表示系统或网络响应超时。 | +| AVERR_SERVICE_DIED | 5400105 | 表示服务进程死亡。 | +| AVERR_UNSUPPORT_FORMAT | 5400106 | 表示不支持当前媒体资源的格式。 | ## MediaType8+ @@ -284,1247 +335,1276 @@ Codec MIME类型枚举。 | BUFFERING_PERCENT | 3 | 表示缓存百分比。 | | CACHED_DURATION | 4 | 表示缓存时长,单位为毫秒(ms)。 | -## AudioPlayer +## StateChangeReason9+ -音频播放管理类,用于管理和播放音频媒体。在调用AudioPlayer的方法前,需要先通过[createAudioPlayer()](#mediacreateaudioplayer)构建一个[AudioPlayer](#audioplayer)实例。 +表示播放或录制实例状态机切换原因的枚举,伴随state一起上报。 -音频播放demo可参考:[音频播放开发指导](../../media/audio-playback.md) +**系统能力:** SystemCapability.Multimedia.Media.Core -### 属性 +| 名称 | 值 | 说明 | +| ---------- | ---- | ------------------------------------------------------------ | +| USER | 1 | 表示用户行为造成的状态切换,由用户或客户端主动调用接口产生。 | +| BACKGROUND | 2 | 表示系统行为造成的状态切换,比如应用未注册播控中心权限,退到后台时被系统强制暂停或停止。 | -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +## AVPlayer9+ -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ------------------------------- | ------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ | -| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(m4a、aac、mp3、ogg、wav)。
**支持路径示例**:
1. fd类型播放:fd://xx
![](figures/zh-cn_image_url.png)
2. http网络播放: http://xx
3. https网络播放: https://xx
4. hls网络播放路径:http://xx或者https://xx
**需要权限:** ohos.permission.READ_MEDIA 或 ohos.permission.INTERNET。 | -| fdSrc9+ | [AVFileDescriptor](#avfiledescriptor9) | 是 | 是 | 音频媒体文件描述,使用场景:应用中的音频资源被连续存储在同一个文件中。
**使用示例**:
假设一个连续存储的音乐文件:
音乐1(地址偏移:0,字节长度:100)
音乐2(地址偏移:101,字节长度:50)
音乐3(地址偏移:151,字节长度:150)
1. 播放音乐1:AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }
2. 播放音乐2:AVFileDescriptor { fd = 资源句柄; offset = 101; length = 50; }
3. 播放音乐3:AVFileDescriptor { fd = 资源句柄; offset = 151; length = 150; }
假设是一个独立的音乐文件: 请使用src=fd://xx
| -| loop | boolean | 是 | 是 | 音频循环播放属性,设置为'true'表示循环播放。 | -| audioInterruptMode9+ | [audio.InterruptMode](js-apis-audio.md#interruptmode9) | 是 | 是 | 音频焦点模型。 | -| currentTime | number | 是 | 否 | 音频的当前播放位置,单位为毫秒(ms)。 | -| duration | number | 是 | 否 | 音频时长,单位为毫秒(ms)。 | -| state | [AudioState](#audiostate) | 是 | 否 | 可以查询音频播放的状态,该状态不可作为调用play/pause/stop等状态切换的触发条件。 | -### play +播放管理类,用于管理和播放媒体资源。在调用AVPlayer的方法前,需要先通过[createAVPlayer()](#mediacreateavplayer9)构建一个AVPlayer实例。 -play(): void +Audio/Video播放demo可参考:[AVPlayer开发指导](../../media/avplayer-playback.md)。 -开始播放音频资源,需在[dataLoad](#audioplayer_on)事件成功触发后,才能调用。 +### 属性 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**示例:** +| 名称 | 类型 | 可读 | 可写 | 说明 | +| --------------------------------------------------- | ------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ | +| url9+ | string | 是 | 是 | 媒体URL,只允许在**idle**状态下设置,静态属性。
支持的视频格式(mp4、mpeg-ts、webm、mkv)。
支持的音频格式(m4a、aac、mp3、ogg、wav)。
**支持路径示例**:
1. fd类型播放:fd://xx。
![](figures/zh-cn_image_url.png)
2. http网络播放: http://xx。
3. https网络播放: https://xx。
4. hls网络播放路径:http://xx或者https://xx。 | +| fdSrc9+ | [AVFileDescriptor](#avfiledescriptor9) | 是 | 是 | 媒体文件描述,只允许在**idle**状态下设置,静态属性。
使用场景:应用中的媒体资源被连续存储在同一个文件中。
**使用示例**:
假设一个连续存储的媒体文件:
视频1(地址偏移:0,字节长度:100);
视频2(地址偏移:101,字节长度:50);
视频3(地址偏移:151,字节长度:150);
1. 播放视频1:AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }。
2. 播放视频2:AVFileDescriptor { fd = 资源句柄; offset = 101; length = 50; }。
3. 播放视频3:AVFileDescriptor { fd = 资源句柄; offset = 151; length = 150; }。
假设是一个独立的媒体文件: 请使用src=fd://xx。 | +| surfaceId9+ | string | 是 | 是 | 视频窗口ID,默认无窗口,只允许在**initialized**状态下设置,静态属性。
使用场景:视频播放的窗口渲染,纯音频播放不用设置。
**使用示例**:
[通过Xcomponent创建surfaceId](../arkui-ts/ts-basic-components-xcomponent.md#getxcomponentsurfaceid)。 | +| loop9+ | boolean | 是 | 是 | 视频循环播放属性,默认'false',设置为'true'表示循环播放,动态属性。
只允许在**prepared**/**playing**/**paused**/**completed**状态下设置。 | +| videoScaleType9+ | [VideoScaleType](#videoscaletype9) | 是 | 是 | 视频缩放模式,默认VIDEO_SCALE_TYPE_FIT_CROP,动态属性。
只允许在**prepared**/**playing**/**paused**/**completed**状态下设置。 | +| audioInterruptMode9+ | [audio.InterruptMode](js-apis-audio.md#interruptmode9) | 是 | 是 | 音频焦点模型,默认INDEPENDENT_MODE,动态属性。
只允许在**prepared**/**playing**/**paused**/**completed**状态下设置。 | +| state9+ | [AVPlayerState](#avplayerstate9) | 是 | 否 | 音视频播放的状态,全状态有效,可查询参数。 | +| currentTime9+ | number | 是 | 否 | 视频的当前播放位置,单位为毫秒(ms),可查询参数。
返回为(-1)表示无效值,**prepared**/**playing**/**paused**/**completed**状态下有效。 | +| duration9+ | number | 是 | 否 | 视频时长,单位为毫秒(ms),可查询参数。
返回为(-1)表示无效值,**prepared**/**playing**/**paused**/**completed**状态下有效。
直播场景默认返回(-1)。 | +| width9+ | number | 是 | 否 | 视频宽,单位为像素(px),可查询参数。
返回为(0)表示无效值,**prepared**/**playing**/**paused**/**completed**状态下有效。 | +| height9+ | number | 是 | 否 | 视频高,单位为像素(px),可查询参数。
返回为(0)表示无效值,**prepared**/**playing**/**paused**/**completed**状态下有效。 | -```js -audioPlayer.on('play', () => { //设置'play'事件回调 - console.log('audio play success'); -}); -audioPlayer.play(); -``` +### on('stateChange')9+ -### pause +on(type: 'stateChange', callback: (state: AVPlayerState, reason: StateChangeReason) => void): void -pause(): void +监听播放状态机AVPlayerState切换的事件。 -暂停播放音频资源。 +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 状态机切换事件回调类型,支持的事件:'stateChange',用户操作和系统都会触发此事件。 | +| callback | function | 是 | 状态机切换事件回调方法:
state: [AVPlayerState](#avplayerstate9),表示当前播放状态;
reason: [StateChangeReason](#statechangereason9),表示当前播放状态的切换原因。 | **示例:** ```js -audioPlayer.on('pause', () => { //设置'pause'事件回调 - console.log('audio pause success'); -}); -audioPlayer.pause(); +avPlayer.on('stateChange', async (state, reason) => { + switch (state) { + case 'idle': + console.info('state idle called') + break; + case 'initialized': + console.info('initialized prepared called') + break; + case 'prepared': + console.info('state prepared called') + break; + case 'playing': + console.info('state playing called') + break; + case 'paused': + console.info('state paused called') + break; + case 'completed': + console.info('state completed called') + break; + case 'stopped': + console.info('state stopped called') + break; + case 'released': + console.info('state released called') + break; + case 'error': + console.info('state error called') + break; + default: + console.info('unkown state :' + state) + break; + } +}) ``` -### stop +### off('stateChange')9+ -stop(): void +off(type: 'stateChange'): void -停止播放音频资源。 +取消监听播放状态机[AVPlayerState](#avplayerstate9)切换的事件。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ----------------------------------------------------- | +| type | string | 是 | 状态机切换事件回调类型,取消注册的事件:'stateChange' | **示例:** ```js -audioPlayer.on('stop', () => { //设置'stop'事件回调 - console.log('audio stop success'); -}); -audioPlayer.stop(); +avPlayer.off('stateChange') ``` -### reset7+ +### on('error')9+ -reset(): void +on(type: 'error', callback: ErrorCallback): void -重置播放音频资源。 +监听[AVPlayer](#avplayer9)的错误事件,该事件仅用于错误提示,不需要用户停止播控动作。如果此时[AVPlayerState](#avplayerstate9)也切至error状态,用户需要通过reset()或者release()退出播放操作。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 错误事件回调类型,支持的事件:'error',用户操作和系统都会触发此事件。 | +| callback | function | 是 | 错误事件回调方法:使用播放器的过程中发生错误,会提供错误码ID和错误信息。 | + +AVPlayer回调的**错误分类**可以分为以下几种: + +| 错误码ID | 错误信息 | 说明 | +| -------- | --------------------- | ------------------------------------------------------------ | +| 201 | No Permission: | 无权限执行此操作,[AVPlayerState](#avplayerstate9)会进入error状态。 | +| 401 | Invalid Parameter: | 入参错误,表示调用无效。 | +| 801 | Unsupport Capability: | 不支持该API能力,表示调用无效。 | +| 5400101 | No Memory: | 播放内存不足,[AVPlayerState](#avplayerstate9)会进入error状态。 | +| 5400102 | Operate Not Permit: | 当前状态机不支持此操作,表示调用无效。 | +| 5400103 | IO Error: | 播放中发现码流异常。 | +| 5400104 | Network Timeout: | 网络原因超时响应,[AVPlayerState](#avplayerstate9)会进入error状态。 | +| 5400105 | Service Died: | 播放进程死亡,[AVPlayerState](#avplayerstate9)会进入error状态。 | +| 5400106 | Unsupport Format: | 不支持的文件格式,[AVPlayerState](#avplayerstate9)会进入error状态。 | **示例:** ```js -audioPlayer.on('reset', () => { //设置'reset'事件回调 - console.log('audio reset success'); -}); -audioPlayer.reset(); +avPlayer.on('error', (error) => { + console.info('error happened,and error message is :' + error.message) + console.info('error happened,and error code is :' + error.code) +}) ``` -### seek +### off('error')9+ -seek(timeMs: number): void +off(type: 'error'): void -跳转到指定播放位置。 +取消监听播放的错误事件。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | ----------------------------------------------------------- | -| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围[0, duration]。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ----------------------------------------- | +| type | string | 是 | 错误事件回调类型,取消注册的事件:'error' | **示例:** ```js -audioPlayer.on('timeUpdate', (seekDoneTime) => { //设置'timeUpdate'事件回调 - if (seekDoneTime == null) { - console.info('audio seek fail'); - return; - } - console.log('audio seek success. seekDoneTime: ' + seekDoneTime); -}); -audioPlayer.seek(30000); //seek到30000ms的位置 +avPlayer.off('error') ``` -### setVolume +### prepare9+ -setVolume(vol: number): void +prepare(callback: AsyncCallback\): void -设置音量。 +通过回调方式准备播放视频,需在[stateChange](#stateChange_on)事件成功触发至initialized状态后,才能调用。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | ------------------------------------------------------------ | -| vol | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | -------------------- | +| callback | function | 是 | 准备播放的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 + +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | +| 5400106 | Unsupport format. Return by callback. | **示例:** ```js -audioPlayer.on('volumeChange', () => { //设置'volumeChange'事件回调 - console.log('audio volumeChange success'); -}); -audioPlayer.setVolume(1); //设置音量到100% +avPlayer.prepare((err) => { + if (err == null) { + console.info('prepare success'); + } else { + console.error('prepare filed,error message is :' + err.message) + } +}) ``` -### release +### prepare9+ -release(): void +prepare(): Promise\ -释放音频资源。 +通过Promise方式准备播放视频,需在[stateChange](#stateChange_on)事件成功触发至initialized状态后,才能调用。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | 准备播放的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | +| 5400106 | Unsupport format. Return by promise. | **示例:** ```js -audioPlayer.release(); -audioPlayer = undefined; +avPlayer.prepare().then(() => { + console.info('prepare success'); +}, (err) => { + console.error('prepare filed,error message is :' + err.message) +}) ``` -### getTrackDescription8+ +### play9+ -getTrackDescription(callback: AsyncCallback>): void +play(callback: AsyncCallback\): void -通过回调方式获取音频轨道信息。需在[dataLoad](#audioplayer_on)事件成功触发后,才能调用。 +通过回调方式开始播放音视频资源,只能在prepared/paused/complete状态调用。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------ | -| callback | AsyncCallback> | 是 | 音频轨道信息MediaDescription数组回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | -------------------- | +| callback | function | 是 | 开始播放的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 + +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | **示例:** ```js -function printfDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info('audio key is ' + item); - console.info('audio value is ' + property); - } -} - -audioPlayer.getTrackDescription((error, arrList) => { - if (arrList != null) { - for (let i = 0; i < arrList.length; i++) { - printfDescription(arrList[i]); - } +avPlayer.play((err) => { + if (err == null) { + console.info('play success'); } else { - console.log(`audio getTrackDescription fail, error:${error}`); + console.error('play filed,error message is :' + err.message) } -}); +}) ``` -### getTrackDescription8+ +### play9+ -getTrackDescription(): Promise> +play(): Promise\ -通过Promise方式获取音频轨道信息。需在[dataLoad](#audioplayer_on)事件成功触发后,才能调用 +通过Promise方式开始播放音视频资源,只能在prepared/paused/complete状态调用。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **返回值:** -| 类型 | 说明 | -| ------------------------------------------------------ | ----------------------------------------------- | -| Promise> | 音频轨道信息MediaDescription数组Promise返回值。 | +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | 开始播放的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | **示例:** ```js -function printfDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info('audio key is ' + item); - console.info('audio value is ' + property); - } -} -let arrayDescription = null -audioPlayer.getTrackDescription().then((arrList) => { - if (arrList != null) { - arrayDescription = arrList; - } else { - console.log('audio getTrackDescription fail'); - } -}).catch((error) => { - console.info(`audio catchCallback, error:${error}`); -}); - -for (let i = 0; i < arrayDescription.length; i++) { - printfDescription(arrayDescription[i]); -} +avPlayer.play().then(() => { + console.info('play success'); +}, (err) => { + console.error('play filed,error message is :' + err.message) +}) ``` -### on('bufferingUpdate')8+ +### pause9+ -on(type: 'bufferingUpdate', callback: (infoType: [BufferingInfoType](#bufferinginfotype8), value: number) => void): void +pause(callback: AsyncCallback\): void -开始订阅音频缓存更新事件。仅网络播放支持该订阅事件。 +通过回调方式暂停播放音视频资源,只能在playing状态调用。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 音频缓存事件回调类型,支持的事件:'bufferingUpdate'。 | -| callback | function | 是 | 音频缓存事件回调方法。
[BufferingInfoType](#bufferinginfotype8)为BUFFERING_PERCENT或CACHED_DURATION时,value值有效,否则固定为0。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | -------------------- | +| callback | function | 是 | 暂停播放的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | **示例:** ```js -audioPlayer.on('bufferingUpdate', (infoType, value) => { - console.log('audio bufferingInfo type: ' + infoType); - console.log('audio bufferingInfo value: ' + value); -}); +avPlayer.pause((err) => { + if (err == null) { + console.info('pause success'); + } else { + console.error('pause filed,error message is :' + err.message) + } +}) ``` - ### on('play' | 'pause' | 'stop' | 'reset' | 'dataLoad' | 'finish' | 'volumeChange') +### pause9+ -on(type: 'play' | 'pause' | 'stop' | 'reset' | 'dataLoad' | 'finish' | 'volumeChange', callback: () => void): void +pause(): Promise\ -开始订阅音频播放事件。 +通过Promise方式暂停播放音视频资源,只能在playing状态调用。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**参数:** +**返回值:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ---------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 播放事件回调类型,支持的事件包括:'play' \| 'pause' \| 'stop' \| 'reset' \| 'dataLoad' \| 'finish' \| 'volumeChange'。
- 'play':完成[play()](#audioplayer_play)调用,音频开始播放,触发该事件。
- 'pause':完成[pause()](#audioplayer_pause)调用,音频暂停播放,触发该事件。
- 'stop':完成[stop()](#audioplayer_stop)调用,音频停止播放,触发该事件。
- 'reset':完成[reset()](#audioplayer_reset)调用,播放器重置,触发该事件。
- 'dataLoad':完成音频数据加载后触发该事件,即src属性设置完成后触发该事件。
- 'finish':完成音频播放后触发该事件。
- 'volumeChange':完成[setVolume()](#audioplayer_setvolume)调用,播放音量改变后触发该事件。 | -| callback | () => void | 是 | 播放事件回调方法。 | +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | 暂停播放的Promise返回值。 | -**示例:** +**错误码:** -```js -import fileio from '@ohos.fileio' +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -let audioPlayer = media.createAudioPlayer(); //创建一个音频播放实例 -audioPlayer.on('dataLoad', () => { //设置'dataLoad'事件回调,src属性设置成功后,触发此回调 - console.info('audio set source success'); - audioPlayer.play(); //开始播放,并触发'play'事件回调 -}); -audioPlayer.on('play', () => { //设置'play'事件回调 - console.info('audio play success'); - audioPlayer.seek(30000); //调用seek方法,并触发'timeUpdate'事件回调 -}); -audioPlayer.on('pause', () => { //设置'pause'事件回调 - console.info('audio pause success'); - audioPlayer.stop(); //停止播放,并触发'stop'事件回调 -}); -audioPlayer.on('reset', () => { //设置'reset'事件回调 - console.info('audio reset success'); - audioPlayer.release(); //释放播放实例资源 - audioPlayer = undefined; -}); -audioPlayer.on('timeUpdate', (seekDoneTime) => { //设置'timeUpdate'事件回调 - if (seekDoneTime == null) { - console.info('audio seek fail'); - return; - } - console.info('audio seek success, and seek time is ' + seekDoneTime); - audioPlayer.setVolume(0.5); //设置音量为50%,并触发'volumeChange'事件回调 -}); -audioPlayer.on('volumeChange', () => { //设置'volumeChange'事件回调 - console.info('audio volumeChange success'); - audioPlayer.pause(); //暂停播放,并触发'pause'事件回调 -}); -audioPlayer.on('finish', () => { //设置'finish'事件回调 - console.info('audio play finish'); - audioPlayer.stop(); //停止播放,并触发'stop'事件回调 -}); -audioPlayer.on('error', (error) => { //设置'error'事件回调 - console.info(`audio error called, error: ${error}`); -}); +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | -// 用户选择视频设置fd(本地播放) -let fdPath = 'fd://'; -// path路径的码流可通过"hdc file send D:\xxx\01.mp3 /data/accounts/account_0/appdata" 命令,将其推送到设备上 -let path = '/data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; -fileio.open(path).then((fdValue) => { - fdPath = fdPath + '' + fdValue; - console.info('open fd success fd is' + fdPath); +**示例:** + +```js +avPlayer.pause().then(() => { + console.info('pause success'); }, (err) => { - console.info('open fd failed err is' + err); -}).catch((err) => { - console.info('open fd failed err is' + err); -}); -audioPlayer.src = fdPath; //设置src属性,并触发'dataLoad'事件回调 + console.error('pause filed,error message is :' + err.message) +}) ``` -### on('timeUpdate') +### stop9+ -on(type: 'timeUpdate', callback: Callback\): void +stop(callback: AsyncCallback\): void -开始订阅音频播放时间更新事件。处于播放状态时,每隔1s上报一次该事件。 +通过回调方式停止播放音视频资源,只能在prepared/playing/paused/complete状态调用。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ----------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 播放事件回调类型,支持的事件包括:'timeUpdate'。
- 'timeUpdate':音频播放时间戳更新,开始播放后自动触发该事件。 | -| callback | Callback\ | 是 | 播放事件回调方法。回调方法入参为更新后的时间戳。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | -------------------- | +| callback | function | 是 | 停止播放的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | **示例:** ```js -audioPlayer.on('timeUpdate', (newTime) => { //设置'timeUpdate'事件回调 - if (newTime == null) { - console.info('audio timeUpadate fail'); - return; +avPlayer.stop((err) => { + if (err == null) { + console.info('stop success'); + } else { + console.error('stop filed,error message is :' + err.message) } - console.log('audio timeUpadate success. seekDoneTime: ' + newTime); -}); -audioPlayer.play(); //开始播放后,自动触发时间戳更新事件 +}) ``` -### on('error') +### stop9+ -on(type: 'error', callback: ErrorCallback): void +stop(): Promise\ -开始订阅音频播放错误事件,当上报error错误事件后,用户需处理error事件,退出播放操作。 +通过Promise方式停止播放音视频资源,只能在prepared/playing/paused/complete状态调用。 -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**参数:** +**返回值:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 播放错误事件回调类型,支持的事件包括:'error'。
- 'error':音频播放中发生错误,触发该事件。 | -| callback | ErrorCallback | 是 | 播放错误事件回调方法。 | +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | 停止播放的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | **示例:** ```js -audioPlayer.on('error', (error) => { //设置'error'事件回调 - console.info(`audio error called, error: ${error}`); -}); -audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 +avPlayer.stop().then(() => { + console.info('stop success'); +}, (err) => { + console.error('stop filed,error message is :' + err.message) +}) ``` -## AudioState - -音频播放的状态机。可通过state属性获取当前状态。 +### reset9+ -**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer +reset(callback: AsyncCallback\): void -| 名称 | 类型 | 说明 | -| ------- | ------ | ---------------------------------------------- | -| idle | string | 音频播放空闲,dataload/reset成功后处于此状态。 | -| playing | string | 音频正在播放,play成功后处于此状态。 | -| paused | string | 音频暂停播放,pause成功后处于此状态。 | -| stopped | string | 音频播放停止,stop/播放结束后处于此状态。 | -| error | string | 错误状态。 | +通过回调方式重置播放,只能在initialized/prepared/playing/paused/complete/stopped/error状态调用。 -## AVFileDescriptor9+ +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -音视频文件资源描述,一种特殊资源的播放方式,使用场景:应用中的音频资源被连续存储在同一个文件中,需要根据偏移量和长度进行播放。 +**参数:** -**系统能力:** SystemCapability.Multimedia.Media.Core +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | -------------------- | +| callback | function | 是 | 重置播放的回调方法。 | -| 名称 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | ------------------------------------------------------------ | -| fd | number | 是 | 资源句柄,通过resourceManager.getRawFileDescriptor获取 | -| offset | number | 是 | 资源偏移量,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误 | -| length | number | 是 | 资源长度,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误 | +**错误码:** -## VideoPlayer8+ +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -视频播放管理类,用于管理和播放视频媒体。在调用VideoPlayer的方法前,需要先通过[createVideoPlayer()](#mediacreatevideoplayer8)构建一个[VideoPlayer](#videoplayer8)实例。 +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | -视频播放demo可参考:[视频播放开发指导](../../media/video-playback.md) +**示例:** -### 属性 +```js +avPlayer.reset((err) => { + if (err == null) { + console.info('reset success'); + } else { + console.error('reset filed,error message is :' + err.message) + } +}) +``` -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +### reset9+ -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ------------------------ | ---------------------------------- | ---- | ---- | ------------------------------------------------------------ | -| url8+ | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd://xx
![](figures/zh-cn_image_url.png)
2. http网络播放: http://xx
3. https网络播放: https://xx
4. hls网络播放路径:http://xx或者https://xx
| -| fdSrc9+ | [AVFileDescriptor](#avfiledescriptor9) | 是 | 是 | 视频媒体文件描述,使用场景:应用中的视频资源被连续存储在同一个文件中。
**使用示例**:
假设一个连续存储的音乐文件:
视频1(地址偏移:0,字节长度:100)
视频2(地址偏移:101,字节长度:50)
视频3(地址偏移:151,字节长度:150)
1. 播放视频1:AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }
2. 播放视频2:AVFileDescriptor { fd = 资源句柄; offset = 101; length = 50; }
3. 播放视频3:AVFileDescriptor { fd = 资源句柄; offset = 151; length = 150; }
假设是一个独立的视频文件: 请使用src=fd://xx
| -| loop8+ | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。 | -| videoScaleType9+ | [VideoScaleType](#videoscaletype9) | 是 | 是 | 视频缩放模式。 | -| audioInterruptMode9+ | [audio.InterruptMode](js-apis-audio.md#interruptmode9) | 是 | 是 | 音频焦点模型。 | -| currentTime8+ | number | 是 | 否 | 视频的当前播放位置,单位为毫秒(ms)。 | -| duration8+ | number | 是 | 否 | 视频时长,单位为毫秒(ms),返回-1表示直播模式。 | -| state8+ | [VideoPlayState](#videoplaystate8) | 是 | 否 | 视频播放的状态。 | -| width8+ | number | 是 | 否 | 视频宽,单位为像素(px)。 | -| height8+ | number | 是 | 否 | 视频高,单位为像素(px)。 | +reset(): Promise\ -### setDisplaySurface8+ +通过Promise方式通过Promise方式重置播放,只能在initialized/prepared/playing/paused/complete/stopped/error状态调用。 -setDisplaySurface(surfaceId: string, callback: AsyncCallback\): void +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -通过回调方式设置SurfaceId。 +**返回值:** -*注意:SetDisplaySurface需要在设置url和Prepare之间,无音频的视频流必须设置Surface否则Prepare失败。 +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | 重置播放的Promise返回值。 | -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**错误码:** -**参数:** +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -| 参数名 | 类型 | 必填 | 说明 | -| --------- | -------------------- | ---- | ------------------------- | -| surfaceId | string | 是 | SurfaceId | -| callback | AsyncCallback\ | 是 | 设置SurfaceId的回调方法。 | +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | **示例:** ```js -let surfaceId = null; -videoPlayer.setDisplaySurface(surfaceId, (err) => { - if (err == null) { - console.info('setDisplaySurface success!'); - } else { - console.info('setDisplaySurface fail!'); - } -}); +avPlayer.reset().then(() => { + console.info('reset success'); +}, (err) => { + console.error('reset filed,error message is :' + err.message) +}) ``` -### setDisplaySurface8+ +### release9+ -setDisplaySurface(surfaceId: string): Promise\ +release(callback: AsyncCallback\): void -通过Promise方式设置SurfaceId。 +通过回调方式销毁播放资源,除released状态,都可以调用。 -*注意:SetDisplaySurface需要在设置url和Prepare之间,无音频的视频流必须设置Surface否则Prepare失败。 - -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| --------- | ------ | ---- | --------- | -| surfaceId | string | 是 | SurfaceId | - -**返回值:** - -| 类型 | 说明 | -| -------------- | ------------------------------ | -| Promise\ | 设置SurfaceId的Promise返回值。 | - -**示例:** - -```js -let surfaceId = null; -videoPlayer.setDisplaySurface(surfaceId).then(() => { - console.info('setDisplaySurface success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); -``` - -### prepare8+ - -prepare(callback: AsyncCallback\): void - -通过回调方式准备播放视频。 +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | -------------------- | +| callback | function | 是 | 销毁播放的回调方法。 | -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**错误码:** -**参数:** +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ------------------------ | -| callback | AsyncCallback\ | 是 | 准备播放视频的回调方法。 | +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | **示例:** ```js -videoPlayer.prepare((err) => { +avPlayer.release((err) => { if (err == null) { - console.info('prepare success!'); + console.info('reset success'); } else { - console.info('prepare fail!'); + console.error('release filed,error message is :' + err.message) } -}); +}) ``` -### prepare8+ +### release9+ -prepare(): Promise\ +release(): Promise\ -通过Promise方式准备播放视频。 +通过Promise方式通过Promise方式销毁播放,除released状态,都可以调用。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **返回值:** -| 类型 | 说明 | -| -------------- | ----------------------------- | -| Promise\ | 准备播放视频的Promise返回值。 | +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | 销毁播放的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | **示例:** ```js -videoPlayer.prepare().then(() => { - console.info('prepare success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); +avPlayer.release().then(() => { + console.info('release success'); +}, (err) => { + console.error('release filed,error message is :' + err.message) +}) ``` -### play8+ +### getTrackDescription9+ -play(callback: AsyncCallback\): void; +getTrackDescription(callback: AsyncCallback\>): void -通过回调方式开始播放视频。 +通过回调方式获取音视频轨道信息,可以在prepared/playing/paused状态调用。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ------------------------ | -| callback | AsyncCallback\ | 是 | 开始播放视频的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | -------------------------------------------- | +| callback | AsyncCallback> | 是 | 音视频轨道信息MediaDescription数组回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | **示例:** ```js -videoPlayer.play((err) => { - if (err == null) { - console.info('play success!'); +avPlayer.getTrackDescription((error, arrList) => { + if ((arrList) != null) { + for (let i = 0; i < arrList.length; i++) { + printfDescription(arrList[i]); + } } else { - console.info('play fail!'); + console.log(`video getTrackDescription fail, error:${error}`); } }); ``` -### play8+ +### getTrackDescription9+ -play(): Promise\; +getTrackDescription(): Promise\> -通过Promise方式开始播放视频。 +通过Promise方式获取音频轨道信息,可以在prepared/playing/paused状态调用。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **返回值:** -| 类型 | 说明 | -| -------------- | ----------------------------- | -| Promise\ | 开始播放视频的Promise返回值。 | +| 类型 | 说明 | +| ------------------------------------------------------ | ------------------------------------------------- | +| Promise> | 音视频轨道信息MediaDescription数组Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | **示例:** ```js -videoPlayer.play().then(() => { - console.info('play success'); +let arrayDescription; +avPlayer.getTrackDescription().then((arrList) => { + if (arrList != null) { + arrayDescription = arrList; + } else { + console.log('video getTrackDescription fail'); + } }).catch((error) => { - console.info(`video catchCallback, error:${error}`); + console.info(`video catchCallback, error:${error}`); }); +for (let i = 0; i < arrayDescription.length; i++) { + printfDescription(arrayDescription[i]); +} ``` -### pause8+ +### seek9+ -pause(callback: AsyncCallback\): void +seek(timeMs: number, mode?:SeekMode): void -通过回调方式暂停播放视频。 +跳转到指定播放位置,只能在prepared/playing/paused/complete状态调用,可以通过[seekDone事件](#seekDone_on)确认是否生效。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ------------------------ | -| callback | AsyncCallback\ | 是 | 暂停播放视频的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ---------------------- | ---- | ------------------------------------------------------------ | +| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围为[0, [duration](#avplayer_duration)]。 | +| mode | [SeekMode](#seekmode8) | 否 | 基于视频I帧的跳转模式,**仅在视频资源播放时设置**。 | **示例:** ```js -videoPlayer.pause((err) => { - if (err == null) { - console.info('pause success!'); - } else { - console.info('pause fail!'); - } -}); +let seekTime = 1000 +avPlayer.seek(seekTime, media.SeekMode.SEEK_PREV_SYNC) ``` -### pause8+ +### on('seekDone')9+ -pause(): Promise\ +on(type: 'seekDone', callback: Callback\): void -通过Promise方式暂停播放视频。 +监听seek生效的事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**返回值:** +**参数:** -| 类型 | 说明 | -| -------------- | ----------------------------- | -| Promise\ | 暂停播放视频的Promise返回值。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | seek生效的事件回调类型,支持的事件:'seekDone',每次调用seek后都会回调此事件。 | +| callback | Callback\ | 是 | seek生效的事件回调方法,只会上报用户请求的time位置。
**视频播放:**[SeekMode](#seekmode8)会造成实际跳转位置与用户设置产生偏差,精准位置需要通过currentTime获取,事件回调的time仅代表完成用户某一次请求。 | **示例:** ```js -videoPlayer.pause().then(() => { - console.info('pause success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); +avPlayer.on('seekDone', (seekDoneTime:number) => { + console.info('seekDone success,and seek time is:' + seekDoneTime) +}) ``` -### stop8+ +### off('seekDone')9+ -stop(callback: AsyncCallback\): void +off(type: 'seekDone'): void -通过回调方式停止播放视频。 +取消监听seek生效的事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ------------------------ | -| callback | AsyncCallback\ | 是 | 停止播放视频的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ---------------------------------------------------- | +| type | string | 是 | seek生效的事件回调类型,取消注册的事件:'seekDone'。 | **示例:** ```js -videoPlayer.stop((err) => { - if (err == null) { - console.info('stop success!'); - } else { - console.info('stop fail!'); - } -}); +avPlayer.off('seekDone') ``` -### stop8+ +### setSpeed9+ -stop(): Promise\ +setSpeed(speed: PlaybackSpeed): void -通过Promise方式停止播放视频。 +设置倍速模式,只能在prepared/playing/paused/complete状态调用,可以通过[speedDone事件](#speedDone_on)确认是否生效。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**返回值:** +**参数:** -| 类型 | 说明 | -| -------------- | ----------------------------- | -| Promise\ | 停止播放视频的Promise返回值。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | -------------------------------- | ---- | ------------------ | +| speed | [PlaybackSpeed](#playbackspeed8) | 是 | 指定播放倍速模式。 | **示例:** ```js -videoPlayer.stop().then(() => { - console.info('stop success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); +avPlayer.setSpeed(media.AVPlayerSpeed.SPEED_FORWARD_2_00_X) ``` -### reset8+ +### on('speedDone')9+ -reset(callback: AsyncCallback\): void +on(type: 'speedDone', callback: Callback\): void -通过回调方式重置播放视频。 +监听setSpeed生效的事件 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ------------------------ | -| callback | AsyncCallback\ | 是 | 切换播放视频的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | setSpeed生效的事件回调类型,支持的事件:'speedDone',每次调用setSpeed后都会回调此事件。 | +| callback | Callback\ | 是 | setSpeed生效的事件回调方法,上报生效的倍速模式,具体见[PlaybackSpeed](#playbackspeed8)。 | **示例:** ```js -videoPlayer.reset((err) => { - if (err == null) { - console.info('reset success!'); - } else { - console.info('reset fail!'); - } -}); +avPlayer.on('speedDone', (speed:number) => { + console.info('speedDone success,and speed value is:' + speed) +}) ``` -### reset8+ +### off('speedDone')9+ -reset(): Promise\ +off(type: 'speedDone'): void -通过Promise方式重置播放视频。 +取消监听setSpeed生效的事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**返回值:** +**参数:** -| 类型 | 说明 | -| -------------- | ----------------------------- | -| Promise\ | 切换播放视频的Promise返回值。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | --------------------------------------------------------- | +| type | string | 是 | setSpeed生效的事件回调类型,取消注册的事件:'speedDone'。 | **示例:** ```js -videoPlayer.reset().then(() => { - console.info('reset success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); +avPlayer.off('speedDone') ``` -### seek8+ +### setBitrate9+ -seek(timeMs: number, callback: AsyncCallback\): void +setBitrate(bitrate: number): void -通过回调方式跳转到指定播放位置,默认跳转到指定时间点的下一个关键帧。 +选择要播放的指定比特率,仅对**HLS协议网络流**有效,只能在prepared/playing/paused/complete状态调用,可以通过[bitrateDone](#bitrateDone_on)事件确认是否生效。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ---------------------- | ---- | ------------------------------------------------------------ | -| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围为[0, duration]。 | -| callback | AsyncCallback\ | 是 | 跳转到指定播放位置的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------- | ------ | ---- | ------------------------------------------------------------ | +| bitrate | number | 是 | 指定比特率,可以通过[availableBitrates](#availableBitrates_on)事件获得当前HLS协议流可用的比特率,如果用户指定的比特率不在此列表中,则播放器将从可用比特率列表中选择最小和最接近的比特率。 | **示例:** ```js -let seekTime = 5000; -videoPlayer.seek(seekTime, (err, result) => { - if (err == null) { - console.info('seek success!'); - } else { - console.info('seek fail!'); - } -}); +let bitrate = 96000 +avPlayer.setBitrate(bitrate) ``` -### seek8+ +### on('bitrateDone')9+ -seek(timeMs: number, mode:SeekMode, callback: AsyncCallback\): void +on(type: 'bitrateDone', callback: Callback\): void -通过回调方式跳转到指定播放位置。 +监听setBitrate生效的事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ---------------------- | ---- | ------------------------------------------------------------ | -| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围为[0, duration]。 | -| mode | [SeekMode](#seekmode8) | 是 | 跳转模式。 | -| callback | AsyncCallback\ | 是 | 跳转到指定播放位置的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | setBitrate生效的事件回调类型,支持的事件:'bitrateDone',每次调用setBitrate后都会回调此事件。 | +| callback | function | 是 | setBitrate生效的事件回调方法,上报生效的比特率。 | **示例:** ```js -import media from '@ohos.multimedia.media' -let seekTime = 5000; -videoPlayer.seek(seekTime, media.SeekMode.SEEK_NEXT_SYNC, (err, result) => { - if (err == null) { - console.info('seek success!'); - } else { - console.info('seek fail!'); - } -}); +avPlayer.on('bitrateDone', (bitrate:number) => { + console.info('bitrateDone success,and bitrate value is:' + bitrate) +}) ``` -### seek8+ +### off('bitrateDone')9+ -seek(timeMs: number, mode?:SeekMode): Promise\ +off(type: 'bitrateDone'): void -通过Promise方式跳转到指定播放位置,如果没有设置mode则跳转到指定时间点的下一个关键帧。 +取消监听setBitrate生效的事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ---------------------- | ---- | ------------------------------------------------------------ | -| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围为[0, duration]。 | -| mode | [SeekMode](#seekmode8) | 否 | 跳转模式。 | - -**返回值:** - -| 类型 | 说明 | -| -------------- | ------------------------------------------- | -| Promise\ | 跳转到指定播放位置的Promise返回值,单位ms。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | setBitrate生效的事件回调类型,取消注册的事件:'bitrateDone'。 | **示例:** ```js -import media from '@ohos.multimedia.media' -let seekTime = 5000; -videoPlayer.seek(seekTime).then((seekDoneTime) => { // seekDoneTime表示seek完成后的时间点 - console.info('seek success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); - -videoPlayer.seek(seekTime, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { - console.info('seek success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); +avPlayer.off('bitrateDone') ``` -### setVolume8+ +### on('availableBitrates')9+ -setVolume(vol: number, callback: AsyncCallback\): void +on(type: 'availableBitrates', callback: (bitrates: Array\) => void): void -通过回调方式设置音量。 +监听HLS协议流可用的比特率列表,只会在切换prepared状态后上报。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ------------------------------------------------------------ | -| vol | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 | -| callback | AsyncCallback\ | 是 | 设置音量的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | HLS协议可用比特率上报事件回调类型,支持的事件:'availableBitrates',只会在prepared之后上报一次。 | +| callback | function | 是 | HLS协议可用比特率上报事件回调方法,使用数组存放支持的比特率。 | **示例:** ```js -let vol = 0.5; -videoPlayer.setVolume(vol, (err, result) => { - if (err == null) { - console.info('setVolume success!'); - } else { - console.info('setVolume fail!'); - } -}); +avPlayer.on('availableBitrates', (bitrates: Array) => { + console.info('availableBitrates success,and availableBitrates length is:' + bitrates.length) +}) ``` -### setVolume8+ +### off('availableBitrates')9+ -setVolume(vol: number): Promise\ +off(type: 'availableBitrates'): void -通过Promise方式设置音量。 +取消监听HLS协议流可用的比特率列表。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------ | ------ | ---- | ------------------------------------------------------------ | -| vol | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 | - -**返回值:** - -| 类型 | 说明 | -| -------------- | ------------------------- | -| Promise\ | 设置音量的Promise返回值。 | +| type | string | 是 | HLS协议可用比特率上报事件回调类型,取消注册的事件:'availableBitrates'。 | **示例:** ```js -let vol = 0.5; -videoPlayer.setVolume(vol).then(() => { - console.info('setVolume success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); +avPlayer.off('availableBitrates') ``` -### release8+ +### setVolume9+ -release(callback: AsyncCallback\): void +setVolume(volume: number): void -通过回调方式释放视频资源。 +设置媒体播放音量,只能在prepared/playing/paused/complete状态调用,可以通过[volumeChange事件](#volumeChange_on)确认是否生效。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ------------------------ | -| callback | AsyncCallback\ | 是 | 释放视频资源的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| volume | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 | **示例:** ```js -videoPlayer.release((err) => { - if (err == null) { - console.info('release success!'); - } else { - console.info('release fail!'); - } -}); +let volume = 1.0 +avPlayer.setVolume(volume) ``` -### release8+ +### on('volumeChange')9+ -release(): Promise\ +on(type: 'volumeChange', callback: Callback\): void -通过Promise方式释放视频资源。 +监听setVolume生效的事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**返回值:** +**参数:** -| 类型 | 说明 | -| -------------- | ----------------------------- | -| Promise\ | 释放视频资源的Promise返回值。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | setVolume生效的事件回调类型,支持的事件:'volumeChange',每次调用setVolume后都会回调此事件。 | +| callback | function | 是 | setVolume生效的事件回调方法,上报生效的媒体音量。 | **示例:** ```js -videoPlayer.release().then(() => { - console.info('release success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); +avPlayer.on('volumeChange', (vol:number) => { + console.info('volumeChange success,and new volume is :' + vol) +}) ``` -### getTrackDescription8+ +### off('volumeChange')9+ -getTrackDescription(callback: AsyncCallback>): void +off(type: 'volumeChange'): void -通过回调方式获取视频轨道信息。 +取消监听setVolume生效的事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------ | -| callback | AsyncCallback> | 是 | 视频轨道信息MediaDescription数组回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | setVolume生效的事件回调类型,取消注册的事件:'availableBitrates'。 | **示例:** ```js -function printfDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info('video key is ' + item); - console.info('video value is ' + property); - } -} - -videoPlayer.getTrackDescription((error, arrList) => { - if ((arrList) != null) { - for (let i = 0; i < arrList.length; i++) { - printfDescription(arrList[i]); - } - } else { - console.log(`video getTrackDescription fail, error:${error}`); - } -}); +avPlayer.off('volumeChange') ``` -### getTrackDescription8+ +### on('endOfStream')9+ -getTrackDescription(): Promise> +on(type: 'endOfStream', callback: Callback\): void -通过Promise方式获取视频轨道信息。 +监听资源播放至结尾的事件;如果用户设置**loop=1**,播放会跳转至开头重播;如果用户没有设置loop,会通过[stateChange](#stateChange_on)上报completed状态。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer -**返回值:** +**参数:** -| 类型 | 说明 | -| ------------------------------------------------------ | ----------------------------------------------- | -| Promise> | 视频轨道信息MediaDescription数组Promise返回值。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 资源播放至结尾的事件回调类型,支持的事件:'endOfStream',当播放至结尾时会上报此事件。 | +| callback | Callback\ | 是 | 资源播放至结尾的事件回调方法。 | **示例:** ```js -function printfDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info('video key is ' + item); - console.info('video value is ' + property); - } -} - -let arrayDescription; -videoPlayer.getTrackDescription().then((arrList) => { - if (arrList != null) { - arrayDescription = arrList; - } else { - console.log('video getTrackDescription fail'); - } -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); -for (let i = 0; i < arrayDescription.length; i++) { - printfDescription(arrayDescription[i]); -} +avPlayer.on('endOfStream', () => { + console.info('endOfStream success') +}) ``` -### setSpeed8+ +### off('endOfStream')9+ -setSpeed(speed:number, callback: AsyncCallback\): void +off(type: 'endOfStream'): void -通过回调方式设置播放速度。 +取消监听资源播放至结尾的事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ---------------------- | ---- | ---------------------------------------------------------- | -| speed | number | 是 | 指定播放视频速度,具体见[PlaybackSpeed](#playbackspeed8)。 | -| callback | AsyncCallback\ | 是 | 设置播放速度的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 资源播放至结尾的事件回调类型,取消注册的事件:'endOfStream'。 | **示例:** ```js -import media from '@ohos.multimedia.media' -let speed = media.PlaybackSpeed.SPEED_FORWARD_2_00_X; - -videoPlayer.setSpeed(speed, (err, result) => { - if (err == null) { - console.info('setSpeed success!'); - } else { - console.info('setSpeed fail!'); - } -}); +avPlayer.off('endOfStream') ``` -### setSpeed8+ +### on('timeUpdate')9+ -setSpeed(speed:number): Promise\ +on(type: 'timeUpdate', callback: Callback\): void -通过Promise方式设置播放速度。 +监听资源播放当前时间,单位为毫秒(ms),用于刷新进度条当前位置,默认间隔1s时间上报,因用户操作(seek)产生的时间变化会立刻上报。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------ | ---- | ---------------------------------------------------------- | -| speed | number | 是 | 指定播放视频速度,具体见[PlaybackSpeed](#playbackspeed8)。 | - -**返回值:** - -| 类型 | 说明 | -| ---------------- | ------------------------------------------------------------ | -| Promise\ | 播放速度Promise返回值,具体见[PlaybackSpeed](#playbackspeed8)。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ---------------------------------------------- | +| type | string | 是 | 时间更新的回调类型,支持的事件:'timeUpdate'。 | +| callback | function | 是 | 当前时间。 | **示例:** ```js -import media from '@ohos.multimedia.media' -let speed = media.PlaybackSpeed.SPEED_FORWARD_2_00_X; - -videoPlayer.setSpeed(speed).then(() => { - console.info('setSpeed success'); -}).catch((error) => { - console.info(`video catchCallback, error:${error}`); -}); +avPlayer.on('timeUpdate', (time:number) => { + console.info('timeUpdate success,and new time is :' + time) +}) ``` -### on('playbackCompleted')8+ +### off('timeUpdate')9+ -on(type: 'playbackCompleted', callback: Callback\): void +off(type: 'timeUpdate'): void -开始监听视频播放完成事件。 +取消监听资源播放当前时间。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | ---- | ----------------------------------------------------------- | -| type | string | 是 | 视频播放完成事件回调类型,支持的事件:'playbackCompleted'。 | -| callback | function | 是 | 视频播放完成事件回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | -------------------------------------------------- | +| type | string | 是 | 时间更新的回调类型,取消注册的事件:'timeUpdate'。 | **示例:** ```js -videoPlayer.on('playbackCompleted', () => { - console.info('playbackCompleted success!'); -}); +avPlayer.off('timeUpdate') ``` -### on('bufferingUpdate')8+ +### on('durationUpdate')9+ -on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void +on(type: 'durationUpdate', callback: Callback\): void -开始监听视频缓存更新事件。仅网络播放支持该订阅事件。 +监听资源播放资源的时长,单位为毫秒(ms),用于刷新进度条长度,默认只在prepared上报一次,同时允许一些特殊码流刷新多次时长。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 视频缓存事件回调类型,支持的事件:'bufferingUpdate'。 | -| callback | function | 是 | 视频缓存事件回调方法。
[BufferingInfoType](#bufferinginfotype8)为BUFFERING_PERCENT或CACHED_DURATION时,value值有效,否则固定为0。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | -------------------------------------------------- | +| type | string | 是 | 时长更新的回调类型,支持的事件:'durationUpdate'。 | +| callback | function | 是 | 资源时长。 | **示例:** ```js -videoPlayer.on('bufferingUpdate', (infoType, value) => { - console.log('video bufferingInfo type: ' + infoType); - console.log('video bufferingInfo value: ' + value); -}); +avPlayer.on('durationUpdate', (duration) => { + console.info('durationUpdate success,new duration is :' + duration) +}) ``` -### on('startRenderFrame')8+ +### off('durationUpdate')9+ -on(type: 'startRenderFrame', callback: Callback\): void +off(type: 'durationUpdate'): void -开始监听视频播放首帧送显上报事件。 +取消监听资源播放资源的时长。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | --------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 视频播放首帧送显上报事件回调类型,支持的事件:'startRenderFrame'。 | -| callback | Callback\ | 是 | 视频播放首帧送显上报事件回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------ | +| type | string | 是 | 时长更新的回调类型,取消注册的事件:'durationUpdate'。 | **示例:** ```js -videoPlayer.on('startRenderFrame', () => { - console.info('startRenderFrame success!'); -}); +avPlayer.off('durationUpdate') ``` -### on('videoSizeChanged')8+ +### on('bufferingUpdate')9+ -on(type: 'videoSizeChanged', callback: (width: number, height: number) => void): void +on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void -开始监听视频播放宽高变化事件。 +订阅音视频缓存更新事件,仅网络播放支持该订阅事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 视频播放宽高变化事件回调类型,支持的事件:'videoSizeChanged'。 | -| callback | function | 是 | 视频播放宽高变化事件回调方法,width表示宽,height表示高。 | +| type | string | 是 | 播放缓存事件回调类型,支持的事件:'bufferingUpdate'。 | +| callback | function | 是 | 播放缓存事件回调方法。
[BufferingInfoType](#bufferinginfotype8)为BUFFERING_PERCENT或CACHED_DURATION时,value值有效,否则固定为0。 | **示例:** ```js -videoPlayer.on('videoSizeChanged', (width, height) => { - console.log('video width is: ' + width); - console.log('video height is: ' + height); -}); +avPlayer.on('bufferingUpdate', (infoType: media.BufferingInfoType, value: number) => { + console.info('bufferingUpdate success,and infoType value is:' + infoType + ', value is :' + value) +}) ``` -### on('error')8+ +### off('bufferingUpdate')9+ -on(type: 'error', callback: ErrorCallback): void +off(type: 'bufferingUpdate'): void -开始监听视频播放错误事件,当上报error错误事件后,用户需处理error事件,退出播放操作。 +取消监听音视频缓存更新事件。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 播放错误事件回调类型,支持的事件包括:'error'。
- 'error':视频播放中发生错误,触发该事件。 | -| callback | ErrorCallback | 是 | 播放错误事件回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | --------------------------------------------------------- | +| type | string | 是 | 播放缓存事件回调类型,取消注册的事件:'bufferingUpdate'。 | **示例:** ```js -videoPlayer.on('error', (error) => { // 设置'error'事件回调 - console.info(`video error called, error: ${error}`); -}); -videoPlayer.url = 'fd://error'; //设置错误的播放地址,触发'error'事件 +avPlayer.off('bufferingUpdate') ``` -### on('availableBitratesCollect')9+ +### on('startRenderFrame')9+ -on(type: 'availableBitratesCollect', callback: (bitrates: Array\) => void): void +on(type: 'startRenderFrame', callback: Callback\): void -开始监听视频播放码率上报事件。 +订阅视频播放开始首帧渲染的更新事件,仅视频播放支持该订阅事件,该事件仅代表播放服务将第一帧画面送显示模块,实际效果依赖显示服务渲染性能。 -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | -------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 视频播放码率上报事件回调类型,支持的事件:'availableBitratesCollect',只在开始播放时候上报一次 | -| callback | function | 是 | 视频播放码率事件回调方法,使用数组存放支持的码率。 | +| type | string | 是 | 视频播放开始首帧渲染事件回调类型,支持的事件:'startRenderFrame'。 | +| callback | Callback\ | 是 | 视频播放开始首帧渲染事件回调方法。 | **示例:** ```js -videoPlayer.on('availableBitratesCollect', (bitrates) => { - for (let i = 0; i < bitrates.length; i++) { - console.info('case availableBitratesCollect bitrates: ' + bitrates[i]); //打印支持的码率 - } -}); +avPlayer.on('startRenderFrame', () => { + console.info('startRenderFrame success') +}) ``` -## VideoPlayState8+ +### off('startRenderFrame')9+ -视频播放的状态机,可通过state属性获取当前状态。 +off(type: 'startRenderFrame'): void -**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer +取消监听视频播放开始首帧渲染的更新事件。 -| 名称 | 类型 | 说明 | -| -------- | ------ | -------------- | -| idle | string | 视频播放空闲。 | -| prepared | string | 视频播放准备。 | -| playing | string | 视频正在播放。 | -| paused | string | 视频暂停播放。 | -| stopped | string | 视频播放停止。 | -| error | string | 错误状态。 | +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 视频播放开始首帧渲染事件回调类型,取消注册的事件:'startRenderFrame'。 | + +**示例:** + +```js +avPlayer.off('startRenderFrame') +``` + +### on('videoSizeChange')9+ + +on(type: 'videoSizeChange', callback: (width: number, height: number) => void): void + +监听视频播放宽高变化事件,仅视频播放支持该订阅事件,默认只在prepread状态上报一次,但HLS协议码流会在切换分辨率时上报; + +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 视频播放宽高变化事件回调类型,支持的事件:'videoSizeChange'。 | +| callback | function | 是 | 视频播放宽高变化事件回调方法,width表示宽,height表示高。 | + +**示例:** + +```js +avPlayer.on('videoSizeChange', (width: number, height: number) => { + console.info('videoSizeChange success,and width is:' + width + ', height is :' + height) +}) +``` + +### off('videoSizeChange')9+ + +off(type: 'videoSizeChange'): void + +取消监听视频播放宽高变化事件。 + +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 视频播放宽高变化事件回调类型,取消注册的事件:'videoSizeChange'。 | + +**示例:** + +```js +avPlayer.off('videoSizeChange') +``` + +### on('audioInterrupt')9+ + +on(type: 'audioInterrupt', callback: (info: audio.InterruptEvent) => void): void + +监听音频焦点变化事件,多个音视频资源同时播放时,会根据音频焦点模型[audio.InterruptMode](js-apis-audio.md#interruptmode9)触发此事件。 + +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | -------------------------------------------------------- | +| type | string | 是 | 音频焦点变化事件回调类型,支持的事件:'audioInterrupt'。 | +| callback | [audio.InterruptEvent9+](js-apis-audio.md#interruptevent9) | 是 | 音频焦点变化事件回调方法。 | + +**示例:** + +```js +avPlayer.on('audioInterrupt', (info: audio.InterruptEvent) => { + console.info('audioInterrupt success,and InterruptEvent info is:' + info) +}) +``` + +### off('audioInterrupt')9+ + +off(type: 'audioInterrupt'): void + +取消监听音频焦点变化事件。 + +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 音频焦点变化事件回调类型,取消注册的事件:'audioInterrupt'。 | + +**示例:** + +```js +avPlayer.off('audioInterrupt') +``` + +## AVPlayerState9+ + +[AVPlayer](#avplayer9)的状态机,可通过state属性主动获取当前状态,也可通过监听[stateChange](#stateChange_on)事件上报当前状态,状态机之间的切换规则,可参考[AVPlayer播放器开发指导](../../media/avplayer-playback.md)。 + +**系统能力:** SystemCapability.Multimedia.Media.AVPlayer + +| 名称 | 类型 | 说明 | +| :-----------------------------: | :----: | :----------------------------------------------------------- | +| idle | string | 闲置状态,AVPlayer刚被创建[createAVPlayer()](#mediacreateavplayer9)或者调用了reset()方法之后,进入Idle状态。
首次创建createAVPlayer(),所有属性都为默认值。
调用reset()方法,url9+ 或 fdSrc9+属性会被重置,其他用户设置的属性将被保留。 | +| initialized | string | 资源初始化,在Idle 状态设置 url9+ 或 fdSrc9+属性,AVPlayer会进入initialized状态,此时可以配置窗口、音频等静态属性。 | +| prepared | string | 已准备状态,在initialized状态调用prepare()方法,AVPlayer会进入prepared状态,此时播放引擎的资源已准备就绪。 | +| playing | string | 正在播放状态,在prepared/paused/completed状态调用play()方法,AVPlayer会进入playing状态。 | +| paused | string | 暂停状态,在playing状态调用pause方法,AVPlayer会进入paused状态。 | +| completed | string | 播放至结尾状态,当媒体资源播放至结尾时,如果用户未设置循环播放(loop = 1),AVPlayer会进入completed状态,此时调用play()会进入playing状态和重播,调用stop()会进入stopped状态。 | +| stopped | string | 停止状态,在prepared/playing/paused/completed状态调用stop()方法,AVPlayer会进入stopped状态,此时播放引擎只会保留属性,但会释放内存资源,可以调用prepare()重新准备,也可以调用reset()重置,或者调用release()彻底销毁。 | +| released | string | 销毁状态,销毁与当前AVPlayer关联的播放引擎,无法再进行状态转换,调用release()方法后,会进入released状态,结束流程。 | +| error | string | 错误状态,当**播放引擎**发生**不可逆的错误**,详见[错误分类](#error_info),则会转换至当前状态,可以调用reset()重置,也可以调用release()销毁重建。
**注意:** 区分error状态和 [on('error')](#error_on) :
1、进入error状态时,会触发[on('error')](#error_on)监听事件,可以通过[on('error')](#error_on)事件获取详细错误信息;
2、处于error状态时,播放服务进入不可播控的状态,要求客户端设计容错机制,使用reset()重置或者release()销毁重建;
3、如果客户端收到[on('error')](#error_on),但未进入error状态:
原因1:客户端未按状态机调用API或传入参数错误,被AVPlayer拦截提醒,需要客户端调整代码逻辑;
原因2:播放过程发现码流问题,导致容器、解码短暂异常,不影响连续播放和播控操作的,不需要客户端设计容错机制。 | + +## AVFileDescriptor9+ + +音视频文件资源描述,一种特殊资源的播放方式,使用场景:应用中的音频资源被连续存储在同一个文件中,需要根据偏移量和长度进行播放。 + +**系统能力:** SystemCapability.Multimedia.Media.Core + +| 名称 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| fd | number | 是 | 资源句柄,通过resourceManager.getRawFileDescriptor获取。 | +| offset | number | 是 | 资源偏移量,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误。 | +| length | number | 是 | 资源长度,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误。 | ## SeekMode8+ @@ -1557,10 +1637,10 @@ videoPlayer.on('availableBitratesCollect', (bitrates) => { **系统能力:** SystemCapability.Multimedia.Media.VideoPlayer -| 名称 | 值 | 说明 | -| ---------------------------- | ------ | ---------- | -| VIDEO_SCALE_TYPE_FIT | 0 | 视频拉伸至与窗口等大。 | -| VIDEO_SCALE_TYPE_FIT_CROP| 1 | 保持视频宽高比拉伸至填满窗口,内容可能会有裁剪。 | +| 名称 | 值 | 说明 | +| ------------------------- | ---- | ------------------------------------------------ | +| VIDEO_SCALE_TYPE_FIT | 0 | 视频拉伸至与窗口等大。 | +| VIDEO_SCALE_TYPE_FIT_CROP | 1 | 保持视频宽高比拉伸至填满窗口,内容可能会有裁剪。 | ## MediaDescription8+ @@ -1589,926 +1669,910 @@ audioPlayer.getTrackDescription((error, arrList) => { }); ``` -## AudioRecorder +## AVRecorder9+ -音频录制管理类,用于录制音频媒体。在调用AudioRecorder的方法前,需要先通过[createAudioRecorder()](#mediacreateaudiorecorder) 构建一个[AudioRecorder](#audiorecorder)实例。 +音视频录制管理类,用于音视频媒体录制。在调用AVRecorder的方法前,需要先通过createAVRecorder()构建一个AVRecorder实例。 -音频录制demo可参考:[音频录制开发指导](../../media/audio-recorder.md) +音视频录制demo可参考:[音视频录制开发指导](../../media/avrecorder.md) -### prepare +### 属性 -prepare(config: AudioRecorderConfig): void +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -录音准备。 +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------- | ------------------------------------ | ---- | ---- | ------------------ | +| state9+ | [AVRecorderState](#avrecorderstate9) | 是 | 否 | 音视频录制的状态。 | + +### prepare9+ + +prepare(config: AVRecorderConfig, callback: AsyncCallback\): void + +异步方式进行音视频录制的参数设置。通过注册回调函数获取返回值。 **需要权限:** ohos.permission.MICROPHONE -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +不涉及音频录制时,可以不需要获取ohos.permission.MICROPHONE权限。涉及相机视频录制则需要额外获取相机权限ohos.permission.CAMERA。 + +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ------------------------------------------- | ---- | ------------------------------------------------------------ | -| config | [AudioRecorderConfig](#audiorecorderconfig) | 是 | 配置录音的相关参数,包括音频输出URI、编码格式、采样率、声道数、输出格式等。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------- | ---- | ------------------------------------- | +| config | [AVRecorderConfig](#avrecorderconfig9) | 是 | 配置音视频录制的相关参数。 | +| callback | AsyncCallback\ | 是 | 异步音视频录制prepare方法的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 + +| 错误码ID | 错误信息 | +| -------- | --------------------------------------- | +| 201 | Permission denied. Return by callback. | +| 401 | Parameter error. Return by callback. | +| 5400102 | Operate not permit. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -let audioRecorderConfig = { - audioEncoder : media.AudioEncoder.AAC_LC, - audioEncodeBitRate : 22050, - audioSampleRate : 22050, - numberOfChannels : 2, - format : media.AudioOutputFormat.AAC_ADTS, - uri : 'fd://1', // 文件需先由调用者创建,并给予适当的权限 - location : { latitude : 30, longitude : 130}, +let AVRecorderProfile = { + audioBitrate : 48000, + audioChannels : 2, + audioCodec : media.CodecMimeType.AUDIO_AAC, + audioSampleRate : 48000, + fileFormat : media.ContainerFormatType.CFT_MPEG_4, + videoBitrate : 48000, + videoCodec : media.CodecMimeType.VIDEO_MPEG4, + videoFrameWidth : 640, + videoFrameHeight : 480, + videoFrameRate : 30 } -audioRecorder.on('prepare', () => { //设置'prepare'事件回调 - console.log('prepare success'); -}); -audioRecorder.prepare(audioRecorderConfig); +let AVRecorderConfig = { + audioSourceType : media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, + videoSourceType : media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, + profile : AVRecorderProfile, + url : 'fd://', // 文件需先由调用者创建,赋予读写权限,将文件fd传给此参数,eg.fd://45 + rotation : 0, // 合理值0、90、180、270,非合理值prepare接口将报错 + location : { latitude : 30, longitude : 130 } +} + +AVRecorder.prepare(AVRecorderConfig, (err) => { + if (err == null) { + console.info('prepare success'); + } else { + console.info('prepare failed and error is ' + err.message); + } +}) ``` +### prepare9+ -### start +prepare(config: AVRecorderConfig): Promise\ -start(): void +异步方式进行音视频录制的参数设置。通过Promise获取返回值。 -开始录制,需在[prepare](#audiorecorder_on)事件成功触发后,才能调用start方法。 +**需要权限:** ohos.permission.MICROPHONE -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +不涉及音频录制时,可以不需要获ohos.permission.MICROPHONE权限。涉及相机视频录制则需要额外获取相机权限ohos.permission.CAMERA。 -**示例:** +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -```js -audioRecorder.on('start', () => { //设置'start'事件回调 - console.log('audio recorder start success'); -}); -audioRecorder.start(); -``` +**参数:** -### pause +| 参数名 | 类型 | 必填 | 说明 | +| ------ | -------------------------------------- | ---- | -------------------------- | +| config | [AVRecorderConfig](#avrecorderconfig9) | 是 | 配置音视频录制的相关参数。 | -pause():void +**返回值:** -暂停录制,需要在[start](#audiorecorder_on)事件成功触发后,才能调用pause方法。 +| 类型 | 说明 | +| -------------- | ------------------------------------------ | +| Promise\ | 异步音视频录制prepare方法的Promise返回值。 | -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 + +| 错误码ID | 错误信息 | +| -------- | -------------------------------------- | +| 201 | Permission denied. Return by promise. | +| 401 | Parameter error. Return by promise. | +| 5400102 | Operate not permit. Return by promise. | +| 5400105 | Service died. Return by promise. | **示例:** ```js -audioRecorder.on('pause', () => { //设置'pause'事件回调 - console.log('audio recorder pause success'); +let AVRecorderProfile = { + audioBitrate : 48000, + audioChannels : 2, + audioCodec : media.CodecMimeType.AUDIO_AAC, + audioSampleRate : 48000, + fileFormat : media.ContainerFormatType.CFT_MPEG_4, + videoBitrate : 48000, + videoCodec : media.CodecMimeType.VIDEO_MPEG4, + videoFrameWidth : 640, + videoFrameHeight : 480, + videoFrameRate : 30 +} +let AVRecorderConfig = { + audioSourceType : media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, + videoSourceType : media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, + profile : AVRecorderProfile, + url : 'fd://', // 文件需先由调用者创建,赋予读写权限,将文件fd传给此参数,eg.fd://45 + rotation : 0, // 合理值0、90、180、270,非合理值prepare接口报错 + location : { latitude : 30, longitude : 130 } +} + +AVRecorder.prepare(AVRecorderConfig).then(() => { + console.info('prepare success'); +}).catch((err) => { + console.info('prepare failed and catch error is ' + err.message); }); -audioRecorder.pause(); + ``` -### resume +### getInputSurface9+ -resume():void +getInputSurface(callback: AsyncCallback\): void -恢复录制,需要在[pause](#audiorecorder_on)事件成功触发后,才能调用resume方法。 +异步方式获得录制需要的surface。此surface提供给调用者,调用者从此surface中获取surfaceBuffer,填入相应的视频数据。 -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +应当注意,填入的视频数据需要携带时间戳(单位ns)和buffersize。时间戳的起始时间请以系统启动时间为基准。 -**示例:** +需在prepare()事件成功触发后,才能调用getInputSurface()方法。 -```js -audioRecorder.on('resume', () => { //设置'resume'事件回调 - console.log('audio recorder resume success'); -}); -audioRecorder.resume(); -``` +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -### stop +**参数:** -stop(): void +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | --------------------------- | +| callback | AsyncCallback\ | 是 | 异步获得surface的回调方法。 | -停止录音。 +**错误码:** -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | --------------------------------------- | +| 5400102 | Operate not permit. Return by callback. | +| 5400103 | IO error. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -audioRecorder.on('stop', () => { //设置'stop'事件回调 - console.log('audio recorder stop success'); +let surfaceID = null; // 该surfaceID用于传递给相机接口创造videoOutput + +AVRecorder.getInputSurface((err, surfaceId) => { + if (err == null) { + console.info('getInputSurface success'); + surfaceID = surfaceId; + } else { + console.info('getInputSurface failed and error is ' + err.message); + } }); -audioRecorder.stop(); + +// videoOutput = await cameraManager.createVideoOutput(videoProfiles[0], surfaceID); + ``` -### release +### getInputSurface9+ -release(): void +getInputSurface(): Promise\ -释放录音资源。 +异步方式获得录制需要的surface。此surface提供给调用者,调用者从此surface中获取surfaceBuffer,填入相应的视频数据。 -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +应当注意,填入的视频数据需要携带时间戳(单位ns)和buffersize。时间戳的起始时间请以系统启动时间为基准。 -**示例:** +需在prepare()事件成功触发后,才能调用getInputSurface方法。 -```js -audioRecorder.on('release', () => { //设置'release'事件回调 - console.log('audio recorder release success'); -}); -audioRecorder.release(); -audioRecorder = undefined; -``` +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -### reset +**返回值:** -reset(): void +| 类型 | 说明 | +| ---------------- | -------------------------------- | +| Promise\ | 异步获得surface的Promise返回值。 | -重置录音。 +**错误码:** -进行重置录音之前,需要先调用[stop()](#audiorecorder_stop)停止录音。重置录音之后,需要调用[prepare()](#audiorecorder_prepare)设置录音参数项,才能再次进行录音。 +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +| 错误码ID | 错误信息 | +| -------- | -------------------------------------- | +| 5400102 | Operate not permit. Return by promise. | +| 5400103 | IO error. Return by promise. | +| 5400105 | Service died. Return by promise. | **示例:** ```js -audioRecorder.on('reset', () => { //设置'reset'事件回调 - console.log('audio recorder reset success'); +let surfaceID = null; // 该surfaceID用于传递给相机接口创造videoOutput + +AVRecorder.getInputSurface().then((surfaceId) => { + console.info('getInputSurface success'); + surfaceID = surfaceId; +}).catch((err) => { + console.info('getInputSurface failed and catch error is ' + err.message); }); -audioRecorder.reset(); + +// videoOutput = await cameraManager.createVideoOutput(videoProfiles[0], surfaceID); ``` -### on('prepare' | 'start' | 'pause' | 'resume' | 'stop' | 'release' | 'reset') +### start9+ -on(type: 'prepare' | 'start' | 'pause' | 'resume' | 'stop' | 'release' | 'reset', callback: () => void): void +start(callback: AsyncCallback\): void -开始订阅音频录制事件。 +异步方式开始视频录制。通过注册回调函数获取返回值。 -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +纯音频录制需在prepare()事件成功触发后,才能调用start方法。纯视频录制,音视频录制需在getInputSurface()事件成功触发后,才能调用start方法。 + +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 录制事件回调类型,支持的事件包括:'prepare' \| 'start' \| 'pause' \| ’resume‘ \| 'stop' \| 'release' \| 'reset'。
- 'prepare' :完成[prepare](#audiorecorder_prepare)调用,音频录制参数设置完成,触发该事件。
- 'start' :完成[start](#audiorecorder_start)调用,音频录制开始,触发该事件。
- 'pause': 完成[pause](#audiorecorder_pause)调用,音频暂停录制,触发该事件。
- 'resume': 完成[resume](#audiorecorder_resume)调用,音频恢复录制,触发该事件。
- 'stop' :完成[stop](#audiorecorder_stop)调用,音频停止录制,触发该事件。
- 'release' :完成[release](#audiorecorder_release)调用,音频释放录制资源,触发该事件。
- 'reset':完成[reset](#audiorecorder_reset)调用,音频重置为初始状态,触发该事件。 | -| callback | ()=>void | 是 | 录制事件回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------- | +| callback | AsyncCallback\ | 是 | 异步开始视频录制的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 + +| 错误码ID | 错误信息 | +| -------- | --------------------------------------- | +| 5400102 | Operate not permit. Return by callback. | +| 5400103 | IO error. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -let audioRecorder = media.createAudioRecorder(); // 创建一个音频录制实例 -let audioRecorderConfig = { - audioEncoder : media.AudioEncoder.AAC_LC, - audioEncodeBitRate : 22050, - audioSampleRate : 22050, - numberOfChannels : 2, - format : media.AudioOutputFormat.AAC_ADTS, - uri : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 - location : { latitude : 30, longitude : 130}, -} -audioRecorder.on('error', (error) => { // 设置'error'事件回调 - console.info(`audio error called, error: ${error}`); -}); -audioRecorder.on('prepare', () => { // 设置'prepare'事件回调 - console.log('prepare success'); - audioRecorder.start(); // 开始录制,并触发'start'事件回调 -}); -audioRecorder.on('start', () => { // 设置'start'事件回调 - console.log('audio recorder start success'); -}); -audioRecorder.on('pause', () => { // 设置'pause'事件回调 - console.log('audio recorder pause success'); -}); -audioRecorder.on('resume', () => { // 设置'resume'事件回调 - console.log('audio recorder resume success'); -}); -audioRecorder.on('stop', () => { // 设置'stop'事件回调 - console.log('audio recorder stop success'); -}); -audioRecorder.on('release', () => { // 设置'release'事件回调 - console.log('audio recorder release success'); -}); -audioRecorder.on('reset', () => { // 设置'reset'事件回调 - console.log('audio recorder reset success'); +AVRecorder.start((err) => { + if (err == null) { + console.info('start AVRecorder success'); + } else { + console.info('start AVRecorder failed and error is ' + err.message); + } }); -audioRecorder.prepare(audioRecorderConfig) // 设置录制参数 ,并触发'prepare'事件回调 ``` -### on('error') +### start9+ -on(type: 'error', callback: ErrorCallback): void +start(): Promise\ -开始订阅音频录制错误事件,当上报error错误事件后,用户需处理error事件,退出录制操作。 +异步方式开始视频录制。通过Promise获取返回值。 -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +纯音频录制需在prepare()事件成功触发后,才能调用start方法。纯视频录制,音视频录制需在getInputSurface()事件成功触发后,才能调用start方法。 -**参数:** +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 录制错误事件回调类型'error'。
- 'error':音频录制过程中发生错误,触发该事件。 | -| callback | ErrorCallback | 是 | 录制错误事件回调方法。 | +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步开始视频录制方法的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 + +| 错误码ID | 错误信息 | +| -------- | -------------------------------------- | +| 5400102 | Operate not permit. Return by promise. | +| 5400103 | IO error. Return by promise. | +| 5400105 | Service died. Return by promise. | **示例:** ```js -let audioRecorderConfig = { - audioEncoder : media.AudioEncoder.AAC_LC, - audioEncodeBitRate : 22050, - audioSampleRate : 22050, - numberOfChannels : 2, - format : media.AudioOutputFormat.AAC_ADTS, - uri : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 - location : { latitude : 30, longitude : 130}, -} -audioRecorder.on('error', (error) => { // 设置'error'事件回调 - console.info(`audio error called, error: ${error}`); +AVRecorder.start().then(() => { + console.info('start AVRecorder success'); +}).catch((err) => { + console.info('start AVRecorder failed and catch error is ' + err.message); }); -audioRecorder.prepare(audioRecorderConfig); // prepare不设置参数,触发'error'事件 ``` -## AudioRecorderConfig +### pause9+ -表示音频的录音配置。 +pause(callback: AsyncCallback\): void -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +异步方式暂停视频录制。通过注册回调函数获取返回值。 -| 名称 | 类型 | 必填 | 说明 | -| --------------------- | --------------------------------------- | ---- | ------------------------------------------------------------ | -| audioEncoder(deprecated) | [AudioEncoder](#audioencoder) | 否 | 音频编码格式,默认设置为AAC_LC。
**说明:** 从API Version 8 开始废弃,建议使用audioEncoderMime替代。 | -| audioEncodeBitRate | number | 否 | 音频编码比特率,默认值为48000。 | -| audioSampleRate | number | 否 | 音频采集采样率,默认值为48000。 | -| numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 | -| format(deprecated) | [AudioOutputFormat](#audiooutputformat) | 否 | 音频输出封装格式,默认设置为MPEG_4。
**说明:** 从API Version 8 开始废弃,建议使用fileFormat替代。 | -| location | [Location](#location) | 否 | 音频采集的地理位置。 | -| uri | string | 是 | 音频输出URI:fd://xx (fd number)
![](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | -| audioEncoderMime8+ | [CodecMimeType](#codecmimetype8) | 否 | 音频编码格式。 | -| fileFormat8+ | [ContainerFormatType](#containerformattype8) | 否 | 音频编码格式。 | +需要start()事件成功触发后,才能调用pause方法,可以通过调用resume()接口来恢复录制。 -## AudioEncoder(deprecated) +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -> **说明:** -> 从 API Version 8 开始废弃,建议使用[CodecMimeType](#codecmimetype8)替代。 +**参数:** -表示音频编码格式的枚举。 +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | --------------------------- | +| callback | AsyncCallback\ | 是 | 异步获得surface的回调方法。 | -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +**错误码:** -| 名称 | 值 | 说明 | -| ------- | ---- | ------------------------------------------------------------ | -| DEFAULT | 0 | 默认编码格式。
仅做接口定义,暂不支持使用。 | -| AMR_NB | 1 | AMR-NB(Adaptive Multi Rate-Narrow Band Speech Codec) 编码格式。
仅做接口定义,暂不支持使用。 | -| AMR_WB | 2 | AMR-WB(Adaptive Multi Rate-Wide Band Speech Codec) 编码格式。
仅做接口定义,暂不支持使用。 | -| AAC_LC | 3 | AAC-LC(Advanced Audio Coding Low Complexity)编码格式。 | -| HE_AAC | 4 | HE_AAC(High-Efficiency Advanced Audio Coding)编码格式。
仅做接口定义,暂不支持使用。 | +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 +| 错误码ID | 错误信息 | +| -------- | --------------------------------------- | +| 5400102 | Operate not permit. Return by callback. | +| 5400103 | IO error. Return by callback. | +| 5400105 | Service died. Return by callback. | -## AudioOutputFormat(deprecated) +**示例:** -> **说明:** -> 从 API Version 8 开始废弃,建议使用[ContainerFormatType](#containerformattype8)替代。 +```js +AVRecorder.pause((err) => { + if (err == null) { + console.info('pause AVRecorder success'); + } else { + console.info('pause AVRecorder failed and error is ' + err.message); + } +}); +``` -表示音频封装格式的枚举。 +### pause9+ -**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder +pause(): Promise\ -| 名称 | 值 | 说明 | -| -------- | ---- | ------------------------------------------------------------ | -| DEFAULT | 0 | 默认封装格式。
仅做接口定义,暂不支持使用。 | -| MPEG_4 | 2 | 封装为MPEG-4格式。 | -| AMR_NB | 3 | 封装为AMR_NB格式。
仅做接口定义,暂不支持使用。 | -| AMR_WB | 4 | 封装为AMR_WB格式。
仅做接口定义,暂不支持使用。 | -| AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。 | +异步方式暂停视频录制。通过Promise获取返回值。 -## VideoRecorder9+ +需要start()事件成功触发后,才能调用pause方法,可以通过调用resume()接口来恢复录制。 -视频录制管理类,用于录制视频媒体。在调用VideoRecorder的方法前,需要先通过[createVideoRecorder()](#mediacreatevideorecorder9)构建一个[VideoRecorder](#videorecorder9)实例。 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -视频录制demo可参考:[视频录制开发指导](../../media/video-recorder.md) +**返回值:** -### 属性 +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步暂停视频录制方法的Promise返回值。 | -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +**错误码:** -**系统接口:** 该接口为系统接口 +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 名称 | 类型 | 可读 | 可写 | 说明 | -| ------------------ | -------------------------------------- | ---- | ---- | ---------------- | -| state9+ | [VideoRecordState](#videorecordstate9) | 是 | 否 | 视频录制的状态。 | +| 错误码ID | 错误信息 | +| -------- | -------------------------------------- | +| 5400102 | Operate not permit. Return by promise. | +| 5400103 | IO error. Return by promise. | +| 5400105 | Service died. Return by promise. | -### prepare9+ +**示例:** -prepare(config: VideoRecorderConfig, callback: AsyncCallback\): void; +```js +AVRecorder.pause().then(() => { + console.info('pause AVRecorder success'); +}).catch((err) => { + console.info('pause AVRecorder failed and catch error is ' + err.message); +}); +``` -异步方式进行视频录制的参数设置。通过注册回调函数获取返回值。 +### resume9+ -**需要权限:** ohos.permission.MICROPHONE +resume(callback: AsyncCallback\): void -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +异步方式恢复视频录制。通过注册回调函数获取返回值。 -**系统接口:** 该接口为系统接口 +需要在pause()事件成功触发后,才能调用resume方法。 + +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------------------------------- | ---- | ----------------------------------- | -| config | [VideoRecorderConfig](#videorecorderconfig9) | 是 | 配置视频录制的相关参数。 | -| callback | AsyncCallback\ | 是 | 异步视频录制prepare方法的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------- | +| callback | AsyncCallback\ | 是 | 异步恢复视频录制的回调方法。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ------------------------------------------ | -| 201 | Permission denied. Return by callback. | -| 401 | Parameter error. Return by callback. | -| 5400102 | Operation not allowed. Return by callback. | -| 5400105 | Service died. Return by callback. | +| 错误码ID | 错误信息 | +| -------- | --------------------------------------- | +| 5400102 | Operate not permit. Return by callback. | +| 5400103 | IO error. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -let videoProfile = { - audioBitrate : 48000, - audioChannels : 2, - audioCodec : 'audio/mp4a-latm', - audioSampleRate : 48000, - fileFormat : 'mp4', - videoBitrate : 48000, - videoCodec : 'video/mp4v-es', - videoFrameWidth : 640, - videoFrameHeight : 480, - videoFrameRate : 30 -} - -let videoConfig = { - audioSourceType : 1, - videoSourceType : 0, - profile : videoProfile, - url : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 - orientationHint : 0, - location : { latitude : 30, longitude : 130 }, -} - -// asyncallback -videoRecorder.prepare(videoConfig, (err) => { +AVRecorder.resume((err) => { if (err == null) { - console.info('prepare success'); + console.info('resume AVRecorder success'); } else { - console.info('prepare failed and error is ' + err.message); + console.info('resume AVRecorder failed and error is ' + err.message); } -}) +}); ``` -### prepare9+ - -prepare(config: VideoRecorderConfig): Promise\; - -异步方式进行视频录制的参数设置。通过Promise获取返回值。 - -**需要权限:** ohos.permission.MICROPHONE +### resume9+ -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +resume(): Promise\ -**系统接口:** 该接口为系统接口 +异步方式恢复视频录制。通过Promise获取返回值。 -**参数:** +需要在pause()事件成功触发后,才能调用resume方法。 -| 参数名 | 类型 | 必填 | 说明 | -| ------ | -------------------------------------------- | ---- | ------------------------ | -| config | [VideoRecorderConfig](#videorecorderconfig9) | 是 | 配置视频录制的相关参数。 | +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **返回值:** -| 类型 | 说明 | -| -------------- | ---------------------------------------- | -| Promise\ | 异步视频录制prepare方法的Promise返回值。 | +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步恢复视频录制方法的Promise返回值。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ----------------------------------------- | -| 201 | Permission denied. Return by promise. | -| 401 | Parameter error. Return by promise. | -| 5400102 | Operation not allowed. Return by promise. | -| 5400105 | Service died. Return by promise. | +| 错误码ID | 错误信息 | +| -------- | -------------------------------------- | +| 5400102 | Operate not permit. Return by promise. | +| 5400103 | IO error. Return by promise. | +| 5400105 | Service died. Return by promise. | **示例:** ```js -let videoProfile = { - audioBitrate : 48000, - audioChannels : 2, - audioCodec : 'audio/mp4a-latm', - audioSampleRate : 48000, - fileFormat : 'mp4', - videoBitrate : 48000, - videoCodec : 'video/mp4v-es', - videoFrameWidth : 640, - videoFrameHeight : 480, - videoFrameRate : 30 -} - -let videoConfig = { - audioSourceType : 1, - videoSourceType : 0, - profile : videoProfile, - url : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 - orientationHint : 0, - location : { latitude : 30, longitude : 130 }, -} - -// promise -videoRecorder.prepare(videoConfig).then(() => { - console.info('prepare success'); +AVRecorder.resume().then(() => { + console.info('resume AVRecorder success'); }).catch((err) => { - console.info('prepare failed and catch error is ' + err.message); + console.info('resume AVRecorder failed and catch error is ' + err.message); }); ``` -### getInputSurface9+ - -getInputSurface(callback: AsyncCallback\): void; +### stop9+ -异步方式获得录制需要的surface。此surface提供给调用者,调用者从此surface中获取surfaceBuffer,填入相应的数据。 +stop(callback: AsyncCallback\): void -应当注意,填入的视频数据需要携带时间戳(单位ns),buffersize。时间戳的起始时间请以系统启动时间为基准。 +异步方式停止视频录制。通过注册回调函数获取返回值。 -只能在[prepare()](#videorecorder_prepare1)接口调用后调用。 +需要在start()或pause()事件成功触发后,才能调用stop方法。 -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +纯音频录制时,需要重新调用prepare()接口才能重新录制。纯视频录制,音视频录制时,需要重新调用prepare()和getInputSurface()接口才能重新录制。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ---------------------- | ---- | --------------------------- | -| callback | AsyncCallback\ | 是 | 异步获得surface的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------- | +| callback | AsyncCallback\ | 是 | 异步停止视频录制的回调方法。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ------------------------------------------ | -| 5400102 | Operation not allowed. Return by callback. | -| 5400103 | I/O error. Return by callback. | -| 5400105 | Service died. Return by callback. | +| 错误码ID | 错误信息 | +| -------- | --------------------------------------- | +| 5400102 | Operate not permit. Return by callback. | +| 5400103 | IO error. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -// asyncallback -let surfaceID = null; // 传递给外界的surfaceID -videoRecorder.getInputSurface((err, surfaceId) => { +AVRecorder.stop((err) => { if (err == null) { - console.info('getInputSurface success'); - surfaceID = surfaceId; + console.info('stop AVRecorder success'); } else { - console.info('getInputSurface failed and error is ' + err.message); + console.info('stop AVRecorder failed and error is ' + err.message); } }); ``` -### getInputSurface9+ +### stop9+ -getInputSurface(): Promise\; +stop(): Promise\ - 异步方式获得录制需要的surface。此surface提供给调用者,调用者从此surface中获取surfaceBuffer,填入相应的数据。 - -应当注意,填入的视频数据需要携带时间戳(单位ns),buffersize。时间戳的起始时间请以系统启动时间为基准。 +异步方式停止视频录制。通过Promise获取返回值。 -只能在[prepare()](#videorecorder_prepare1)接口调用后调用。 +需要在start()或pause()事件成功触发后,才能调用stop方法。 -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +纯音频录制时,需要重新调用prepare()接口才能重新录制。纯视频录制,音视频录制时,需要重新调用prepare()和getInputSurface()接口才能重新录制。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **返回值:** -| 类型 | 说明 | -| ---------------- | -------------------------------- | -| Promise\ | 异步获得surface的Promise返回值。 | +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步停止视频录制方法的Promise返回值。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ----------------------------------------- | -| 5400102 | Operation not allowed. Return by promise. | -| 5400103 | I/O error. Return by promise. | -| 5400105 | Service died. Return by promise. | +| 错误码ID | 错误信息 | +| -------- | -------------------------------------- | +| 5400102 | Operate not permit. Return by promise. | +| 5400103 | IO error. Return by promise. | +| 5400105 | Service died. Return by promise. | **示例:** ```js -// promise -let surfaceID = null; // 传递给外界的surfaceID -videoRecorder.getInputSurface().then((surfaceId) => { - console.info('getInputSurface success'); - surfaceID = surfaceId; +AVRecorder.stop().then(() => { + console.info('stop AVRecorder success'); }).catch((err) => { - console.info('getInputSurface failed and catch error is ' + err.message); + console.info('stop AVRecorder failed and catch error is ' + err.message); }); ``` -### start9+ - -start(callback: AsyncCallback\): void; +### reset9+ -异步方式开始视频录制。通过注册回调函数获取返回值。 +reset(callback: AsyncCallback\): void -在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)后调用,需要依赖数据源先给surface传递数据。 +异步方式重置音视频录制。通过注册回调函数获取返回值。 -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +纯音频录制时,需要重新调用prepare()接口才能重新录制。纯视频录制,音视频录制时,需要重新调用prepare()和getInputSurface()接口才能重新录制。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ---------------------------- | -| callback | AsyncCallback\ | 是 | 异步开始视频录制的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------------ | +| callback | AsyncCallback\ | 是 | 异步重置音视频录制的回调方法。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ------------------------------------------ | -| 5400102 | Operation not allowed. Return by callback. | -| 5400103 | I/O error. Return by callback. | -| 5400105 | Service died. Return by callback. | +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400103 | IO error. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -// asyncallback -videoRecorder.start((err) => { +AVRecorder.reset((err) => { if (err == null) { - console.info('start videorecorder success'); + console.info('reset AVRecorder success'); } else { - console.info('start videorecorder failed and error is ' + err.message); + console.info('reset AVRecorder failed and error is ' + err.message); } }); ``` -### start9+ - -start(): Promise\; +### reset9+ -异步方式开始视频录制。通过Promise获取返回值。 +reset(): Promise\ -在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)后调用,需要依赖数据源先给surface传递数据。 +异步方式重置音视频录制。通过Promise获取返回值。 -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +纯音频录制时,需要重新调用prepare()接口才能重新录制。纯视频录制,音视频录制时,需要重新调用prepare()和getInputSurface()接口才能重新录制。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **返回值:** -| 类型 | 说明 | -| -------------- | ------------------------------------- | -| Promise\ | 异步开始视频录制方法的Promise返回值。 | +| 类型 | 说明 | +| -------------- | --------------------------------------- | +| Promise\ | 异步重置音视频录制方法的Promise返回值。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ----------------------------------------- | -| 5400102 | Operation not allowed. Return by promise. | -| 5400103 | I/O error. Return by promise. | -| 5400105 | Service died. Return by promise. | +| 错误码ID | 错误信息 | +| -------- | -------------------------------- | +| 5400103 | IO error. Return by promise. | +| 5400105 | Service died. Return by promise. | **示例:** ```js -// promise -videoRecorder.start().then(() => { - console.info('start videorecorder success'); +AVRecorder.reset().then(() => { + console.info('reset AVRecorder success'); }).catch((err) => { - console.info('start videorecorder failed and catch error is ' + err.message); + console.info('reset AVRecorder failed and catch error is ' + err.message); }); ``` -### pause9+ - -pause(callback: AsyncCallback\): void; +### release9+ -异步方式暂停视频录制。通过注册回调函数获取返回值。 +release(callback: AsyncCallback\): void -在[start()](#videorecorder_start1)后调用。可以通过调用[resume()](#videorecorder_resume1)接口来恢复录制。 +异步方式释放音视频录制资源。通过注册回调函数获取返回值。 -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +释放音视频录制资源之后,该AVRecorder实例不能再进行任何操作。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ---------------------------- | -| callback | AsyncCallback\ | 是 | 异步暂停视频录制的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------------- | +| callback | AsyncCallback\ | 是 | 异步释放音视频录制资源的回调方法。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ------------------------------------------ | -| 5400102 | Operation not allowed. Return by callback. | -| 5400103 | I/O error. Return by callback. | -| 5400105 | Service died. Return by callback. | +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400105 | Service died. Return by callback. | **示例:** ```js -// asyncallback -videoRecorder.pause((err) => { +AVRecorder.release((err) => { if (err == null) { - console.info('pause videorecorder success'); + console.info('release AVRecorder success'); } else { - console.info('pause videorecorder failed and error is ' + err.message); + console.info('release AVRecorder failed and error is ' + err.message); } }); ``` -### pause9+ - -pause(): Promise\; +### release9+ -异步方式暂停视频录制。通过Promise获取返回值。 +release(): Promise\ -在[start()](#videorecorder_start1)后调用。可以通过调用[resume()](#videorecorder_resume1)接口来恢复录制。 +异步方式释放音视频录制资源。通过Promise获取返回值。 -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +释放音视频录制资源之后,该AVRecorder实例不能再进行任何操作。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **返回值:** -| 类型 | 说明 | -| -------------- | ------------------------------------- | -| Promise\ | 异步暂停视频录制方法的Promise返回值。 | +| 类型 | 说明 | +| -------------- | ------------------------------------------- | +| Promise\ | 异步释放音视频录制资源方法的Promise返回值。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ----------------------------------------- | -| 5400102 | Operation not allowed. Return by promise. | -| 5400103 | I/O error. Return by promise. | -| 5400105 | Service died. Return by promise. | +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400105 | Service died. Return by callback. | **示例:** ```js -// promise -videoRecorder.pause().then(() => { - console.info('pause videorecorder success'); +AVRecorder.release().then(() => { + console.info('release AVRecorder success'); }).catch((err) => { - console.info('pause videorecorder failed and catch error is ' + err.message); + console.info('release AVRecorder failed and catch error is ' + err.message); }); ``` -### resume9+ - -resume(callback: AsyncCallback\): void; +### on('stateChange')9+ -异步方式恢复视频录制。通过注册回调函数获取返回值。 +on(type: 'stateChange', callback: (state: AVRecorderState, reason: StateChangeReason) => void): void -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +订阅录制状态机AVRecorderState切换的事件,当 AVRecorderState状态机发生变化时,会通过订阅的回调方法通知用户。用户只能订阅一个状态机切换事件的回调方法,当用户重复订阅时,以最后一次订阅的回调接口为准。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ---------------------------- | -| callback | AsyncCallback\ | 是 | 异步恢复视频录制的回调方法。 | - -**错误码:** - -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) - -| 错误码ID | 错误信息 | -| -------- | ------------------------------------------ | -| 5400102 | Operation not allowed. Return by callback. | -| 5400103 | I/O error. Return by callback. | -| 5400105 | Service died. Return by callback. | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 状态机切换事件回调类型,支持的事件:'stateChange',用户操作和系统都会触发此事件。 | +| callback | function | 是 | 状态机切换事件回调方法:
state: [AVRecorderState](#avrecorderstate9),表示当前播放状态 ;
reason: [StateChangeReason](#statechangereason9),表示当前播放状态的切换原因。 | **示例:** ```js -// asyncallback -videoRecorder.resume((err) => { - if (err == null) { - console.info('resume videorecorder success'); - } else { - console.info('resume videorecorder failed and error is ' + err.message); +AVRecorder.on('stateChange', async (state, reason) => { + console.info('case state has changed, new state is :' + state + ',and new reason is : ' + reason); } }); ``` -### resume9+ - -resume(): Promise\; - -异步方式恢复视频录制。通过Promise获取返回值。 - -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder - -**系统接口:** 该接口为系统接口 +### off('stateChange')9+ -**返回值:** +off(type: 'stateChange'): void -| 类型 | 说明 | -| -------------- | ------------------------------------- | -| Promise\ | 异步恢复视频录制方法的Promise返回值。 | +取消订阅播放状态机[AVRecorderState](#avrecorderstate9)切换的事件。 -**错误码:** +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +**参数:** -| 错误码ID | 错误信息 | -| -------- | ----------------------------------------- | -| 5400102 | Operation not allowed. Return by promise. | -| 5400103 | I/O error. Return by promise. | -| 5400105 | Service died. Return by promise. | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 状态机切换事件回调类型,支持的事件:'stateChange',用户操作和系统都会触发此事件。 | **示例:** ```js -// promise -videoRecorder.resume().then(() => { - console.info('resume videorecorder success'); -}).catch((err) => { - console.info('resume videorecorder failed and catch error is ' + err.message); -}); +AVRecorder.off('stateChange'); ``` -### stop9+ - -stop(callback: AsyncCallback\): void; +### on('error')9+ -异步方式停止视频录制。通过注册回调函数获取返回值。 +on(type: 'error', callback: ErrorCallback): void -需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)接口才能重新录制。 +订阅AVRecorder的错误事件,该事件仅用于错误提示,不需要用户停止播控动作。如果此时[AVRecorderState](#avrecorderstate9)也切至error状态,用户需要通过reset()或者release()退出录制操作。 -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +用户只能订阅一个错误事件的回调方法,当用户重复订阅时,以最后一次订阅的回调接口为准。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ---------------------------- | -| callback | AsyncCallback\ | 是 | 异步停止视频录制的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 录制错误事件回调类型'error'。
- 'error':录制过程中发生错误,触发该事件。 | +| callback | ErrorCallback | 是 | 录制错误事件回调方法。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ------------------------------------------ | -| 5400102 | Operation not allowed. Return by callback. | -| 5400103 | I/O error. Return by callback. | -| 5400105 | Service died. Return by callback. | +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400103 | IO error. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -// asyncallback -videoRecorder.stop((err) => { - if (err == null) { - console.info('stop videorecorder success'); - } else { - console.info('stop videorecorder failed and error is ' + err.message); - } +AVRecorder.on('error', (err) => { + console.info('case avRecorder.on(error) called, errMessage is ' + err.message); }); ``` -### stop9+ - -stop(): Promise\; - -异步方式停止视频录制。通过Promise获取返回值。 +### off('error')9+ -需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)接口才能重新录制。 +off(type: 'error'): void -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +取消订阅录制错误事件,取消后不再接收到AVRecorder的错误事件。 -**系统接口:** 该接口为系统接口 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -**返回值:** +**参数:** -| 类型 | 说明 | -| -------------- | ------------------------------------- | -| Promise\ | 异步停止视频录制方法的Promise返回值。 | +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| type | string | 是 | 录制错误事件回调类型'error'。
- 'error':录制过程中发生错误,触发该事件。 | **错误码:** -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)。 -| 错误码ID | 错误信息 | -| -------- | ----------------------------------------- | -| 5400102 | Operation not allowed. Return by promise. | -| 5400103 | I/O error. Return by promise. | -| 5400105 | Service died. Return by promise. | +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400103 | IO error. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -// promise -videoRecorder.stop().then(() => { - console.info('stop videorecorder success'); -}).catch((err) => { - console.info('stop videorecorder failed and catch error is ' + err.message); -}); +AVRecorder.off('error'); ``` -### release9+ +## AVRecorderState9+ -release(callback: AsyncCallback\): void; +音视频录制的状态机。可通过state属性获取当前状态。 -异步方式释放视频录制资源。通过注册回调函数获取返回值。 +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +| 名称 | 类型 | 说明 | +| -------- | ------ | ------------------------------------------------------------ | +| idle | string | 闲置状态。此时可以调用[prepare()](#avrecorder_prepare)方法设置录制参数,进入prepared状态。AVRecorder刚被创建,或者在任何非released状态下调用[reset()](#avrecorder_reset)方法,均进入idle状态。 | +| prepared | string | 参数设置完成。此时可以调用[start()](#avrecorder_start)方法开始录制,进入started状态。 | +| started | string | 正在录制。此时可以调用[pause()](#avrecorder_pause)方法暂停录制,进入paused状态。也可以调用[stop()](#avrecorder_stop)方法结束录制,进入stopped状态。 | +| paused | string | 录制暂停。此时可以调用[resume()](#avrecorder_resume)方法继续录制,进入started状态。也可以调用[stop()](#avrecorder_stop)方法结束录制,进入stopped状态。 | +| stopped | string | 录制停止。此时可以调用[prepare()](#avrecorder_prepare)方法设置录制参数,重新进入prepared状态。 | +| released | string | 录制资源释放。此时不能再进行任何操作。在任何其他状态下,均可以通过调用[release()](#avrecorder_release)方法进入released状态。 | +| error | string | 错误状态。当AVRecorder实例发生不可逆错误,会转换至当前状态。切换至error状态时会伴随[on('error')事件](#avrecorder_onerror),该事件会上报详细错误原因。在error状态时,用户需要调用[reset()](#avrecorder_reset)方法重置AVRecorder实例,或者调用[release()](#avrecorder_release)方法释放资源。 | -**系统接口:** 该接口为系统接口 +## AVRecorderConfig9+ -**参数:** +表示音视频录制的参数设置。 -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | -------------------------------- | -| callback | AsyncCallback\ | 是 | 异步释放视频录制资源的回调方法。 | +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -**错误码:** +| 名称 | 类型 | 必填 | 说明 | +| --------------- | ---------------------------------------- | ---- | ------------------------------------------------------------ | +| audioSourceType | [AudioSourceType](#audiosourcetype9) | 否 | 选择录制的音频源类型。选择音频录制时必填。 | +| videoSourceType | [VideoSourceType](#videosourcetype9) | 否 | 选择录制的视频源类型。选择视频录制时必填。 | +| profile | [AVRecorderProfile](#avrecorderprofile9) | 是 | 录制的profile,必要参数。 | +| url | string | 是 | 录制输出URL:fd://xx (fd number) ![img](https://gitee.com/huang-xl/docs/raw/20221216_avplayer_doc/zh-cn/application-dev/reference/apis/figures/zh-cn_image_url.png),必要参数。 | +| rotation | number | 否 | 录制的视频旋转角度,仅支持0,90,180,270。 | +| location | [Location](#location) | 否 | 录制的地理位置。 | -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +通过audioSourceType和videoSourceType区分纯音频录制、纯视频录制或音视频录制。纯音频录制时,仅需要设置audioSourceType;纯视频录制时,仅需要设置videoSourceType;音视频录制时,audioSourceType和videoSourceType均需要设置。 -| 错误码ID | 错误信息 | -| -------- | --------------------------------- | -| 5400105 | Service died. Return by callback. | +## AVRecorderProfile9+ -**示例:** +音视频录制的配置文件。 -```js -// asyncallback -videoRecorder.release((err) => { - if (err == null) { - console.info('release videorecorder success'); - } else { - console.info('release videorecorder failed and error is ' + err.message); - } -}); -``` +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -### release9+ +| 名称 | 类型 | 必填 | 说明 | +| ---------------- | -------------------------------------------- | ---- | ------------------------------------------------------------ | +| audioBitrate | number | 否 | 音频编码比特率,选择音频录制时必填。 | +| audioChannels | number | 否 | 音频采集声道数,选择音频录制时必填。 | +| audioCodec | [CodecMimeType](#codecmimetype8) | 否 | 音频编码格式,选择音频录制时必填。当前仅支持AUDIO_AAC。 | +| audioSampleRate | number | 否 | 音频采样率,选择音频录制时必填。 | +| fileFormat | [ContainerFormatType](#containerformattype8) | 是 | 文件的容器格式,必要参数。 | +| videoBitrate | number | 否 | 视频编码比特率,选择视频录制时必填。 | +| videoCodec | [CodecMimeType](#codecmimetype8) | 否 | 视频编码格式,选择视频录制时必填。当前仅支持VIDEO_AVC和VIDEO_MPEG4。 | +| videoFrameWidth | number | 否 | 视频帧的宽,选择视频录制时必填。 | +| videoFrameHeight | number | 否 | 视频帧的高,选择视频录制时必填。 | +| videoFrameRate | number | 否 | 视频帧率,选择视频录制时必填。 | -release(): Promise\; +## AudioSourceType9+ -异步方式释放视频录制资源。通过Promise获取返回值。 +表示视频录制中音频源类型的枚举。 -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -**系统接口:** 该接口为系统接口 +| 名称 | 值 | 说明 | +| ------------------------- | ---- | ---------------------- | +| AUDIO_SOURCE_TYPE_DEFAULT | 0 | 默认的音频输入源类型。 | +| AUDIO_SOURCE_TYPE_MIC | 1 | 表示MIC的音频输入源。 | -**返回值:** +## VideoSourceType9+ -| 类型 | 说明 | -| -------------- | ----------------------------------------- | -| Promise\ | 异步释放视频录制资源方法的Promise返回值。 | +表示视频录制中视频源类型的枚举。 -**错误码:** +**系统能力:** SystemCapability.Multimedia.Media.AVRecorder -以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) +| 名称 | 值 | 说明 | +| ----------------------------- | ---- | ------------------------------- | +| VIDEO_SOURCE_TYPE_SURFACE_YUV | 0 | 输入surface中携带的是raw data。 | +| VIDEO_SOURCE_TYPE_SURFACE_ES | 1 | 输入surface中携带的是ES data。 | -| 错误码ID | 错误信息 | -| -------- | --------------------------------- | -| 5400105 | Service died. Return by callback. | +## ContainerFormatType8+ -**示例:** +表示容器格式类型的枚举,缩写为CFT。 -```js -// promise -videoRecorder.release().then(() => { - console.info('release videorecorder success'); -}).catch((err) => { - console.info('release videorecorder failed and catch error is ' + err.message); -}); -``` +**系统能力:** SystemCapability.Multimedia.Media.Core -### reset9+ +| 名称 | 值 | 说明 | +| ----------- | ----- | --------------------- | +| CFT_MPEG_4 | 'mp4' | 视频的容器格式,MP4。 | +| CFT_MPEG_4A | 'm4a' | 音频的容器格式,M4A。 | -reset(callback: AsyncCallback\): void; +## Location -异步方式重置视频录制。通过注册回调函数获取返回值。 +视频录制的地理位置。 -需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)接口才能重新录制。 +**系统能力:** SystemCapability.Multimedia.Media.Core + +| 名称 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ---------------- | +| latitude | number | 是 | 地理位置的纬度。 | +| longitude | number | 是 | 地理位置的经度。 | + +## VideoRecorder9+ + +> **说明:** +> AVRecorder9+发布后停止维护,建议使用[AVRecorder](#avrecorder9)替代。 + +视频录制管理类,用于录制视频媒体。在调用VideoRecorder的方法前,需要先通过[createVideoRecorder()](#mediacreatevideorecorder9)构建一个[VideoRecorder](#videorecorder9)实例。 + +视频录制demo可参考:[视频录制开发指导](../../media/video-recorder.md) + +### 属性 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------------ | -------------------------------------- | ---- | ---- | ---------------- | +| state9+ | [VideoRecordState](#videorecordstate9) | 是 | 否 | 视频录制的状态。 | + +### prepare9+ + +prepare(config: VideoRecorderConfig, callback: AsyncCallback\): void; + +异步方式进行视频录制的参数设置。通过注册回调函数获取返回值。 + +**需要权限:** ohos.permission.MICROPHONE **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder @@ -2516,202 +2580,2407 @@ reset(callback: AsyncCallback\): void; **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | -------------------- | ---- | ---------------------------- | -| callback | AsyncCallback\ | 是 | 异步重置视频录制的回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | ----------------------------------- | +| config | [VideoRecorderConfig](#videorecorderconfig9) | 是 | 配置视频录制的相关参数。 | +| callback | AsyncCallback\ | 是 | 异步视频录制prepare方法的回调方法。 | **错误码:** 以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -| 错误码ID | 错误信息 | -| -------- | --------------------------------- | -| 5400103 | I/O error. Return by callback. | -| 5400105 | Service died. Return by callback. | +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 201 | Permission denied. Return by callback. | +| 401 | Parameter error. Return by callback. | +| 5400102 | Operation not allowed. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js +let videoProfile = { + audioBitrate : 48000, + audioChannels : 2, + audioCodec : 'audio/mp4a-latm', + audioSampleRate : 48000, + fileFormat : 'mp4', + videoBitrate : 48000, + videoCodec : 'video/mp4v-es', + videoFrameWidth : 640, + videoFrameHeight : 480, + videoFrameRate : 30 +} + +let videoConfig = { + audioSourceType : 1, + videoSourceType : 0, + profile : videoProfile, + url : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 + orientationHint : 0, + location : { latitude : 30, longitude : 130 }, +} + // asyncallback -videoRecorder.reset((err) => { +videoRecorder.prepare(videoConfig, (err) => { if (err == null) { - console.info('reset videorecorder success'); + console.info('prepare success'); } else { - console.info('reset videorecorder failed and error is ' + err.message); + console.info('prepare failed and error is ' + err.message); } -}); +}) ``` -### reset9+ +### prepare9+ -reset(): Promise\; +prepare(config: VideoRecorderConfig): Promise\; -异步方式重置视频录制。通过Promise获取返回值。 +异步方式进行视频录制的参数设置。通过Promise获取返回值。 -需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)接口才能重新录制。 +**需要权限:** ohos.permission.MICROPHONE **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder **系统接口:** 该接口为系统接口 +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | -------------------------------------------- | ---- | ------------------------ | +| config | [VideoRecorderConfig](#videorecorderconfig9) | 是 | 配置视频录制的相关参数。 | + **返回值:** -| 类型 | 说明 | -| -------------- | ------------------------------------- | -| Promise\ | 异步重置视频录制方法的Promise返回值。 | +| 类型 | 说明 | +| -------------- | ---------------------------------------- | +| Promise\ | 异步视频录制prepare方法的Promise返回值。 | **错误码:** 以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -| 错误码ID | 错误信息 | -| -------- | -------------------------------- | -| 5400103 | I/O error. Return by promise. | -| 5400105 | Service died. Return by promise. | +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 201 | Permission denied. Return by promise. | +| 401 | Parameter error. Return by promise. | +| 5400102 | Operation not allowed. Return by promise. | +| 5400105 | Service died. Return by promise. | **示例:** ```js +let videoProfile = { + audioBitrate : 48000, + audioChannels : 2, + audioCodec : 'audio/mp4a-latm', + audioSampleRate : 48000, + fileFormat : 'mp4', + videoBitrate : 48000, + videoCodec : 'video/mp4v-es', + videoFrameWidth : 640, + videoFrameHeight : 480, + videoFrameRate : 30 +} + +let videoConfig = { + audioSourceType : 1, + videoSourceType : 0, + profile : videoProfile, + url : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 + orientationHint : 0, + location : { latitude : 30, longitude : 130 }, +} + // promise -videoRecorder.reset().then(() => { - console.info('reset videorecorder success'); +videoRecorder.prepare(videoConfig).then(() => { + console.info('prepare success'); }).catch((err) => { - console.info('reset videorecorder failed and catch error is ' + err.message); + console.info('prepare failed and catch error is ' + err.message); }); ``` -### on('error')9+ +### getInputSurface9+ -on(type: 'error', callback: ErrorCallback): void +getInputSurface(callback: AsyncCallback\): void; -开始订阅视频录制错误事件,当上报error错误事件后,用户需处理error事件,退出录制操作。 +异步方式获得录制需要的surface。此surface提供给调用者,调用者从此surface中获取surfaceBuffer,填入相应的数据。 + +应当注意,填入的视频数据需要携带时间戳(单位ns),buffersize。时间戳的起始时间请以系统启动时间为基准。 + +只能在[prepare()](#videorecorder_prepare1)接口调用后调用。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +**系统接口:** 该接口为系统接口 + **参数:** -| 参数名 | 类型 | 必填 | 说明 | -| -------- | ------------- | ---- | ------------------------------------------------------------ | -| type | string | 是 | 录制错误事件回调类型'error'。
- 'error':视频录制过程中发生错误,触发该事件。 | -| callback | ErrorCallback | 是 | 录制错误事件回调方法。 | +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | --------------------------- | +| callback | AsyncCallback\ | 是 | 异步获得surface的回调方法。 | **错误码:** 以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -| 错误码ID | 错误信息 | -| -------- | --------------------------------- | -| 5400103 | I/O error. Return by callback. | -| 5400105 | Service died. Return by callback. | +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | +| 5400103 | I/O error. Return by callback. | +| 5400105 | Service died. Return by callback. | **示例:** ```js -// 当获取videoRecordState接口出错时通过此订阅事件上报 -videoRecorder.on('error', (error) => { // 设置'error'事件回调 - console.info(`audio error called, error: ${error}`); -}) +// asyncallback +let surfaceID = null; // 传递给外界的surfaceID +videoRecorder.getInputSurface((err, surfaceId) => { + if (err == null) { + console.info('getInputSurface success'); + surfaceID = surfaceId; + } else { + console.info('getInputSurface failed and error is ' + err.message); + } +}); ``` -## VideoRecordState9+ - -视频录制的状态机。可通过state属性获取当前状态。 - -**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder +### getInputSurface9+ -**系统接口:** 该接口为系统接口 +getInputSurface(): Promise\; -| 名称 | 类型 | 说明 | -| -------- | ------ | ---------------------- | -| idle | string | 视频录制空闲。 | -| prepared | string | 视频录制参数设置完成。 | -| playing | string | 视频正在录制。 | -| paused | string | 视频暂停录制。 | -| stopped | string | 视频录制停止。 | -| error | string | 错误状态。 | + 异步方式获得录制需要的surface。此surface提供给调用者,调用者从此surface中获取surfaceBuffer,填入相应的数据。 -## VideoRecorderConfig9+ +应当注意,填入的视频数据需要携带时间戳(单位ns),buffersize。时间戳的起始时间请以系统启动时间为基准。 -表示视频录制的参数设置。 +只能在[prepare()](#videorecorder_prepare1)接口调用后调用。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder **系统接口:** 该接口为系统接口 -| 名称 | 类型 | 必填 | 说明 | -| --------------- | ---------------------------------------------- | ---- | ------------------------------------------------------------ | -| audioSourceType | [AudioSourceType](#audiosourcetype9) | 是 | 视频录制的音频源类型。 | -| videoSourceType | [VideoSourceType](#videosourcetype9) | 是 | 视频录制的视频源类型。 | -| profile | [VideoRecorderProfile](#videorecorderprofile9) | 是 | 视频录制的profile。 | -| rotation | number | 否 | 录制视频的旋转角度。 | -| location | [Location](#location) | 否 | 录制视频的地理位置。 | -| url | string | 是 | 视频输出URL:fd://xx (fd number)
![](figures/zh-cn_image_url.png) | +**返回值:** -## AudioSourceType9+ +| 类型 | 说明 | +| ---------------- | -------------------------------- | +| Promise\ | 异步获得surface的Promise返回值。 | -表示视频录制中音频源类型的枚举。 +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | +| 5400103 | I/O error. Return by promise. | +| 5400105 | Service died. Return by promise. | + +**示例:** + +```js +// promise +let surfaceID = null; // 传递给外界的surfaceID +videoRecorder.getInputSurface().then((surfaceId) => { + console.info('getInputSurface success'); + surfaceID = surfaceId; +}).catch((err) => { + console.info('getInputSurface failed and catch error is ' + err.message); +}); +``` + +### start9+ + +start(callback: AsyncCallback\): void; + +异步方式开始视频录制。通过注册回调函数获取返回值。 + +在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)后调用,需要依赖数据源先给surface传递数据。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder **系统接口:** 该接口为系统接口 -| 名称 | 值 | 说明 | -| ------------------------- | ---- | ---------------------- | -| AUDIO_SOURCE_TYPE_DEFAULT | 0 | 默认的音频输入源类型。 | -| AUDIO_SOURCE_TYPE_MIC | 1 | 表示MIC的音频输入源。 | +**参数:** -## VideoSourceType9+ +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------- | +| callback | AsyncCallback\ | 是 | 异步开始视频录制的回调方法。 | -表示视频录制中视频源类型的枚举。 +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | +| 5400103 | I/O error. Return by callback. | +| 5400105 | Service died. Return by callback. | + +**示例:** + +```js +// asyncallback +videoRecorder.start((err) => { + if (err == null) { + console.info('start videorecorder success'); + } else { + console.info('start videorecorder failed and error is ' + err.message); + } +}); +``` + +### start9+ + +start(): Promise\; + +异步方式开始视频录制。通过Promise获取返回值。 + +在[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)后调用,需要依赖数据源先给surface传递数据。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder **系统接口:** 该接口为系统接口 -| 名称 | 值 | 说明 | -| ----------------------------- | ---- | ------------------------------- | -| VIDEO_SOURCE_TYPE_SURFACE_YUV | 0 | 输入surface中携带的是raw data。 | -| VIDEO_SOURCE_TYPE_SURFACE_ES | 1 | 输入surface中携带的是ES data。 | +**返回值:** -## VideoRecorderProfile9+ +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步开始视频录制方法的Promise返回值。 | -视频录制的配置文件。 +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | +| 5400103 | I/O error. Return by promise. | +| 5400105 | Service died. Return by promise. | + +**示例:** + +```js +// promise +videoRecorder.start().then(() => { + console.info('start videorecorder success'); +}).catch((err) => { + console.info('start videorecorder failed and catch error is ' + err.message); +}); +``` + +### pause9+ + +pause(callback: AsyncCallback\): void; + +异步方式暂停视频录制。通过注册回调函数获取返回值。 + +在[start()](#videorecorder_start1)后调用。可以通过调用[resume()](#videorecorder_resume1)接口来恢复录制。 **系统能力:** SystemCapability.Multimedia.Media.VideoRecorder **系统接口:** 该接口为系统接口 -| 名称 | 类型 | 必填 | 说明 | -| ---------------- | -------------------------------------------- | ---- | ---------------- | -| audioBitrate | number | 是 | 音频编码比特率。 | -| audioChannels | number | 是 | 音频采集声道数。 | -| audioCodec | [CodecMimeType](#codecmimetype8) | 是 | 音频编码格式。 | -| audioSampleRate | number | 是 | 音频采样率。 | -| fileFormat | [ContainerFormatType](#containerformattype8) | 是 | 文件的容器格式。 | -| videoBitrate | number | 是 | 视频编码比特率。 | -| videoCodec | [CodecMimeType](#codecmimetype8) | 是 | 视频编码格式。 | -| videoFrameWidth | number | 是 | 录制视频帧的宽。 | -| videoFrameHeight | number | 是 | 录制视频帧的高。 | -| videoFrameRate | number | 是 | 录制视频帧率。 | +**参数:** -## ContainerFormatType8+ +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------- | +| callback | AsyncCallback\ | 是 | 异步暂停视频录制的回调方法。 | -表示容器格式类型的枚举,缩写为CFT。 +**错误码:** -**系统能力:** SystemCapability.Multimedia.Media.Core +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) -| 名称 | 值 | 说明 | -| ----------- | ----- | --------------------- | -| CFT_MPEG_4 | 'mp4' | 视频的容器格式,MP4。 | -| CFT_MPEG_4A | 'm4a' | 音频的容器格式,M4A。 | +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | +| 5400103 | I/O error. Return by callback. | +| 5400105 | Service died. Return by callback. | -## Location +**示例:** -视频录制的地理位置。 +```js +// asyncallback +videoRecorder.pause((err) => { + if (err == null) { + console.info('pause videorecorder success'); + } else { + console.info('pause videorecorder failed and error is ' + err.message); + } +}); +``` -**系统能力:** SystemCapability.Multimedia.Media.Core +### pause9+ -| 名称 | 类型 | 必填 | 说明 | -| --------- | ------ | ---- | ---------------- | -| latitude | number | 是 | 地理位置的纬度。 | -| longitude | number | 是 | 地理位置的经度。 | \ No newline at end of file +pause(): Promise\; + +异步方式暂停视频录制。通过Promise获取返回值。 + +在[start()](#videorecorder_start1)后调用。可以通过调用[resume()](#videorecorder_resume1)接口来恢复录制。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步暂停视频录制方法的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | +| 5400103 | I/O error. Return by promise. | +| 5400105 | Service died. Return by promise. | + +**示例:** + +```js +// promise +videoRecorder.pause().then(() => { + console.info('pause videorecorder success'); +}).catch((err) => { + console.info('pause videorecorder failed and catch error is ' + err.message); +}); +``` + +### resume9+ + +resume(callback: AsyncCallback\): void; + +异步方式恢复视频录制。通过注册回调函数获取返回值。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------- | +| callback | AsyncCallback\ | 是 | 异步恢复视频录制的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | +| 5400103 | I/O error. Return by callback. | +| 5400105 | Service died. Return by callback. | + +**示例:** + +```js +// asyncallback +videoRecorder.resume((err) => { + if (err == null) { + console.info('resume videorecorder success'); + } else { + console.info('resume videorecorder failed and error is ' + err.message); + } +}); +``` + +### resume9+ + +resume(): Promise\; + +异步方式恢复视频录制。通过Promise获取返回值。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步恢复视频录制方法的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | +| 5400103 | I/O error. Return by promise. | +| 5400105 | Service died. Return by promise. | + +**示例:** + +```js +// promise +videoRecorder.resume().then(() => { + console.info('resume videorecorder success'); +}).catch((err) => { + console.info('resume videorecorder failed and catch error is ' + err.message); +}); +``` + +### stop9+ + +stop(callback: AsyncCallback\): void; + +异步方式停止视频录制。通过注册回调函数获取返回值。 + +需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)接口才能重新录制。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------- | +| callback | AsyncCallback\ | 是 | 异步停止视频录制的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ------------------------------------------ | +| 5400102 | Operation not allowed. Return by callback. | +| 5400103 | I/O error. Return by callback. | +| 5400105 | Service died. Return by callback. | + +**示例:** + +```js +// asyncallback +videoRecorder.stop((err) => { + if (err == null) { + console.info('stop videorecorder success'); + } else { + console.info('stop videorecorder failed and error is ' + err.message); + } +}); +``` + +### stop9+ + +stop(): Promise\; + +异步方式停止视频录制。通过Promise获取返回值。 + +需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)接口才能重新录制。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步停止视频录制方法的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | ----------------------------------------- | +| 5400102 | Operation not allowed. Return by promise. | +| 5400103 | I/O error. Return by promise. | +| 5400105 | Service died. Return by promise. | + +**示例:** + +```js +// promise +videoRecorder.stop().then(() => { + console.info('stop videorecorder success'); +}).catch((err) => { + console.info('stop videorecorder failed and catch error is ' + err.message); +}); +``` + +### release9+ + +release(callback: AsyncCallback\): void; + +异步方式释放视频录制资源。通过注册回调函数获取返回值。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | -------------------------------- | +| callback | AsyncCallback\ | 是 | 异步释放视频录制资源的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400105 | Service died. Return by callback. | + +**示例:** + +```js +// asyncallback +videoRecorder.release((err) => { + if (err == null) { + console.info('release videorecorder success'); + } else { + console.info('release videorecorder failed and error is ' + err.message); + } +}); +``` + +### release9+ + +release(): Promise\; + +异步方式释放视频录制资源。通过Promise获取返回值。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------------------- | +| Promise\ | 异步释放视频录制资源方法的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400105 | Service died. Return by callback. | + +**示例:** + +```js +// promise +videoRecorder.release().then(() => { + console.info('release videorecorder success'); +}).catch((err) => { + console.info('release videorecorder failed and catch error is ' + err.message); +}); +``` + +### reset9+ + +reset(callback: AsyncCallback\): void; + +异步方式重置视频录制。通过注册回调函数获取返回值。 + +需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)接口才能重新录制。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ---------------------------- | +| callback | AsyncCallback\ | 是 | 异步重置视频录制的回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400103 | I/O error. Return by callback. | +| 5400105 | Service died. Return by callback. | + +**示例:** + +```js +// asyncallback +videoRecorder.reset((err) => { + if (err == null) { + console.info('reset videorecorder success'); + } else { + console.info('reset videorecorder failed and error is ' + err.message); + } +}); +``` + +### reset9+ + +reset(): Promise\; + +异步方式重置视频录制。通过Promise获取返回值。 + +需要重新调用[prepare()](#videorecorder_prepare1)和[getInputSurface()](#getinputsurface9)接口才能重新录制。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------------- | +| Promise\ | 异步重置视频录制方法的Promise返回值。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | -------------------------------- | +| 5400103 | I/O error. Return by promise. | +| 5400105 | Service died. Return by promise. | + +**示例:** + +```js +// promise +videoRecorder.reset().then(() => { + console.info('reset videorecorder success'); +}).catch((err) => { + console.info('reset videorecorder failed and catch error is ' + err.message); +}); +``` + +### on('error')9+ + +on(type: 'error', callback: ErrorCallback): void + +开始订阅视频录制错误事件,当上报error错误事件后,用户需处理error事件,退出录制操作。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 录制错误事件回调类型'error'。
- 'error':视频录制过程中发生错误,触发该事件。 | +| callback | ErrorCallback | 是 | 录制错误事件回调方法。 | + +**错误码:** + +以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md) + +| 错误码ID | 错误信息 | +| -------- | --------------------------------- | +| 5400103 | I/O error. Return by callback. | +| 5400105 | Service died. Return by callback. | + +**示例:** + +```js +// 当获取videoRecordState接口出错时通过此订阅事件上报 +videoRecorder.on('error', (error) => { // 设置'error'事件回调 + console.info(`audio error called, error: ${error}`); +}) +``` + +## VideoRecordState9+ + +视频录制的状态机。可通过state属性获取当前状态。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +| 名称 | 类型 | 说明 | +| -------- | ------ | ---------------------- | +| idle | string | 视频录制空闲。 | +| prepared | string | 视频录制参数设置完成。 | +| playing | string | 视频正在录制。 | +| paused | string | 视频暂停录制。 | +| stopped | string | 视频录制停止。 | +| error | string | 错误状态。 | + +## VideoRecorderConfig9+ + +表示视频录制的参数设置。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +| 名称 | 类型 | 必填 | 说明 | +| --------------- | ---------------------------------------------- | ---- | ------------------------------------------------------------ | +| audioSourceType | [AudioSourceType](#audiosourcetype9) | 是 | 视频录制的音频源类型。 | +| videoSourceType | [VideoSourceType](#videosourcetype9) | 是 | 视频录制的视频源类型。 | +| profile | [VideoRecorderProfile](#videorecorderprofile9) | 是 | 视频录制的profile。 | +| rotation | number | 否 | 录制视频的旋转角度。 | +| location | [Location](#location) | 否 | 录制视频的地理位置。 | +| url | string | 是 | 视频输出URL:fd://xx (fd number)
![](figures/zh-cn_image_url.png) | + +## VideoRecorderProfile9+ + +视频录制的配置文件。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder + +**系统接口:** 该接口为系统接口 + +| 名称 | 类型 | 必填 | 说明 | +| ---------------- | -------------------------------------------- | ---- | ---------------- | +| audioBitrate | number | 是 | 音频编码比特率。 | +| audioChannels | number | 是 | 音频采集声道数。 | +| audioCodec | [CodecMimeType](#codecmimetype8) | 是 | 音频编码格式。 | +| audioSampleRate | number | 是 | 音频采样率。 | +| fileFormat | [ContainerFormatType](#containerformattype8) | 是 | 文件的容器格式。 | +| videoBitrate | number | 是 | 视频编码比特率。 | +| videoCodec | [CodecMimeType](#codecmimetype8) | 是 | 视频编码格式。 | +| videoFrameWidth | number | 是 | 录制视频帧的宽。 | +| videoFrameHeight | number | 是 | 录制视频帧的高。 | +| videoFrameRate | number | 是 | 录制视频帧率。 | + +## media.createAudioPlayer(deprecated) + +createAudioPlayer(): AudioPlayer + +同步方式创建音频播放实例。 + +> **说明:** +> 从API version 6开始支持,从API version 9开始废弃,建议使用[createAVPlayer](#mediacreateavplayer9)替代。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**返回值:** + +| 类型 | 说明 | +| --------------------------- | ------------------------------------------------------------ | +| [AudioPlayer](#audioplayerdeprecated) | 返回AudioPlayer类实例,失败时返回null。可用于音频播放、暂停、停止等操作。 | + +**示例:** + +```js +let audioPlayer = media.createAudioPlayer(); +``` + +## media.createVideoPlayer(deprecated) + +createVideoPlayer(callback: AsyncCallback\): void + +异步方式创建视频播放实例,通过注册回调函数获取返回值。 + +> **说明:** +> 从API version 8开始支持,从API version 9开始废弃,建议使用[createAVPlayer](#mediacreateavplayer9)替代。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------ | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback<[VideoPlayer](#videoplayerdeprecated)> | 是 | 回调函数。异步返回VideoPlayer实例,失败时返回null。可用于管理和播放视频媒体。 | + +**示例:** + +```js +let videoPlayer + +media.createVideoPlayer((error, video) => { + if (video != null) { + videoPlayer = video; + console.info('video createVideoPlayer success'); + } else { + console.info(`video createVideoPlayer fail, error:${error}`); + } +}); +``` + +## media.createVideoPlayer(deprecated) + +createVideoPlayer(): Promise\ + +异步方式创建视频播放实例,通过Promise获取返回值。 + +> **说明:** +> 从API version 8开始支持,从API version 9开始废弃,建议使用[createAVPlayer](#mediacreateavplayer9-1)替代。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------ | ------------------------------------------------------------ | +| Promise<[VideoPlayer](#videoplayerdeprecated)> | Promise对象。异步返回VideoPlayer实例,失败时返回null。可用于管理和播放视频媒体。 | + +**示例:** + +```js +let videoPlayer + +media.createVideoPlayer().then((video) => { + if (video != null) { + videoPlayer = video; + console.info('video createVideoPlayer success'); + } else { + console.info('video createVideoPlayer fail'); + } +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +## media.createAudioRecorder(deprecated) + +createAudioRecorder(): AudioRecorder + +创建音频录制的实例来控制音频的录制。 +一台设备只允许创建一个录制实例。 + +> **说明:** +> 从API version 8开始支持,从API version 9开始废弃,建议使用[createAVRecorder](#mediacreateavrecorder9)替代。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**返回值:** + +| 类型 | 说明 | +| ------------------------------- | ------------------------------------------------------------ | +| [AudioRecorder](#audiorecorderdeprecated) | 返回AudioRecorder类实例,失败时返回null。可用于录制音频媒体。 | + +**示例:** + +```js +let audioRecorder = media.createAudioRecorder(); +``` + +## MediaErrorCode(deprecated) + +媒体服务错误类型枚举。 + +> **说明:** +> 从API version 8开始支持,从API version 9开始废弃,建议使用[媒体错误码](../errorcodes/errorcode-media.md)替代。 + +**系统能力:** SystemCapability.Multimedia.Media.Core + +| 名称 | 值 | 说明 | +| -------------------------- | ---- | -------------------------------------- | +| MSERR_OK | 0 | 表示操作成功。 | +| MSERR_NO_MEMORY | 1 | 表示申请内存失败,系统可能无可用内存。 | +| MSERR_OPERATION_NOT_PERMIT | 2 | 表示无权限执行此操作。 | +| MSERR_INVALID_VAL | 3 | 表示传入入参无效。 | +| MSERR_IO | 4 | 表示发生IO错误。 | +| MSERR_TIMEOUT | 5 | 表示操作超时。 | +| MSERR_UNKNOWN | 6 | 表示未知错误。 | +| MSERR_SERVICE_DIED | 7 | 表示服务端失效。 | +| MSERR_INVALID_STATE | 8 | 表示在当前状态下,不允许执行此操作。 | +| MSERR_UNSUPPORTED | 9 | 表示在当前版本下,不支持此操作。 | + +## AudioPlayer(deprecated) + +> **说明:** +> 从API version 6开始支持,从API version 9开始废弃,建议使用[AVPlayer](#avplayer9)替代。 + +音频播放管理类,用于管理和播放音频媒体。在调用AudioPlayer的方法前,需要先通过[createAudioPlayer()](#mediacreateaudioplayerdeprecated)构建一个AudioPlayer实例。 + +### 属性 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------------------------- | ------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ | +| src | string | 是 | 是 | 音频媒体URI,支持当前主流的音频格式(m4a、aac、mp3、ogg、wav)。
**支持路径示例**:
1. fd类型播放:fd://xx
![](figures/zh-cn_image_url.png)
2. http网络播放: http://xx
3. https网络播放: https://xx
4. hls网络播放路径:http://xx或者https://xx
**需要权限:** ohos.permission.READ_MEDIA 或 ohos.permission.INTERNET。 | +| fdSrc9+ | [AVFileDescriptor](#avfiledescriptor9) | 是 | 是 | 音频媒体文件描述,使用场景:应用中的音频资源被连续存储在同一个文件中。
**使用示例**:
假设一个连续存储的音乐文件:
音乐1(地址偏移:0,字节长度:100)
音乐2(地址偏移:101,字节长度:50)
音乐3(地址偏移:151,字节长度:150)
1. 播放音乐1:AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }
2. 播放音乐2:AVFileDescriptor { fd = 资源句柄; offset = 101; length = 50; }
3. 播放音乐3:AVFileDescriptor { fd = 资源句柄; offset = 151; length = 150; }
假设是一个独立的音乐文件: 请使用src=fd://xx
| +| loop | boolean | 是 | 是 | 音频循环播放属性,设置为'true'表示循环播放。 | +| audioInterruptMode9+ | [audio.InterruptMode](js-apis-audio.md#interruptmode9) | 是 | 是 | 音频焦点模型。 | +| currentTime | number | 是 | 否 | 音频的当前播放位置,单位为毫秒(ms)。 | +| duration | number | 是 | 否 | 音频时长,单位为毫秒(ms)。 | +| state | [AudioState](#audiostate) | 是 | 否 | 可以查询音频播放的状态,该状态不可作为调用play/pause/stop等状态切换的触发条件。 | + +### play + +play(): void + +开始播放音频资源,需在[dataLoad](#audioplayer_on)事件成功触发后,才能调用。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**示例:** + +```js +audioPlayer.on('play', () => { //设置'play'事件回调 + console.log('audio play success'); +}); +audioPlayer.play(); +``` + +### pause + +pause(): void + +暂停播放音频资源。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**示例:** + +```js +audioPlayer.on('pause', () => { //设置'pause'事件回调 + console.log('audio pause success'); +}); +audioPlayer.pause(); +``` + +### stop + +stop(): void + +停止播放音频资源。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**示例:** + +```js +audioPlayer.on('stop', () => { //设置'stop'事件回调 + console.log('audio stop success'); +}); +audioPlayer.stop(); +``` + +### reset7+ + +reset(): void + +重置播放音频资源。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**示例:** + +```js +audioPlayer.on('reset', () => { //设置'reset'事件回调 + console.log('audio reset success'); +}); +audioPlayer.reset(); +``` + +### seek + +seek(timeMs: number): void + +跳转到指定播放位置。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ----------------------------------------------------------- | +| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围[0, duration]。 | + +**示例:** + +```js +audioPlayer.on('timeUpdate', (seekDoneTime) => { //设置'timeUpdate'事件回调 + if (seekDoneTime == null) { + console.info('audio seek fail'); + return; + } + console.log('audio seek success. seekDoneTime: ' + seekDoneTime); +}); +audioPlayer.seek(30000); //seek到30000ms的位置 +``` + +### setVolume + +setVolume(vol: number): void + +设置音量。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| vol | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 | + +**示例:** + +```js +audioPlayer.on('volumeChange', () => { //设置'volumeChange'事件回调 + console.log('audio volumeChange success'); +}); +audioPlayer.setVolume(1); //设置音量到100% +``` + +### release + +release(): void + +释放音频资源。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**示例:** + +```js +audioPlayer.release(); +audioPlayer = undefined; +``` + +### getTrackDescription8+ + +getTrackDescription(callback: AsyncCallback\>): void + +通过回调方式获取音频轨道信息。需在[dataLoad](#audioplayer_on)事件成功触发后,才能调用。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------ | +| callback | AsyncCallback\> | 是 | 音频轨道信息MediaDescription数组回调方法。 | + +**示例:** + +```js +function printfDescription(obj) { + for (let item in obj) { + let property = obj[item]; + console.info('audio key is ' + item); + console.info('audio value is ' + property); + } +} + +audioPlayer.getTrackDescription((error, arrList) => { + if (arrList != null) { + for (let i = 0; i < arrList.length; i++) { + printfDescription(arrList[i]); + } + } else { + console.log(`audio getTrackDescription fail, error:${error}`); + } +}); +``` + +### getTrackDescription8+ + +getTrackDescription(): Promise\> + +通过Promise方式获取音频轨道信息。需在[dataLoad](#audioplayer_on)事件成功触发后,才能调用 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------------------ | ----------------------------------------------- | +| Promise> | 音频轨道信息MediaDescription数组Promise返回值。 | + +**示例:** + +```js +function printfDescription(obj) { + for (let item in obj) { + let property = obj[item]; + console.info('audio key is ' + item); + console.info('audio value is ' + property); + } +} +let arrayDescription = null +audioPlayer.getTrackDescription().then((arrList) => { + if (arrList != null) { + arrayDescription = arrList; + } else { + console.log('audio getTrackDescription fail'); + } +}).catch((error) => { + console.info(`audio catchCallback, error:${error}`); +}); + +for (let i = 0; i < arrayDescription.length; i++) { + printfDescription(arrayDescription[i]); +} +``` + +### on('bufferingUpdate')8+ + +on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void + +开始订阅音频缓存更新事件。仅网络播放支持该订阅事件。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 音频缓存事件回调类型,支持的事件:'bufferingUpdate'。 | +| callback | function | 是 | 音频缓存事件回调方法。
[BufferingInfoType](#bufferinginfotype8)为BUFFERING_PERCENT或CACHED_DURATION时,value值有效,否则固定为0。 | + +**示例:** + +```js +audioPlayer.on('bufferingUpdate', (infoType, value) => { + console.log('audio bufferingInfo type: ' + infoType); + console.log('audio bufferingInfo value: ' + value); +}); +``` + + ### on('play' | 'pause' | 'stop' | 'reset' | 'dataLoad' | 'finish' | 'volumeChange') + +on(type: 'play' | 'pause' | 'stop' | 'reset' | 'dataLoad' | 'finish' | 'volumeChange', callback: () => void): void + +开始订阅音频播放事件。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 播放事件回调类型,支持的事件包括:'play' \| 'pause' \| 'stop' \| 'reset' \| 'dataLoad' \| 'finish' \| 'volumeChange'。
- 'play':完成[play()](#audioplayer_play)调用,音频开始播放,触发该事件。
- 'pause':完成[pause()](#audioplayer_pause)调用,音频暂停播放,触发该事件。
- 'stop':完成[stop()](#audioplayer_stop)调用,音频停止播放,触发该事件。
- 'reset':完成[reset()](#audioplayer_reset)调用,播放器重置,触发该事件。
- 'dataLoad':完成音频数据加载后触发该事件,即src属性设置完成后触发该事件。
- 'finish':完成音频播放后触发该事件。
- 'volumeChange':完成[setVolume()](#audioplayer_setvolume)调用,播放音量改变后触发该事件。 | +| callback | () => void | 是 | 播放事件回调方法。 | + +**示例:** + +```js +import fileio from '@ohos.fileio' + +let audioPlayer = media.createAudioPlayer(); //创建一个音频播放实例 +audioPlayer.on('dataLoad', () => { //设置'dataLoad'事件回调,src属性设置成功后,触发此回调 + console.info('audio set source success'); + audioPlayer.play(); //开始播放,并触发'play'事件回调 +}); +audioPlayer.on('play', () => { //设置'play'事件回调 + console.info('audio play success'); + audioPlayer.seek(30000); //调用seek方法,并触发'timeUpdate'事件回调 +}); +audioPlayer.on('pause', () => { //设置'pause'事件回调 + console.info('audio pause success'); + audioPlayer.stop(); //停止播放,并触发'stop'事件回调 +}); +audioPlayer.on('reset', () => { //设置'reset'事件回调 + console.info('audio reset success'); + audioPlayer.release(); //释放播放实例资源 + audioPlayer = undefined; +}); +audioPlayer.on('timeUpdate', (seekDoneTime) => { //设置'timeUpdate'事件回调 + if (seekDoneTime == null) { + console.info('audio seek fail'); + return; + } + console.info('audio seek success, and seek time is ' + seekDoneTime); + audioPlayer.setVolume(0.5); //设置音量为50%,并触发'volumeChange'事件回调 +}); +audioPlayer.on('volumeChange', () => { //设置'volumeChange'事件回调 + console.info('audio volumeChange success'); + audioPlayer.pause(); //暂停播放,并触发'pause'事件回调 +}); +audioPlayer.on('finish', () => { //设置'finish'事件回调 + console.info('audio play finish'); + audioPlayer.stop(); //停止播放,并触发'stop'事件回调 +}); +audioPlayer.on('error', (error) => { //设置'error'事件回调 + console.info(`audio error called, error: ${error}`); +}); + +// 用户选择视频设置fd(本地播放) +let fdPath = 'fd://'; +// path路径的码流可通过"hdc file send D:\xxx\01.mp3 /data/accounts/account_0/appdata" 命令,将其推送到设备上 +let path = '/data/accounts/account_0/appdata/ohos.xxx.xxx.xxx/01.mp3'; +fileio.open(path).then((fdValue) => { + fdPath = fdPath + '' + fdValue; + console.info('open fd success fd is' + fdPath); +}, (err) => { + console.info('open fd failed err is' + err); +}).catch((err) => { + console.info('open fd failed err is' + err); +}); +audioPlayer.src = fdPath; //设置src属性,并触发'dataLoad'事件回调 +``` + +### on('timeUpdate') + +on(type: 'timeUpdate', callback: Callback\): void + +开始订阅音频播放时间更新事件。处于播放状态时,每隔1s上报一次该事件。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ----------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 播放事件回调类型,支持的事件包括:'timeUpdate'。
- 'timeUpdate':音频播放时间戳更新,开始播放后自动触发该事件。 | +| callback | Callback\ | 是 | 播放事件回调方法。回调方法入参为更新后的时间戳。 | + +**示例:** + +```js +audioPlayer.on('timeUpdate', (newTime) => { //设置'timeUpdate'事件回调 + if (newTime == null) { + console.info('audio timeUpadate fail'); + return; + } + console.log('audio timeUpadate success. seekDoneTime: ' + newTime); +}); +audioPlayer.play(); //开始播放后,自动触发时间戳更新事件 +``` + +### on('error') + +on(type: 'error', callback: ErrorCallback): void + +开始订阅音频播放错误事件,当上报error错误事件后,用户需处理error事件,退出播放操作。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 播放错误事件回调类型,支持的事件包括:'error'。
- 'error':音频播放中发生错误,触发该事件。 | +| callback | ErrorCallback | 是 | 播放错误事件回调方法。 | + +**示例:** + +```js +audioPlayer.on('error', (error) => { //设置'error'事件回调 + console.info(`audio error called, error: ${error}`); +}); +audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件 +``` + +## AudioState(deprecated) + +音频播放的状态机。可通过state属性获取当前状态。 + +> **说明:** +> 从API version 6开始支持,从API version 9开始废弃,建议使用[AVPlayerState](#avplayerstate9)替代。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioPlayer + +| 名称 | 类型 | 说明 | +| ------- | ------ | ---------------------------------------------- | +| idle | string | 音频播放空闲,dataload/reset成功后处于此状态。 | +| playing | string | 音频正在播放,play成功后处于此状态。 | +| paused | string | 音频暂停播放,pause成功后处于此状态。 | +| stopped | string | 音频播放停止,stop/播放结束后处于此状态。 | +| error | string | 错误状态。 | + +## VideoPlayer(deprecated) + +> **说明:** +> 从API version 8开始支持,从API version 9开始废弃,建议使用[AVPlayer](#avplayer9)替代。 + +视频播放管理类,用于管理和播放视频媒体。在调用VideoPlayer的方法前,需要先通过[createVideoPlayer()](#createvideoplayer)构建一个VideoPlayer实例。 + +视频播放demo可参考:[视频播放开发指导](../../media/video-playback.md) + +### 属性 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +| 名称 | 类型 | 可读 | 可写 | 说明 | +| ------------------------------- | ------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ | +| url8+ | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。
**支持路径示例**:
1. fd类型播放:fd://xx
![](figures/zh-cn_image_url.png)
2. http网络播放: http://xx
3. https网络播放: https://xx
4. hls网络播放路径:http://xx或者https://xx
| +| fdSrc9+ | [AVFileDescriptor](#avfiledescriptor9) | 是 | 是 | 视频媒体文件描述,使用场景:应用中的视频资源被连续存储在同一个文件中。
**使用示例**:
假设一个连续存储的音乐文件:
视频1(地址偏移:0,字节长度:100)
视频2(地址偏移:101,字节长度:50)
视频3(地址偏移:151,字节长度:150)
1. 播放视频1:AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }
2. 播放视频2:AVFileDescriptor { fd = 资源句柄; offset = 101; length = 50; }
3. 播放视频3:AVFileDescriptor { fd = 资源句柄; offset = 151; length = 150; }
假设是一个独立的视频文件: 请使用src=fd://xx
| +| loop8+ | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。 | +| videoScaleType9+ | [VideoScaleType](#videoscaletype9) | 是 | 是 | 视频缩放模式。 | +| audioInterruptMode9+ | [audio.InterruptMode](js-apis-audio.md#interruptmode9) | 是 | 是 | 音频焦点模型。 | +| currentTime8+ | number | 是 | 否 | 视频的当前播放位置,单位为毫秒(ms)。 | +| duration8+ | number | 是 | 否 | 视频时长,单位为毫秒(ms),返回-1表示直播模式。 | +| state8+ | [VideoPlayState](#videoplayerstate) | 是 | 否 | 视频播放的状态。 | +| width8+ | number | 是 | 否 | 视频宽,单位为像素(px)。 | +| height8+ | number | 是 | 否 | 视频高,单位为像素(px)。 | + +### setDisplaySurface8+ + +setDisplaySurface(surfaceId: string, callback: AsyncCallback\): void + +通过回调方式设置SurfaceId。 + +*注意:SetDisplaySurface需要在设置url和Prepare之间,无音频的视频流必须设置Surface否则Prepare失败。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | -------------------- | ---- | ------------------------- | +| surfaceId | string | 是 | SurfaceId | +| callback | AsyncCallback\ | 是 | 设置SurfaceId的回调方法。 | + +**示例:** + +```js +let surfaceId = null; +videoPlayer.setDisplaySurface(surfaceId, (err) => { + if (err == null) { + console.info('setDisplaySurface success!'); + } else { + console.info('setDisplaySurface fail!'); + } +}); +``` + +### setDisplaySurface8+ + +setDisplaySurface(surfaceId: string): Promise\ + +通过Promise方式设置SurfaceId。 + +*注意:SetDisplaySurface需要在设置url和Prepare之间,无音频的视频流必须设置Surface否则Prepare失败。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | --------- | +| surfaceId | string | 是 | SurfaceId | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------------ | +| Promise\ | 设置SurfaceId的Promise返回值。 | + +**示例:** + +```js +let surfaceId = null; +videoPlayer.setDisplaySurface(surfaceId).then(() => { + console.info('setDisplaySurface success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### prepare8+ + +prepare(callback: AsyncCallback\): void + +通过回调方式准备播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------ | +| callback | AsyncCallback\ | 是 | 准备播放视频的回调方法。 | + +**示例:** + +```js +videoPlayer.prepare((err) => { + if (err == null) { + console.info('prepare success!'); + } else { + console.info('prepare fail!'); + } +}); +``` + +### prepare8+ + +prepare(): Promise\ + +通过Promise方式准备播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise\ | 准备播放视频的Promise返回值。 | + +**示例:** + +```js +videoPlayer.prepare().then(() => { + console.info('prepare success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### play8+ + +play(callback: AsyncCallback\): void; + +通过回调方式开始播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------ | +| callback | AsyncCallback\ | 是 | 开始播放视频的回调方法。 | + +**示例:** + +```js +videoPlayer.play((err) => { + if (err == null) { + console.info('play success!'); + } else { + console.info('play fail!'); + } +}); +``` + +### play8+ + +play(): Promise\; + +通过Promise方式开始播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise\ | 开始播放视频的Promise返回值。 | + +**示例:** + +```js +videoPlayer.play().then(() => { + console.info('play success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### pause8+ + +pause(callback: AsyncCallback\): void + +通过回调方式暂停播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------ | +| callback | AsyncCallback\ | 是 | 暂停播放视频的回调方法。 | + +**示例:** + +```js +videoPlayer.pause((err) => { + if (err == null) { + console.info('pause success!'); + } else { + console.info('pause fail!'); + } +}); +``` + +### pause8+ + +pause(): Promise\ + +通过Promise方式暂停播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise\ | 暂停播放视频的Promise返回值。 | + +**示例:** + +```js +videoPlayer.pause().then(() => { + console.info('pause success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### stop8+ + +stop(callback: AsyncCallback\): void + +通过回调方式停止播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------ | +| callback | AsyncCallback\ | 是 | 停止播放视频的回调方法。 | + +**示例:** + +```js +videoPlayer.stop((err) => { + if (err == null) { + console.info('stop success!'); + } else { + console.info('stop fail!'); + } +}); +``` + +### stop8+ + +stop(): Promise\ + +通过Promise方式停止播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise\ | 停止播放视频的Promise返回值。 | + +**示例:** + +```js +videoPlayer.stop().then(() => { + console.info('stop success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### reset8+ + +reset(callback: AsyncCallback\): void + +通过回调方式重置播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------ | +| callback | AsyncCallback\ | 是 | 切换播放视频的回调方法。 | + +**示例:** + +```js +videoPlayer.reset((err) => { + if (err == null) { + console.info('reset success!'); + } else { + console.info('reset fail!'); + } +}); +``` + +### reset8+ + +reset(): Promise\ + +通过Promise方式重置播放视频。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise\ | 切换播放视频的Promise返回值。 | + +**示例:** + +```js +videoPlayer.reset().then(() => { + console.info('reset success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### seek8+ + +seek(timeMs: number, callback: AsyncCallback\): void + +通过回调方式跳转到指定播放位置,默认跳转到指定时间点的上一个关键帧。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | ------------------------------------------------------------ | +| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围为[0, duration]。 | +| callback | AsyncCallback\ | 是 | 跳转到指定播放位置的回调方法。 | + +**示例:** + +```js +let seekTime = 5000; +videoPlayer.seek(seekTime, (err, result) => { + if (err == null) { + console.info('seek success!'); + } else { + console.info('seek fail!'); + } +}); +``` + +### seek8+ + +seek(timeMs: number, mode:SeekMode, callback: AsyncCallback\): void + +通过回调方式跳转到指定播放位置。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | ------------------------------------------------------------ | +| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围为[0, duration]。 | +| mode | [SeekMode](#seekmode8) | 是 | 跳转模式。 | +| callback | AsyncCallback\ | 是 | 跳转到指定播放位置的回调方法。 | + +**示例:** + +```js +import media from '@ohos.multimedia.media' +let seekTime = 5000; +videoPlayer.seek(seekTime, media.SeekMode.SEEK_NEXT_SYNC, (err, result) => { + if (err == null) { + console.info('seek success!'); + } else { + console.info('seek fail!'); + } +}); +``` + +### seek8+ + +seek(timeMs: number, mode?:SeekMode): Promise\ + +通过Promise方式跳转到指定播放位置,如果没有设置mode则跳转到指定时间点的上一个关键帧。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ---------------------- | ---- | ------------------------------------------------------------ | +| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围为[0, duration]。 | +| mode | [SeekMode](#seekmode8) | 否 | 跳转模式。 | + +**返回值:** + +| 类型 | 说明 | +| ---------------- | ------------------------------------------- | +| Promise\ | 跳转到指定播放位置的Promise返回值,单位ms。 | + +**示例:** + +```js +import media from '@ohos.multimedia.media' +let seekTime = 5000; +videoPlayer.seek(seekTime).then((seekDoneTime) => { // seekDoneTime表示seek完成后的时间点 + console.info('seek success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); + +videoPlayer.seek(seekTime, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { + console.info('seek success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### setVolume8+ + +setVolume(vol: number, callback: AsyncCallback\): void + +通过回调方式设置音量。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------------------------------------------ | +| vol | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 | +| callback | AsyncCallback\ | 是 | 设置音量的回调方法。 | + +**示例:** + +```js +let vol = 0.5; +videoPlayer.setVolume(vol, (err, result) => { + if (err == null) { + console.info('setVolume success!'); + } else { + console.info('setVolume fail!'); + } +}); +``` + +### setVolume8+ + +setVolume(vol: number): Promise\ + +通过Promise方式设置音量。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------------------------------------------ | +| vol | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 | + +**返回值:** + +| 类型 | 说明 | +| -------------- | ------------------------- | +| Promise\ | 设置音量的Promise返回值。 | + +**示例:** + +```js +let vol = 0.5; +videoPlayer.setVolume(vol).then(() => { + console.info('setVolume success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### release8+ + +release(callback: AsyncCallback\): void + +通过回调方式释放视频资源。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------------------- | ---- | ------------------------ | +| callback | AsyncCallback\ | 是 | 释放视频资源的回调方法。 | + +**示例:** + +```js +videoPlayer.release((err) => { + if (err == null) { + console.info('release success!'); + } else { + console.info('release fail!'); + } +}); +``` + +### release8+ + +release(): Promise\ + +通过Promise方式释放视频资源。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**返回值:** + +| 类型 | 说明 | +| -------------- | ----------------------------- | +| Promise\ | 释放视频资源的Promise返回值。 | + +**示例:** + +```js +videoPlayer.release().then(() => { + console.info('release success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### getTrackDescription8+ + +getTrackDescription(callback: AsyncCallback\>): void + +通过回调方式获取视频轨道信息。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------ | +| callback | AsyncCallback\> | 是 | 视频轨道信息MediaDescription数组回调方法。 | + +**示例:** + +```js +function printfDescription(obj) { + for (let item in obj) { + let property = obj[item]; + console.info('video key is ' + item); + console.info('video value is ' + property); + } +} + +videoPlayer.getTrackDescription((error, arrList) => { + if ((arrList) != null) { + for (let i = 0; i < arrList.length; i++) { + printfDescription(arrList[i]); + } + } else { + console.log(`video getTrackDescription fail, error:${error}`); + } +}); +``` + +### getTrackDescription8+ + +getTrackDescription(): Promise\> + +通过Promise方式获取视频轨道信息。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**返回值:** + +| 类型 | 说明 | +| ------------------------------------------------------ | ----------------------------------------------- | +| Promise> | 视频轨道信息MediaDescription数组Promise返回值。 | + +**示例:** + +```js +function printfDescription(obj) { + for (let item in obj) { + let property = obj[item]; + console.info('video key is ' + item); + console.info('video value is ' + property); + } +} + +let arrayDescription; +videoPlayer.getTrackDescription().then((arrList) => { + if (arrList != null) { + arrayDescription = arrList; + } else { + console.log('video getTrackDescription fail'); + } +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +for (let i = 0; i < arrayDescription.length; i++) { + printfDescription(arrayDescription[i]); +} +``` + +### setSpeed8+ + +setSpeed(speed:number, callback: AsyncCallback\): void + +通过回调方式设置播放速度。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ---------------------- | ---- | ---------------------------------------------------------- | +| speed | number | 是 | 指定播放视频速度,具体见[PlaybackSpeed](#playbackspeed8)。 | +| callback | AsyncCallback\ | 是 | 设置播放速度的回调方法。 | + +**示例:** + +```js +import media from '@ohos.multimedia.media' +let speed = media.PlaybackSpeed.SPEED_FORWARD_2_00_X; + +videoPlayer.setSpeed(speed, (err, result) => { + if (err == null) { + console.info('setSpeed success!'); + } else { + console.info('setSpeed fail!'); + } +}); +``` + +### setSpeed8+ + +setSpeed(speed:number): Promise\ + +通过Promise方式设置播放速度。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ---------------------------------------------------------- | +| speed | number | 是 | 指定播放视频速度,具体见[PlaybackSpeed](#playbackspeed8)。 | + +**返回值:** + +| 类型 | 说明 | +| ---------------- | ------------------------------------------------------------ | +| Promise\ | 播放速度Promise返回值,具体见[PlaybackSpeed](#playbackspeed8)。 | + +**示例:** + +```js +import media from '@ohos.multimedia.media' +let speed = media.PlaybackSpeed.SPEED_FORWARD_2_00_X; + +videoPlayer.setSpeed(speed).then(() => { + console.info('setSpeed success'); +}).catch((error) => { + console.info(`video catchCallback, error:${error}`); +}); +``` + +### on('playbackCompleted')8+ + +on(type: 'playbackCompleted', callback: Callback\): void + +开始监听视频播放完成事件。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ----------------------------------------------------------- | +| type | string | 是 | 视频播放完成事件回调类型,支持的事件:'playbackCompleted'。 | +| callback | function | 是 | 视频播放完成事件回调方法。 | + +**示例:** + +```js +videoPlayer.on('playbackCompleted', () => { + console.info('playbackCompleted success!'); +}); +``` + +### on('bufferingUpdate')8+ + +on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void + +开始监听视频缓存更新事件。仅网络播放支持该订阅事件。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 视频缓存事件回调类型,支持的事件:'bufferingUpdate'。 | +| callback | function | 是 | 视频缓存事件回调方法。
[BufferingInfoType](#bufferinginfotype8)为BUFFERING_PERCENT或CACHED_DURATION时,value值有效,否则固定为0。 | + +**示例:** + +```js +videoPlayer.on('bufferingUpdate', (infoType, value) => { + console.log('video bufferingInfo type: ' + infoType); + console.log('video bufferingInfo value: ' + value); +}); +``` + +### on('startRenderFrame')8+ + +on(type: 'startRenderFrame', callback: Callback\): void + +开始监听视频播放首帧送显上报事件。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | --------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 视频播放首帧送显上报事件回调类型,支持的事件:'startRenderFrame'。 | +| callback | Callback\ | 是 | 视频播放首帧送显上报事件回调方法。 | + +**示例:** + +```js +videoPlayer.on('startRenderFrame', () => { + console.info('startRenderFrame success!'); +}); +``` + +### on('videoSizeChanged')8+ + +on(type: 'videoSizeChanged', callback: (width: number, height: number) => void): void + +开始监听视频播放宽高变化事件。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 视频播放宽高变化事件回调类型,支持的事件:'videoSizeChanged'。 | +| callback | function | 是 | 视频播放宽高变化事件回调方法,width表示宽,height表示高。 | + +**示例:** + +```js +videoPlayer.on('videoSizeChanged', (width, height) => { + console.log('video width is: ' + width); + console.log('video height is: ' + height); +}); +``` + +### on('error')8+ + +on(type: 'error', callback: ErrorCallback): void + +开始监听视频播放错误事件,当上报error错误事件后,用户需处理error事件,退出播放操作。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 播放错误事件回调类型,支持的事件包括:'error'。
- 'error':视频播放中发生错误,触发该事件。 | +| callback | ErrorCallback | 是 | 播放错误事件回调方法。 | + +**示例:** + +```js +videoPlayer.on('error', (error) => { // 设置'error'事件回调 + console.info(`video error called, error: ${error}`); +}); +videoPlayer.url = 'fd://error'; //设置错误的播放地址,触发'error'事件 +``` + +## VideoPlayState(deprecated) + +视频播放的状态机,可通过state属性获取当前状态。 + +> **说明:** +> 从API version 8开始支持,从API version 9开始废弃,建议使用[AVPlayerState](#avplayerstate9)替代。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer + +| 名称 | 类型 | 说明 | +| -------- | ------ | -------------- | +| idle | string | 视频播放空闲。 | +| prepared | string | 视频播放准备。 | +| playing | string | 视频正在播放。 | +| paused | string | 视频暂停播放。 | +| stopped | string | 视频播放停止。 | +| error | string | 错误状态。 | + +## AudioRecorder(deprecated) + +> **说明:** +> 从API version 6开始支持,从API version 9开始废弃,建议使用[AVRecorder](#avrecorder9)替代。 + +音频录制管理类,用于录制音频媒体。在调用AudioRecorder的方法前,需要先通过[createAudioRecorder()](#mediacreateaudiorecorder) 构建一个AudioRecorder实例。 + +音频录制demo可参考:[音频录制开发指导](../../media/audio-recorder.md) + +### prepare + +prepare(config: AudioRecorderConfig): void + +录音准备。 + +**需要权限:** ohos.permission.MICROPHONE + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------------------------------------------- | ---- | ------------------------------------------------------------ | +| config | [AudioRecorderConfig](#audiorecorderconfigdeprecated) | 是 | 配置录音的相关参数,包括音频输出URI、编码格式、采样率、声道数、输出格式等。 | + +**示例:** + +```js +let audioRecorderConfig = { + audioEncoder : media.AudioEncoder.AAC_LC, + audioEncodeBitRate : 22050, + audioSampleRate : 22050, + numberOfChannels : 2, + format : media.AudioOutputFormat.AAC_ADTS, + uri : 'fd://1', // 文件需先由调用者创建,并给予适当的权限 + location : { latitude : 30, longitude : 130}, +} +audioRecorder.on('prepare', () => { //设置'prepare'事件回调 + console.log('prepare success'); +}); +audioRecorder.prepare(audioRecorderConfig); +``` + + +### start + +start(): void + +开始录制,需在[prepare](#audiorecorder_on)事件成功触发后,才能调用start方法。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**示例:** + +```js +audioRecorder.on('start', () => { //设置'start'事件回调 + console.log('audio recorder start success'); +}); +audioRecorder.start(); +``` + +### pause + +pause():void + +暂停录制,需要在[start](#audiorecorder_on)事件成功触发后,才能调用pause方法。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**示例:** + +```js +audioRecorder.on('pause', () => { //设置'pause'事件回调 + console.log('audio recorder pause success'); +}); +audioRecorder.pause(); +``` + +### resume + +resume():void + +恢复录制,需要在[pause](#audiorecorder_on)事件成功触发后,才能调用resume方法。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**示例:** + +```js +audioRecorder.on('resume', () => { //设置'resume'事件回调 + console.log('audio recorder resume success'); +}); +audioRecorder.resume(); +``` + +### stop + +stop(): void + +停止录音。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**示例:** + +```js +audioRecorder.on('stop', () => { //设置'stop'事件回调 + console.log('audio recorder stop success'); +}); +audioRecorder.stop(); +``` + +### release + +release(): void + +释放录音资源。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**示例:** + +```js +audioRecorder.on('release', () => { //设置'release'事件回调 + console.log('audio recorder release success'); +}); +audioRecorder.release(); +audioRecorder = undefined; +``` + +### reset + +reset(): void + +重置录音。 + +进行重置录音之前,需要先调用[stop()](#audiorecorder_stop)停止录音。重置录音之后,需要调用[prepare()](#audiorecorder_prepare)设置录音参数项,才能再次进行录音。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**示例:** + +```js +audioRecorder.on('reset', () => { //设置'reset'事件回调 + console.log('audio recorder reset success'); +}); +audioRecorder.reset(); +``` + +### on('prepare' | 'start' | 'pause' | 'resume' | 'stop' | 'release' | 'reset') + +on(type: 'prepare' | 'start' | 'pause' | 'resume' | 'stop' | 'release' | 'reset', callback: () => void): void + +开始订阅音频录制事件。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | -------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 录制事件回调类型,支持的事件包括:'prepare' \| 'start' \| 'pause' \| ’resume‘ \| 'stop' \| 'release' \| 'reset'。
- 'prepare' :完成[prepare](#audiorecorder_prepare)调用,音频录制参数设置完成,触发该事件。
- 'start' :完成[start](#audiorecorder_start)调用,音频录制开始,触发该事件。
- 'pause': 完成[pause](#audiorecorder_pause)调用,音频暂停录制,触发该事件。
- 'resume': 完成[resume](#audiorecorder_resume)调用,音频恢复录制,触发该事件。
- 'stop' :完成[stop](#audiorecorder_stop)调用,音频停止录制,触发该事件。
- 'release' :完成[release](#audiorecorder_release)调用,音频释放录制资源,触发该事件。
- 'reset':完成[reset](#audiorecorder_reset)调用,音频重置为初始状态,触发该事件。 | +| callback | ()=>void | 是 | 录制事件回调方法。 | + +**示例:** + +```js +let audioRecorder = media.createAudioRecorder(); // 创建一个音频录制实例 +let audioRecorderConfig = { + audioEncoder : media.AudioEncoder.AAC_LC, + audioEncodeBitRate : 22050, + audioSampleRate : 22050, + numberOfChannels : 2, + format : media.AudioOutputFormat.AAC_ADTS, + uri : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 + location : { latitude : 30, longitude : 130}, +} +audioRecorder.on('error', (error) => { // 设置'error'事件回调 + console.info(`audio error called, error: ${error}`); +}); +audioRecorder.on('prepare', () => { // 设置'prepare'事件回调 + console.log('prepare success'); + audioRecorder.start(); // 开始录制,并触发'start'事件回调 +}); +audioRecorder.on('start', () => { // 设置'start'事件回调 + console.log('audio recorder start success'); +}); +audioRecorder.on('pause', () => { // 设置'pause'事件回调 + console.log('audio recorder pause success'); +}); +audioRecorder.on('resume', () => { // 设置'resume'事件回调 + console.log('audio recorder resume success'); +}); +audioRecorder.on('stop', () => { // 设置'stop'事件回调 + console.log('audio recorder stop success'); +}); +audioRecorder.on('release', () => { // 设置'release'事件回调 + console.log('audio recorder release success'); +}); +audioRecorder.on('reset', () => { // 设置'reset'事件回调 + console.log('audio recorder reset success'); +}); +audioRecorder.prepare(audioRecorderConfig) // 设置录制参数 ,并触发'prepare'事件回调 +``` + +### on('error') + +on(type: 'error', callback: ErrorCallback): void + +开始订阅音频录制错误事件,当上报error错误事件后,用户需处理error事件,退出录制操作。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +**参数:** + +| 参数名 | 类型 | 必填 | 说明 | +| -------- | ------------- | ---- | ------------------------------------------------------------ | +| type | string | 是 | 录制错误事件回调类型'error'。
- 'error':音频录制过程中发生错误,触发该事件。 | +| callback | ErrorCallback | 是 | 录制错误事件回调方法。 | + +**示例:** + +```js +let audioRecorderConfig = { + audioEncoder : media.AudioEncoder.AAC_LC, + audioEncodeBitRate : 22050, + audioSampleRate : 22050, + numberOfChannels : 2, + format : media.AudioOutputFormat.AAC_ADTS, + uri : 'fd://xx', // 文件需先由调用者创建,并给予适当的权限 + location : { latitude : 30, longitude : 130}, +} +audioRecorder.on('error', (error) => { // 设置'error'事件回调 + console.info(`audio error called, error: ${error}`); +}); +audioRecorder.prepare(audioRecorderConfig); // prepare不设置参数,触发'error'事件 +``` + +## AudioRecorderConfig(deprecated) + +> **说明:** +> 从API version 6开始支持,从API version 9开始废弃,建议使用[AVRecorderConfig](#avrecorderconfig9)替代。 + +表示音频的录音配置。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +| 名称 | 类型 | 必填 | 说明 | +| ----------------------------------- | -------------------------------------------- | ---- | ------------------------------------------------------------ | +| audioEncoder | [AudioEncoder](#audioencoderdeprecated) | 否 | 音频编码格式,默认设置为AAC_LC。
**说明:** 从API version 8开始废弃,建议使用audioEncoderMime替代。 | +| audioEncodeBitRate | number | 否 | 音频编码比特率,默认值为48000。 | +| audioSampleRate | number | 否 | 音频采集采样率,默认值为48000。 | +| numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 | +| format | [AudioOutputFormat](#audiooutputformatdeprecated) | 否 | 音频输出封装格式,默认设置为MPEG_4。
**说明:** 从API version 8开始废弃,建议使用fileFormat替代。 | +| location | [Location](#location) | 否 | 音频采集的地理位置。 | +| uri | string | 是 | 音频输出URI:fd://xx (fd number)
![](figures/zh-cn_image_url.png)
文件需要由调用者创建,并赋予适当的权限。 | +| audioEncoderMime8+ | [CodecMimeType](#codecmimetype8) | 否 | 音频编码格式。 | +| fileFormat8+ | [ContainerFormatType](#containerformattype8) | 否 | 音频编码格式。 | + +## AudioEncoder(deprecated) + +> **说明:** +> 从API version 6开始支持,从API version 8开始废弃,建议使用[CodecMimeType](#codecmimetype8)替代。 + +表示音频编码格式的枚举。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +| 名称 | 值 | 说明 | +| ------- | ---- | ------------------------------------------------------------ | +| DEFAULT | 0 | 默认编码格式。
仅做接口定义,暂不支持使用。 | +| AMR_NB | 1 | AMR-NB(Adaptive Multi Rate-Narrow Band Speech Codec) 编码格式。
仅做接口定义,暂不支持使用。 | +| AMR_WB | 2 | AMR-WB(Adaptive Multi Rate-Wide Band Speech Codec) 编码格式。
仅做接口定义,暂不支持使用。 | +| AAC_LC | 3 | AAC-LC(Advanced Audio Coding Low Complexity)编码格式。 | +| HE_AAC | 4 | HE_AAC(High-Efficiency Advanced Audio Coding)编码格式。
仅做接口定义,暂不支持使用。 | + +## AudioOutputFormat(deprecated) + +> **说明:** +> 从API version 6开始支持,从API version 8 开始废弃,建议使用[ContainerFormatType](#containerformattype8)替代。 + +表示音频封装格式的枚举。 + +**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder + +| 名称 | 值 | 说明 | +| -------- | ---- | ------------------------------------------------------------ | +| DEFAULT | 0 | 默认封装格式。
仅做接口定义,暂不支持使用。 | +| MPEG_4 | 2 | 封装为MPEG-4格式。 | +| AMR_NB | 3 | 封装为AMR_NB格式。
仅做接口定义,暂不支持使用。 | +| AMR_WB | 4 | 封装为AMR_WB格式。
仅做接口定义,暂不支持使用。 | +| AAC_ADTS | 6 | 封装为ADTS(Audio Data Transport Stream)格式,是AAC音频的传输流格式。 | diff --git a/zh-cn/release-notes/changelogs/OpenHarmony_3.2.10.5/changelogs-media.md b/zh-cn/release-notes/changelogs/OpenHarmony_3.2.10.5/changelogs-media.md new file mode 100644 index 0000000000000000000000000000000000000000..1d1fadf9dbee56c3538e4462ee7936a364ec4445 --- /dev/null +++ b/zh-cn/release-notes/changelogs/OpenHarmony_3.2.10.5/changelogs-media.md @@ -0,0 +1,312 @@ +# 媒体子系统ChangeLog + +## cl.media.1 播放功能接口变更 + +新增音视频播放接口[AVPlayer](../../../application-dev/reference/apis/js-apis-media.md#avplayer9)9+, 升级了状态机和错误码,推荐用户使用。旧版音频播放接口[AudioPlayer](../../../application-dev/reference/apis/js-apis-media.md#audioplayer)6+和视频播放接口[VideoPlayer](../../../application-dev/reference/apis/js-apis-media.md#videoplayer)8+停止维护。 + +**变更影响** + +原有的接口暂时可继续使用,但是停止维护,建议使用新接口进行开发。 + +**关键的接口/组件变更** + +新增接口如下: + +| 类名 | 新增接口声明 | +| -------------- | ------------------------------------------------------------ | +| media | createAVPlayer(callback: AsyncCallback\): void | +| media | createAVPlayer() : Promise\ | +| media.AVPlayer | interface AVPlayer | +| media.AVPlayer | videoScaleType ?: VideoScaleType | +| media.AVPlayer | url ?: string | +| media.AVPlayer | surfaceId ?: string | +| media.AVPlayer | stop(callback: AsyncCallback\): void | +| media.AVPlayer | stop(): Promise\ | +| media.AVPlayer | setVolume(volume: number): void | +| media.AVPlayer | setSpeed(speed: PlaybackSpeed): void | +| media.AVPlayer | setBitrate(bitrate: number): void | +| media.AVPlayer | seek(timeMs: number, mode?:SeekMode): void | +| media.AVPlayer | reset(callback: AsyncCallback\): void | +| media.AVPlayer | reset(): Promise\ | +| media.AVPlayer | release(callback: AsyncCallback\): void | +| media.AVPlayer | release(): Promise\ | +| media.AVPlayer | readonly width: number | +| media.AVPlayer | readonly state: AVPlayerState | +| media.AVPlayer | readonly height: number | +| media.AVPlayer | readonly duration: number | +| media.AVPlayer | readonly currentTime: number | +| media.AVPlayer | prepare(callback: AsyncCallback\): void | +| media.AVPlayer | prepare(): Promise\ | +| media.AVPlayer | play(callback: AsyncCallback\): void | +| media.AVPlayer | play(): Promise\ | +| media.AVPlayer | pause(callback: AsyncCallback\): void | +| media.AVPlayer | pause(): Promise\ | +| media.AVPlayer | on(type: 'volumeChange', callback: Callback\): void | +| media.AVPlayer | on(type: 'videoSizeChange', callback: (width: number, height: number) => void): void | +| media.AVPlayer | on(type: 'timeUpdate', callback: Callback\): void | +| media.AVPlayer | on(type: 'stateChange', callback: (state: AVPlayerState, reason: StateChangeReason) => void): void | +| media.AVPlayer | on(type: 'startRenderFrame', callback: Callback\): void | +| media.AVPlayer | on(type: 'speedDone', callback: Callback\): void | +| media.AVPlayer | on(type: 'seekDone', callback: Callback\): void | +| media.AVPlayer | on(type: 'error', callback: ErrorCallback): void | +| media.AVPlayer | on(type: 'endOfStream', callback: Callback\): void | +| media.AVPlayer | on(type: 'durationUpdate', callback: Callback\): void | +| media.AVPlayer | on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void | +| media.AVPlayer | on(type: 'bitrateDone', callback: Callback\): void | +| media.AVPlayer | on(type: 'availableBitrates', callback: (bitrates: Array\) => void): void | +| media.AVPlayer | on(type: 'audioInterrupt', callback: (info: audio.InterruptEvent) => void): void | +| media.AVPlayer | off(type: 'volumeChange'): void | +| media.AVPlayer | off(type: 'videoSizeChange'): void | +| media.AVPlayer | off(type: 'timeUpdate'): void | +| media.AVPlayer | off(type: 'stateChange'): void | +| media.AVPlayer | off(type: 'startRenderFrame'): void | +| media.AVPlayer | off(type: 'speedDone'): void | +| media.AVPlayer | off(type: 'seekDone'): void | +| media.AVPlayer | off(type: 'error'): void | +| media.AVPlayer | off(type: 'endOfStream'): void | +| media.AVPlayer | off(type: 'durationUpdate'): void | +| media.AVPlayer | off(type: 'bufferingUpdate'): void | +| media.AVPlayer | off(type: 'bitrateDone'): void | +| media.AVPlayer | off(type: 'availableBitrates'): void | +| media.AVPlayer | off(type: 'audioInterrupt'): void | +| media.AVPlayer | loop: boolean | +| media.AVPlayer | getTrackDescription(callback: AsyncCallback\>): void | +| media.AVPlayer | getTrackDescription() : Promise\> | +| media.AVPlayer | fdSrc ?: AVFileDescriptor | +| media.AVPlayer | audioInterruptMode ?: audio.InterruptMode | +| unnamed | type AVPlayerState = 'idle' \| 'initialized' \| 'prepared' \| 'playing' \| 'paused' \| 'completed' \| 'stopped' \| 'released' \| 'error' | + +停止维护接口如下: + +| 类名 | 停止维护接口声明 | +| ----------------- | ------------------------------------------------------------ | +| media | createVideoPlayer(callback: AsyncCallback\): void | +| media | createVideoPlayer() : Promise\ | +| media | createAudioPlayer(): AudioPlayer | +| media.AudioPlayer | interface AudioPlayer | +| media.AudioPlayer | play(): void | +| media.AudioPlayer | release(): void | +| media.AudioPlayer | audioInterruptMode ?: audio.InterruptMode | +| media.AudioPlayer | fdSrc: AVFileDescriptor | +| media.AudioPlayer | seek(timeMs: number): void | +| media.AudioPlayer | readonly duration: number | +| media.AudioPlayer | loop: boolean | +| media.AudioPlayer | readonly state: AudioState | +| media.AudioPlayer | getTrackDescription(callback: AsyncCallback\>): void | +| media.AudioPlayer | getTrackDescription() : Promise\> | +| media.AudioPlayer | on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void | +| media.AudioPlayer | on(type: 'play' \| 'pause' \| 'stop' \| 'reset' \| 'dataLoad' \| 'finish' \| 'volumeChange', callback: () => void): void | +| media.AudioPlayer | on(type: 'timeUpdate', callback: Callback\): void | +| media.AudioPlayer | on(type: 'audioInterrupt', callback: (info: audio.InterruptEvent) => void): void | +| media.AudioPlayer | on(type: 'error', callback: ErrorCallback): void | +| media.AudioPlayer | setVolume(vol: number): void | +| media.AudioPlayer | pause(): void | +| media.AudioPlayer | readonly currentTime: number | +| media.AudioPlayer | stop(): void | +| media.AudioPlayer | reset(): void | +| media.AudioPlayer | src: string | +| media.VideoPlayer | interface VideoPlayer | +| media.VideoPlayer | play(callback: AsyncCallback\): void | +| media.VideoPlayer | play(): Promise\ | +| media.VideoPlayer | prepare(callback: AsyncCallback\): void | +| media.VideoPlayer | prepare(): Promise\ | +| media.VideoPlayer | release(callback: AsyncCallback\): void | +| media.VideoPlayer | release(): Promise\ | +| media.VideoPlayer | audioInterruptMode ?: audio.InterruptMode | +| media.VideoPlayer | fdSrc: AVFileDescriptor | +| media.VideoPlayer | seek(timeMs: number, callback: AsyncCallback\): void | +| media.VideoPlayer | seek(timeMs: number, mode:SeekMode, callback: AsyncCallback\): void | +| media.VideoPlayer | seek(timeMs: number, mode?:SeekMode): Promise\ | +| media.VideoPlayer | readonly duration: number | +| media.VideoPlayer | loop: boolean | +| media.VideoPlayer | videoScaleType ?: VideoScaleType | +| media.VideoPlayer | readonly state: VideoPlayState | +| media.VideoPlayer | getTrackDescription(callback: AsyncCallback\>): void | +| media.VideoPlayer | getTrackDescription() : Promise\> | +| media.VideoPlayer | readonly height: number | +| media.VideoPlayer | on(type: 'playbackCompleted', callback: Callback\): void | +| media.VideoPlayer | on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void | +| media.VideoPlayer | on(type: 'startRenderFrame', callback: Callback\): void | +| media.VideoPlayer | on(type: 'videoSizeChanged', callback: (width: number, height: number) => void): void | +| media.VideoPlayer | on(type: 'audioInterrupt', callback: (info: audio.InterruptEvent) => void): void | +| media.VideoPlayer | on(type: 'error', callback: ErrorCallback): void | +| media.VideoPlayer | setDisplaySurface(surfaceId: string, callback: AsyncCallback\): void | +| media.VideoPlayer | setDisplaySurface(surfaceId: string): Promise\ | +| media.VideoPlayer | setVolume(vol: number, callback: AsyncCallback\): void | +| media.VideoPlayer | setVolume(vol: number): Promise\ | +| media.VideoPlayer | url: string | +| media.VideoPlayer | pause(callback: AsyncCallback\): void | +| media.VideoPlayer | pause(): Promise\ | +| media.VideoPlayer | readonly currentTime: number | +| media.VideoPlayer | setSpeed(speed:number, callback: AsyncCallback\): void | +| media.VideoPlayer | setSpeed(speed:number): Promise\ | +| media.VideoPlayer | stop(callback: AsyncCallback\): void | +| media.VideoPlayer | stop(): Promise\ | +| media.VideoPlayer | readonly width: number | +| media.VideoPlayer | reset(callback: AsyncCallback\): void | +| media.VideoPlayer | reset(): Promise\ | +| unnamed | type AudioState = 'idle' \| 'playing' \| 'paused' \| 'stopped' \| 'error' | +| unnamed | type VideoPlayState = 'idle' \| 'prepared' \| 'playing' \| 'paused' \| 'stopped' \| 'error' | + +**适配指导** + +请参考各接口的[API参考](../../../application-dev/reference/apis/js-apis-media.md) + +## cl.media.2 录制功能接口变更 + +新增音视频录制接口[AVRecorder](../../../application-dev/reference/apis/js-apis-media.md#avrecorder9)9+, 升级了状态机和错误码,推荐用户使用。旧版音频录制接口[AudioRecorder](../../../application-dev/reference/apis/js-apis-media.md#audiorecorder)6+和视频录制接口[VideoRecorder](../../../application-dev/reference/apis/js-apis-media.md#videorecorder9)9+停止维护。 + +新旧录制接口共用的[AudioSourceType](../../../application-dev/reference/apis/js-apis-media.md#audiosourcetype9)和[VideoSourceType](../../../application-dev/reference/apis/js-apis-media.md#videosourcetype9)接口,变更为非系统接口。 + +**变更影响** + +原有的接口[AudioRecorder](../../../application-dev/reference/apis/js-apis-media.md#audiorecorder)6+和[VideoRecorder](../../../application-dev/reference/apis/js-apis-media.md#videorecorder9)9+暂时可继续使用,但是停止维护,建议使用新接口进行开发[AVRecorder](../../../application-dev/reference/apis/js-apis-media.md#avrecorder9)9+。 + +**关键的接口/组件变更** + +新增接口如下: + +| 类名 | 新增接口声明 | +| ----------------------- | ------------------------------------------------------------ | +| media | createAVRecorder(callback: AsyncCallback\): void | +| media | createAVRecorder() : Promise\ | +| media.AVRecorder | interface AVRecorder | +| media.AVRecorder | prepare(config: AVRecorderConfig, callback: AsyncCallback\): void | +| media.AVRecorder | prepare(config: AVRecorderConfig): Promise\ | +| media.AVRecorder | release(callback: AsyncCallback\): void | +| media.AVRecorder | release(): Promise\ | +| media.AVRecorder | readonly state: AVRecorderState | +| media.AVRecorder | on(type: 'stateChange', callback: (state: AVRecorderState, reason: StateChangeReason) => void): void | +| media.AVRecorder | on(type: 'error', callback: ErrorCallback): void | +| media.AVRecorder | resume(callback: AsyncCallback\): void | +| media.AVRecorder | resume(): Promise\ | +| media.AVRecorder | start(callback: AsyncCallback\): void | +| media.AVRecorder | start(): Promise\ | +| media.AVRecorder | off(type: 'stateChange'): void | +| media.AVRecorder | off(type: 'error'): void | +| media.AVRecorder | pause(callback: AsyncCallback\): void | +| media.AVRecorder | pause(): Promise\ | +| media.AVRecorder | stop(callback: AsyncCallback\): void | +| media.AVRecorder | stop(): Promise\ | +| media.AVRecorder | reset(callback: AsyncCallback\): void | +| media.AVRecorder | reset(): Promise\ | +| media.AVRecorder | getInputSurface(callback: AsyncCallback\): void | +| media.AVRecorder | getInputSurface(): Promise\ | +| media.AVRecorderConfig | videoSourceType?: VideoSourceType | +| media.AVRecorderConfig | audioSourceType?: AudioSourceType | +| media.AVRecorderConfig | profile: AVRecorderProfile | +| media.AVRecorderConfig | rotation?: number | +| media.AVRecorderConfig | url: string | +| media.AVRecorderConfig | location?: Location | +| media.AVRecorderConfig | interface AVRecorderConfig | +| media.AVRecorderProfile | videoBitrate?: number | +| media.AVRecorderProfile | videoCodec?: CodecMimeType | +| media.AVRecorderProfile | audioCodec?: CodecMimeType | +| media.AVRecorderProfile | videoFrameRate?: number | +| media.AVRecorderProfile | videoFrameHeight?: number | +| media.AVRecorderProfile | audioSampleRate?: number | +| media.AVRecorderProfile | audioBitrate?: number | +| media.AVRecorderProfile | videoFrameWidth?: number | +| media.AVRecorderProfile | audioChannels?: number | +| media.AVRecorderProfile | fileFormat: ContainerFormatType | +| media.AVRecorderProfile | interface AVRecorderProfile | +| unnamed | type AVRecorderState = 'idle' \| 'prepared' \| 'started' \| 'paused' \| 'stopped' \| 'released' \| 'error' | + +停止维护接口如下: + +| 类名 | 停止维护接口声明 | +| -------------------------- | ------------------------------------------------------------ | +| media | createVideoRecorder(callback: AsyncCallback\): void | +| media | createVideoRecorder(): Promise\ | +| media | createAudioRecorder(): AudioRecorder | +| media.AudioRecorder | interface AudioRecorder | +| media.AudioRecorder | prepare(config: AudioRecorderConfig): void | +| media.AudioRecorder | release(): void | +| media.AudioRecorder | on(type: 'prepare' \| 'start' \| 'pause' \| 'resume' \| 'stop' \| 'release' \| 'reset', callback: () => void): void | +| media.AudioRecorder | on(type: 'error', callback: ErrorCallback): void | +| media.AudioRecorder | resume(): void | +| media.AudioRecorder | start(): void | +| media.AudioRecorder | pause(): void | +| media.AudioRecorder | stop(): void | +| media.AudioRecorder | reset(): void | +| media.AudioRecorderConfig | audioSampleRate?: number | +| media.AudioRecorderConfig | location?: Location | +| media.AudioRecorderConfig | fileFormat?: ContainerFormatType | +| media.AudioRecorderConfig | interface AudioRecorderConfig | +| media.AudioRecorderConfig | audioEncoder?: AudioEncoder | +| media.AudioRecorderConfig | audioEncodeBitRate?: number | +| media.AudioRecorderConfig | numberOfChannels?: number | +| media.AudioRecorderConfig | format?: AudioOutputFormat | +| media.AudioRecorderConfig | uri: string | +| media.AudioRecorderConfig | audioEncoderMime?: CodecMimeType | +| media.VideoRecorder | interface VideoRecorder | +| media.VideoRecorder | prepare(config: VideoRecorderConfig, callback: AsyncCallback\): void | +| media.VideoRecorder | prepare(config: VideoRecorderConfig): Promise\ | +| media.VideoRecorder | release(callback: AsyncCallback\): void | +| media.VideoRecorder | release(): Promise\ | +| media.VideoRecorder | readonly state: VideoRecordState | +| media.VideoRecorder | on(type: 'error', callback: ErrorCallback): void | +| media.VideoRecorder | resume(callback: AsyncCallback\): void | +| media.VideoRecorder | resume(): Promise\ | +| media.VideoRecorder | start(callback: AsyncCallback\): void | +| media.VideoRecorder | start(): Promise\ | +| media.VideoRecorder | pause(callback: AsyncCallback\): void | +| media.VideoRecorder | pause(): Promise\ | +| media.VideoRecorder | stop(callback: AsyncCallback\): void | +| media.VideoRecorder | stop(): Promise\ | +| media.VideoRecorder | reset(callback: AsyncCallback\): void | +| media.VideoRecorder | reset(): Promise\ | +| media.VideoRecorder | getInputSurface(callback: AsyncCallback\): void | +| media.VideoRecorder | getInputSurface(): Promise\ | +| media.VideoRecorderConfig | videoSourceType: VideoSourceType | +| media.VideoRecorderConfig | audioSourceType?: AudioSourceType | +| media.VideoRecorderConfig | profile: VideoRecorderProfile | +| media.VideoRecorderConfig | rotation?: number | +| media.VideoRecorderConfig | url: string | +| media.VideoRecorderConfig | location?: Location | +| media.VideoRecorderConfig | interface VideoRecorderConfig | +| media.VideoRecorderProfile | readonly videoBitrate: number | +| media.VideoRecorderProfile | readonly videoCodec: CodecMimeType | +| media.VideoRecorderProfile | readonly audioCodec: CodecMimeType | +| media.VideoRecorderProfile | readonly videoFrameRate: number | +| media.VideoRecorderProfile | readonly videoFrameHeight: number | +| media.VideoRecorderProfile | readonly audioSampleRate: number | +| media.VideoRecorderProfile | readonly audioBitrate: number | +| media.VideoRecorderProfile | readonly videoFrameWidth: number | +| media.VideoRecorderProfile | readonly audioChannels: number | +| media.VideoRecorderProfile | readonly fileFormat: ContainerFormatType | +| media.VideoRecorderProfile | interface VideoRecorderProfile | +| unnamed | type VideoRecordState = 'idle' \| 'prepared' \| 'playing' \| 'paused' \| 'stopped' \| 'error' | + +变更接口如下: + +| 类名 | 接口声明 | 变更前能力 | 变更后能力 | 变更前是否为系统接口 | 变更后是否为系统接口 | +| --------------------- | ------------------------------------------------------------ | ----------------------------------------------- | -------------------------------------------- | -------------------- | -------------------- | +| media.AudioSourceType | enum AudioSourceType { /** * default audio source type. * @since 9 * @syscap SystemCapability.Multimedia.Media.AVRecorder */ AUDIO_SOURCE_TYPE_DEFAULT = 0, /** * source type mic. * @since 9 * @syscap SystemCapability.Multimedia.Media.AVRecorder */ AUDIO_SOURCE_TYPE_MIC = 1, } | SystemCapability.Multimedia.Media.VideoRecorder | SystemCapability.Multimedia.Media.AVRecorder | 是 | 否 | +| media.VideoSourceType | enum VideoSourceType { /** * surface raw data. * @since 9 * @syscap SystemCapability.Multimedia.Media.AVRecorder */ VIDEO_SOURCE_TYPE_SURFACE_YUV = 0, /** * surface ES data. * @since 9 * @syscap SystemCapability.Multimedia.Media.AVRecorder */ VIDEO_SOURCE_TYPE_SURFACE_ES = 1, } | SystemCapability.Multimedia.Media.VideoRecorder | SystemCapability.Multimedia.Media.AVRecorder | 是 | 否 | + +**适配指导** + +请参考各接口的[API参考](../../../application-dev/reference/apis/js-apis-media.md) + +## cl.media.3 错误码变更 + +新增标准的错误枚举类型[AVErrorCode9](../../../application-dev/reference/apis/js-apis-media.md#averrorcode)9+替代原有错误枚举类型[MediaErrorCode](../../../application-dev/reference/apis/js-apis-media.md#mediaerrorcode)8+。 + +**变更影响** + +以往接口返回错误码枚举类型为[MediaErrorCode](../../../application-dev/reference/apis/js-apis-media.md#mediaerrorcode)8+不变。新增接口错误码类型均采用[AVErrorCode9](../../../application-dev/reference/apis/js-apis-media.md#averrorcode)9+。 + +**关键的接口/组件变更** + +新增接口如下: + +| 类名 | 新增错误码声明 | +| ----------------- | ------------------------------------------------------------ | +| media.AVErrorCode | enum AVErrorCode { /** * operation success. * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_OK = 0, /** * permission denied. * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_NO_PERMISSION = 201, /** * invalid parameter. * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_INVALID_PARAMETER = 401, /** * the api is not supported in the current version * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_UNSUPPORT_CAPABILITY = 801, /** * the system memory is insufficient or the number of services reaches the upper limit * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_NO_MEMORY = 5400101, /** * current status does not allow or do not have permission to perform this operation * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_OPERATE_NOT_PERMIT = 5400102, /** * data flow exception information * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_IO = 5400103, /** * system or network response timeout. * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_TIMEOUT = 5400104, /** * service process died. * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_SERVICE_DIED = 5400105, /** * unsupported media format * @since 9 * @syscap SystemCapability.Multimedia.Media.Core */ AVERR_UNSUPPORT_FORMAT = 5400106, } | + +停止维护接口如下: + +| 类名 | 停止维护错误码声明 | +| -------------------- | ------------------------------------------------------------ | +| media.MediaErrorCode | enum MediaErrorCode { /** * operation success. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_OK = 0, /** * malloc or new memory failed. maybe system have no memory. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_NO_MEMORY = 1, /** * no permission for the operation. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_OPERATION_NOT_PERMIT = 2, /** * invalid argument. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_INVALID_VAL = 3, /** * an I/O error occurred. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_IO = 4, /** * operation time out. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_TIMEOUT = 5, /** * unknown error. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_UNKNOWN = 6, /** * media service died. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_SERVICE_DIED = 7, /** * operation is not permit in current state. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_INVALID_STATE = 8, /** * operation is not supported in current version. * @since 8 * @syscap SystemCapability.Multimedia.Media.Core */ MSERR_UNSUPPORTED = 9, } | \ No newline at end of file