提交 b124abfd 编写于 作者: X x30034819

avrecorder avplayer Signed-off-by: x30034819 <xieyijun3@huawei.com>

Signed-off-by: Nx30034819 <xieyijun3@huawei.com>
Change-Id: I9fc5487fa1d0c2ead97d6e810067143f6ad4be2a
上级 4da793b5
# AVPlayer播放器开发指导
## 简介
AVPlayer主要工作是将Audio/Video媒体资源转码为可供渲染的图像和可听见的音频模拟信号,并通过输出设备进行播放,同时对播放任务进行管理,包括开始播放、暂停播放、停止播放、释放资源、设置音量、跳转播放位置、获取轨道信息等功能控制。
## 运作机制
该模块提供了播放状态变化示意图[AVPlayerState](../reference/apis/js-apis-media.md#avplayerstate9)、音频播放外部模块交互图和视频播放外部模块交互图。
**图1** 播放状态变化示意图<a name = avplayer_state></a>
![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<a name = stateChange></a> | 必要事件,监听播放器的状态机 |
| error<a name = error></a> | 必要事件,监听播放器的错误信息 |
| durationUpdate<a name = durationUpdate></a> | 用于进度条,监听进度条长度,刷新资源时长 |
| timeUpdate<a name = timeUpdate></a> | 用于进度条,监听进度条当前位置,刷新当前时间 |
| seekDone<a name = seekDone></a> | 响应api调用,监听seek()请求完成情况 |
| speedDone<a name = speedDone></a> | 响应api调用,监听setSpeed()请求完成情况 |
| volumeChange<a name = volumeChange></a> | 响应api调用,监听setVolume()请求完成情况 |
| bitrateDone<a name = bitrateDone></a> | 响应api调用,用于HLS协议流,监听setBitrate()请求完成情况 |
| availableBitrates<a name = availableBitrates></a> | 用于HLS协议流,监听HLS资源的可选bitrates,用于setBitrate() |
| bufferingUpdate<a name = bufferingUpdate></a> | 用于网络播放,监听网络播放缓冲信息 |
| startRenderFrame<a name = startRenderFrame></a> | 用于视频播放,监听视频播放首帧渲染时间 |
| videoSizeChange<a name = videoSizeChange></a> | 用于视频播放,监听视频播放的宽高信息,可用于调整窗口大小、比例 |
| audioInterrupt<a name = audioInterrupt></a> | 用于视频播放,监听音频焦点切换信息,搭配属性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<number>) => {
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
# 音视频录制开发指导
## 简介
音视频录制的主要工作是捕获音频信号,接收视频信号,完成音视频编码并保存到文件中,帮助开发者轻松实现音视频录制功能,包括开始录制、暂停录制、恢复录制、停止录制、释放资源等功能控制。它允许调用者指定录制的编码格式、封装格式、文件路径等参数。
## 运作机制
该模块提供了音视频录制状态变化示意图和音视频录制外部模块交互图。
**图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))
......@@ -7,12 +7,12 @@
媒体子系统包含了音视频相关媒体业务,提供以下常用功能:
-频播放([AudioPlayer](#audioplayer)
- 视频播放([VideoPlayer](#videoplayer8)
- 音频录制([AudioRecorder](#audiorecorder)
- 视频录制([VideoRecorder](#videorecorder9)
后续将提供以下功能:DataSource音视频播放、音视频编解码、容器封装解封装、媒体能力查询等功能。
-视频播放([AVPlayer](#avplayer9)<sup>9+</sup>),[AudioPlayer](#audioplayer)<sup>6+</sup>[VideoPlayer](#videoplayer8)<sup>8+</sup>整合,升级了状态机和错误码,推荐使用
- 音视频录制([AVRecorder](#avrecorder9)<sup>9+</sup>),[AudioRecorder](#audiorecorder)<sup>6+</sup>[VideoRecorder](#videorecorder9)<sup>9+</sup>整合,推荐使用
- 音频播放([AudioPlayer](#audioplayer)<sup>6+</sup>),[AVPlayer](#avplayer9)<sup>9+</sup>发布后停止维护,请使用[AVPlayer](#avplayer9)<sup>9+</sup>
- 视频播放([VideoPlayer](#videoplayer8)<sup>8+</sup>),[AVPlayer](#avplayer9)<sup>9+</sup>发布后停止维护,请使用[AVPlayer](#avplayer9)<sup>9+</sup>
- 音频录制([AudioRecorder](#audiorecorder)<sup>6+</sup>),[AVRecorder](#avrecorder9)<sup>9+</sup>发布后停止维护,请使用[AVRecorder](#avrecorder9)<sup>9+</sup>
- 视频录制([VideoRecorder](#videorecorder9)<sup>9+</sup>),[AVRecorder](#avrecorder9)<sup>9+</sup>发布后停止维护,请使用[AVRecorder](#avrecorder9)<sup>9+</sup>
## 导入模块
......@@ -20,9 +20,163 @@
import media from '@ohos.multimedia.media';
```
## media.createAudioPlayer
## media.createAVPlayer<sup>9+</sup>
createAVPlayer(callback: AsyncCallback\<AVPlayer>): void
异步方式创建音视频播放实例,通过注册回调函数获取返回值。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
| callback | AsyncCallback<[AVPlayer](#avplayer9)> | 是 | 回调函数。异步返回AVPlayer实例,失败时返回null。可用于音视频播放。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------ |
| 5400101 | No memory. Return by callback. |
**示例:**
```js
let avPlayer
media.createAVPlayer((error, video) => {
if (video != null) {
avPlayer = video;
console.info('createAVPlayer success');
} else {
console.info(`createAVPlayer fail, error:${error}`);
}
});
```
## media.createAVPlayer<sup>9+</sup>
createAVPlayer(): Promise\<AVPlayer>
异步方式创建音视频播放实例,通过Promise获取返回值。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**返回值:**
| 类型 | 说明 |
| ------------------------------- | ------------------------------------------------------------ |
| Promise<[AVPlayer](#avplayer9)> | Promise对象。异步返回AVPlayer实例,失败时返回null。可用于录制视频媒体。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------- |
| 5400101 | No memory. Return by promise. |
**示例:**
```js
let avPlayer
media.createAVPlayer().then((video) => {
if (video != null) {
avPlayer = video;
console.info('createAVPlayer success');
} else {
console.info('createAVPlayer fail');
}
}).catch((error) => {
console.info(`AVPlayer catchCallback, error:${error}`);
});
```
## media.createAVRecorder<sup>9+</sup>
createAVRecorder(callback: AsyncCallback\<AVRecorder>): void
异步方式创建音视频录制实例。通过注册回调函数获取返回值。
一台设备只允许创建一个录制实例。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------------ | ---- | ------------------------------------------------------------ |
| callback | AsyncCallback\<[AVRecorder](#avrecorder9)> | 是 | 回调函数。异步返回AVRecorder实例,失败时返回null。可用于录制音视频媒体。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------ |
| 5400101 | No memory. Return by callback. |
**示例:**
```js
let avRecorder
media.createAVRecorder((error, recorder) => {
if (recorder != null) {
avRecorder = recorder;
console.info('createAVRecorder success');
} else {
console.info(`createAVRecorder fail, error:${error}`);
}
});
```
## media.createAVRecorder<sup>9+</sup>
createAVRecorder(): Promise\<AVRecorder>
异步方式创建音视频录制实例。通过Promise获取返回值。
一台设备只允许创建一个录制实例。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 类型 | 说明 |
| ------------------------------------ | ------------------------------------------------------------ |
| Promise\<[AVRecorder](#avrecorder9)> | Promise对象。异步返回AVRecorder实例,失败时返回null。可用于录制音视频媒体。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------- |
| 5400101 | No memory. Return by promise. |
**示例:**
```js
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.createAudioPlayer
createAudioPlayer(): [AudioPlayer](#audioplayer)
createAudioPlayer(): AudioPlayer
同步方式创建音频播放实例。
......@@ -42,7 +196,7 @@ let audioPlayer = media.createAudioPlayer();
## media.createVideoPlayer<sup>8+</sup>
createVideoPlayer(callback: AsyncCallback\<[VideoPlayer](#videoplayer8)>): void
createVideoPlayer(callback: AsyncCallback\<VideoPlayer>): void
异步方式创建视频播放实例,通过注册回调函数获取返回值。
......@@ -50,8 +204,8 @@ createVideoPlayer(callback: AsyncCallback\<[VideoPlayer](#videoplayer8)>): void
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------------- | ---- | ------------------------------ |
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------------- | ---- | ------------------------------------------------------------ |
| callback | AsyncCallback<[VideoPlayer](#videoplayer8)> | 是 | 回调函数。异步返回VideoPlayer实例,失败时返回null。可用于管理和播放视频媒体。 |
**示例:**
......@@ -71,7 +225,7 @@ media.createVideoPlayer((error, video) => {
## media.createVideoPlayer<sup>8+</sup>
createVideoPlayer(): Promise<[VideoPlayer](#videoplayer8)>
createVideoPlayer(): Promise\<VideoPlayer>
异步方式创建视频播放实例,通过Promise获取返回值。
......@@ -123,7 +277,7 @@ let audioRecorder = media.createAudioRecorder();
## media.createVideoRecorder<sup>9+</sup>
createVideoRecorder(callback: AsyncCallback\<[VideoRecorder](#videorecorder9)>): void
createVideoRecorder(callback: AsyncCallback\<VideoRecorder>): void
异步方式创建视频录制实例。通过注册回调函数获取返回值。
一台设备只允许创建一个录制实例。
......@@ -134,8 +288,8 @@ createVideoRecorder(callback: AsyncCallback\<[VideoRecorder](#videorecorder9)>):
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------------------------------- | ---- | ------------------------------ |
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------------------------------- | ---- | ------------------------------------------------------------ |
| callback | AsyncCallback<[VideoRecorder](#videorecorder9)> | 是 | 回调函数。异步返回VideoRecorder实例,失败时返回null。可用于录制视频媒体。 |
**错误码:**
......@@ -161,131 +315,2366 @@ media.createVideoRecorder((error, video) => {
});
```
## media.createVideoRecorder<sup>9+</sup>
## media.createVideoRecorder<sup>9+</sup>
createVideoRecorder(): Promise\<VideoRecorder>
异步方式创建视频录制实例。通过Promise获取返回值。
一台设备只允许创建一个录制实例。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder
**系统接口:** 该接口为系统接口
**返回值:**
| 类型 | 说明 |
| ----------------------------------------- | ------------------------------------------------------------ |
| Promise<[VideoRecorder](#videorecorder9)> | Promise对象。异步返回VideoRecorder实例,失败时返回null。可用于录制视频媒体。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------- |
| 5400101 | No memory. Return by promise. |
**示例:**
```js
let videoRecorder
media.createVideoRecorder().then((video) => {
if (video != null) {
videoRecorder = video;
console.info('video createVideoRecorder success');
} else {
console.info('video createVideoRecorder fail');
}
}).catch((error) => {
console.info(`video catchCallback, error:${error}`);
});
```
## AVErrorCode<sup>9+</sup>
[媒体错误码](../errorcodes/errorcode-media.md)类型枚举
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| :------------------------- | ------- | ------------------------------------ |
| 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 | 表示不支持当前媒体资源的格式。 |
## MediaType<sup>8+</sup>
媒体类型枚举。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| -------------- | ---- | ---------- |
| MEDIA_TYPE_AUD | 0 | 表示音频。 |
| MEDIA_TYPE_VID | 1 | 表示视频。 |
## CodecMimeType<sup>8+</sup>
Codec MIME类型枚举。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| ------------ | --------------------- | ------------------------ |
| VIDEO_H263 | 'video/h263' | 表示视频/h263类型。 |
| VIDEO_AVC | 'video/avc' | 表示视频/avc类型。 |
| VIDEO_MPEG2 | 'video/mpeg2' | 表示视频/mpeg2类型。 |
| VIDEO_MPEG4 | 'video/mp4v-es' | 表示视频/mpeg4类型。 |
| VIDEO_VP8 | 'video/x-vnd.on2.vp8' | 表示视频/vp8类型。 |
| AUDIO_AAC | 'audio/mp4a-latm' | 表示音频/mp4a-latm类型。 |
| AUDIO_VORBIS | 'audio/vorbis' | 表示音频/vorbis类型。 |
| AUDIO_FLAC | 'audio/flac' | 表示音频/flac类型。 |
## MediaDescriptionKey<sup>8+</sup>
媒体信息描述枚举。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| ------------------------ | --------------- | ------------------------------------------------------------ |
| MD_KEY_TRACK_INDEX | 'track_index' | 表示轨道序号,其对应键值类型为number。 |
| MD_KEY_TRACK_TYPE | 'track_type' | 表示轨道类型,其对应键值类型为number,参考[MediaType](#mediatype8)。 |
| MD_KEY_CODEC_MIME | 'codec_mime' | 表示codec_mime类型,其对应键值类型为string。 |
| MD_KEY_DURATION | 'duration' | 表示媒体时长,其对应键值类型为number,单位为毫秒(ms)。 |
| MD_KEY_BITRATE | 'bitrate' | 表示比特率,其对应键值类型为number,单位为比特率(bps)。 |
| MD_KEY_WIDTH | 'width' | 表示视频宽度,其对应键值类型为number,单位为像素(px)。 |
| MD_KEY_HEIGHT | 'height' | 表示视频高度,其对应键值类型为number,单位为像素(px)。 |
| MD_KEY_FRAME_RATE | 'frame_rate' | 表示视频帧率,其对应键值类型为number,单位为100帧每秒(100fps)。 |
| MD_KEY_AUD_CHANNEL_COUNT | 'channel_count' | 表示声道数,其对应键值类型为number。 |
| MD_KEY_AUD_SAMPLE_RATE | 'sample_rate' | 表示采样率,其对应键值类型为number,单位为赫兹(Hz)。 |
## BufferingInfoType<sup>8+</sup>
缓存事件类型枚举。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| ----------------- | ---- | -------------------------------- |
| BUFFERING_START | 1 | 表示开始缓存。 |
| BUFFERING_END | 2 | 表示结束缓存。 |
| BUFFERING_PERCENT | 3 | 表示缓存百分比。 |
| CACHED_DURATION | 4 | 表示缓存时长,单位为毫秒(ms)。 |
## StateChangeReason<sup>9+</sup>
表示播放或录制实例状态机切换原因的枚举,伴随state一起上报。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| ---------- | ---- | ------------------------------------------------------------ |
| USER | 1 | 表示用户行为造成的状态切换,由用户或客户端主动调用接口产生。 |
| BACKGROUND | 2 | 表示系统行为造成的状态切换,比如应用未注册播控中心权限,退到后台时被系统强制暂停或停止。 |
## AVPlayer<sup>9+</sup>
播放管理类,用于管理和播放媒体资源。在调用AVPlayer的方法前,需要先通过[createAVPlayer()](#mediacreateavplayer9)构建一个AVPlayer实例。
Audio/Video播放demo可参考:[AVPlayer开发指导](../../media/avplayer-playback.md)
### 属性<a name=avplayer_属性></a>
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
| 名称 | 类型 | 可读 | 可写 | 说明 |
| --------------------------------------------------- | ------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ |
| url<sup>9+</sup> | string | 是 | 是 | 媒体URL,只允许在**idle**状态下设置,静态属性。<br/>支持的视频格式(mp4、mpeg-ts、webm、mkv)。<br>支持的音频格式(m4a、aac、mp3、ogg、wav)。<br/>**支持路径示例**<br>1. fd类型播放:fd://xx。<br>![](figures/zh-cn_image_url.png)<br>2. http网络播放: http://xx。<br/>3. https网络播放: https://xx。<br/>4. hls网络播放路径:http://xx或者https://xx。 |
| fdSrc<sup>9+</sup> | [AVFileDescriptor](#avfiledescriptor9) | 是 | 是 | 媒体文件描述,只允许在**idle**状态下设置,静态属性。<br/>使用场景:应用中的媒体资源被连续存储在同一个文件中。<br/>**使用示例**<br/>假设一个连续存储的媒体文件: <br/>视频1(地址偏移:0,字节长度:100);<br/>视频2(地址偏移:101,字节长度:50);<br/>视频3(地址偏移:151,字节长度:150);<br/>1. 播放视频1:AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }。<br/>2. 播放视频2:AVFileDescriptor { fd = 资源句柄; offset = 101; length = 50; }。<br/>3. 播放视频3:AVFileDescriptor { fd = 资源句柄; offset = 151; length = 150; }。<br/>假设是一个独立的媒体文件: 请使用src=fd://xx。 |
| surfaceId<sup>9+</sup> | string | 是 | 是 | 视频窗口ID,默认无窗口,只允许在**initialized**状态下设置,静态属性。<br/>使用场景:视频播放的窗口渲染,纯音频播放不用设置。<br/>**使用示例**<br/>[通过Xcomponent创建surfaceId](../arkui-ts/ts-basic-components-xcomponent.md#getxcomponentsurfaceid)。 |
| loop<sup>9+</sup> | boolean | 是 | 是 | 视频循环播放属性,默认'false',设置为'true'表示循环播放,动态属性。<br/>只允许在**prepared**/**playing**/**paused**/**completed**状态下设置。 |
| videoScaleType<sup>9+</sup> | [VideoScaleType](#videoscaletype9) | 是 | 是 | 视频缩放模式,默认VIDEO_SCALE_TYPE_FIT_CROP,动态属性。<br/>只允许在**prepared**/**playing**/**paused**/**completed**状态下设置。 |
| audioInterruptMode<sup>9+</sup> | [audio.InterruptMode](js-apis-audio.md#interruptmode9) | 是 | 是 | 音频焦点模型,默认INDEPENDENT_MODE,动态属性。<br/>只允许在**prepared**/**playing**/**paused**/**completed**状态下设置。 |
| state<sup>9+</sup> | [AVPlayerState](#avplayerstate9) | 是 | 否 | 音视频播放的状态,全状态有效,可查询参数。 |
| currentTime<sup>9+</sup> | number | 是 | 否 | 视频的当前播放位置,单位为毫秒(ms),可查询参数。<br/>返回为(-1)表示无效值,**prepared**/**playing**/**paused**/**completed**状态下有效。 |
| duration<sup>9+</sup><a name=avplayer_duration></a> | number | 是 | 否 | 视频时长,单位为毫秒(ms),可查询参数。<br/>返回为(-1)表示无效值,**prepared**/**playing**/**paused**/**completed**状态下有效。<br/>直播场景默认返回(-1)。 |
| width<sup>9+</sup> | number | 是 | 否 | 视频宽,单位为像素(px),可查询参数。<br/>返回为(0)表示无效值,**prepared**/**playing**/**paused**/**completed**状态下有效。 |
| height<sup>9+</sup> | number | 是 | 否 | 视频高,单位为像素(px),可查询参数。<br/>返回为(0)表示无效值,**prepared**/**playing**/**paused**/**completed**状态下有效。 |
### on('stateChange')<sup>9+</sup><a name = stateChange_on></a>
on(type: 'stateChange', callback: (state: AVPlayerState, reason: StateChangeReason) => void): void
监听播放状态机AVPlayerState切换的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | 状态机切换事件回调类型,支持的事件:'stateChange',用户操作和系统都会触发此事件。 |
| callback | function | 是 | 状态机切换事件回调方法:<br/>state: [AVPlayerState](#avplayerstate),表示当前播放状态;<br/>reason: [StateChangeReason](#statechangereason),表示当前播放状态的切换原因。 |
**示例:**
```js
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;
}
})
```
### off('stateChange')<sup>9+</sup><a name = stateChange_off></a>
off(type: 'stateChange'): void
取消监听播放状态机[AVPlayerState](#avplayerstate)切换的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ----------------------------------------------------- |
| type | string | 是 | 状态机切换事件回调类型,取消注册的事件:'stateChange' |
**示例:**
```js
avPlayer.off('stateChange')
```
### on('error')<sup>9+</sup><a name = error_on></a>
on(type: 'error', callback: ErrorCallback): void
监听[AVPlayer](#avplayer9)的错误事件,该事件仅用于错误提示,不需要用户停止播控动作。如果此时[AVPlayerState](#avplayerstate)也切至error状态,用户需要通过reset()或者release()退出播放操作。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | 错误事件回调类型,支持的事件:'error',用户操作和系统都会触发此事件。 |
| callback | function | 是 | 错误事件回调方法:使用播放器的过程中发生错误,会提供错误码ID和错误信息。 |
AVPlayer回调的**错误分类**<a name = error_info></a>可以分为以下几种:
| 错误码ID | 错误信息 | 说明 |
| -------- | --------------------- | ------------------------------------------------------------ |
| 201 | No Permission: | 无权限执行此操作,[AVPlayerState](#avplayerstate)会进入error状态。 |
| 401 | Invalid Parameter: | 入参错误,表示调用无效。 |
| 801 | Unsupport Capability: | 不支持该API能力,表示调用无效。 |
| 5400101 | No Memory: | 播放内存不足,[AVPlayerState](#avplayerstate)会进入error状态。 |
| 5400102 | Operate Not Permit: | 当前状态机不支持此操作,表示调用无效。 |
| 5400103 | IO Error: | 播放中发现码流异常。 |
| 5400104 | Network Timeout: | 网络原因超时响应,[AVPlayerState](#avplayerstate)会进入error状态。 |
| 5400105 | Service Died: | 播放进程死亡,[AVPlayerState](#avplayerstate)会进入error状态。 |
| 5400106 | Unsupport Format: | 不支持的文件格式,[AVPlayerState](#avplayerstate)会进入error状态。 |
**示例:**
```js
avPlayer.on('error', (error) => {
console.info('error happened,and error message is :' + error.message)
console.info('error happened,and error code is :' + error.code)
})
```
### off('error')<sup>9+</sup><a name = error_off></a>
off(type: 'error'): void
取消监听播放的错误事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ----------------------------------------- |
| type | string | 是 | 错误事件回调类型,取消注册的事件:'error' |
**示例:**
```js
avPlayer.off('error')
```
### prepare<sup>9+</sup><a name=avplayer_prepare></a>
prepare(callback: AsyncCallback\<void>): void
通过回调方式准备播放视频,需在[stateChange](#stateChange_on)事件成功触发至initialized状态后,才能调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | -------------------- |
| callback | function | 是 | 准备播放的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------------------ |
| 5400102 | Operation not allowed. Return by callback. |
| 5400106 | Unsupport format. Return by callback. |
**示例:**
```js
avPlayer.prepare((err) => {
if (err == null) {
console.info('prepare success');
} else {
console.error('prepare filed,error message is :' + err.message)
}
})
```
### prepare<sup>9+</sup>
prepare(): Promise\<void>
通过Promise方式准备播放视频,需在[stateChange](#stateChange_on)事件成功触发至initialized状态后,才能调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------- |
| Promise\<void> | 准备播放的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------------------- |
| 5400102 | Operation not allowed. Return by promise. |
| 5400106 | Unsupport format. Return by promise. |
**示例:**
```js
avPlayer.prepare().then(() => {
console.info('prepare success');
}, (err) => {
console.error('prepare filed,error message is :' + err.message)
})
```
### play<sup>9+</sup><a name=avplayer_play></a>
play(callback: AsyncCallback\<void>): void
通过回调方式开始播放音视频资源,只能在prepared/paused/complete状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | -------------------- |
| callback | function | 是 | 开始播放的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------------------ |
| 5400102 | Operation not allowed. Return by callback. |
**示例:**
```js
avPlayer.play((err) => {
if (err == null) {
console.info('play success');
} else {
console.error('play filed,error message is :' + err.message)
}
})
```
### play<sup>9+</sup>
play(): Promise\<void>
通过Promise方式开始播放音视频资源,只能在prepared/paused/complete状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------- |
| Promise\<void> | 开始播放的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------------------- |
| 5400102 | Operation not allowed. Return by promise. |
**示例:**
```js
avPlayer.play().then(() => {
console.info('play success');
}, (err) => {
console.error('play filed,error message is :' + err.message)
})
```
### pause<sup>9+</sup><a name=avplayer_pause></a>
pause(callback: AsyncCallback\<void>): void
通过回调方式暂停播放音视频资源,只能在playing状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | -------------------- |
| callback | function | 是 | 暂停播放的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------------------ |
| 5400102 | Operation not allowed. Return by callback. |
**示例:**
```js
avPlayer.pause((err) => {
if (err == null) {
console.info('pause success');
} else {
console.error('pause filed,error message is :' + err.message)
}
})
```
### pause<sup>9+</sup>
pause(): Promise\<void>
通过Promise方式暂停播放音视频资源,只能在playing状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------- |
| Promise\<void> | 暂停播放的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------------------- |
| 5400102 | Operation not allowed. Return by promise. |
**示例:**
```js
avPlayer.pause().then(() => {
console.info('pause success');
}, (err) => {
console.error('pause filed,error message is :' + err.message)
})
```
### stop<sup>9+</sup><a name=avplayer_stop></a>
stop(callback: AsyncCallback\<void>): void
通过回调方式停止播放音视频资源,只能在prepared/playing/paused/complete状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | -------------------- |
| callback | function | 是 | 停止播放的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------------------ |
| 5400102 | Operation not allowed. Return by callback. |
**示例:**
```js
avPlayer.stop((err) => {
if (err == null) {
console.info('stop success');
} else {
console.error('stop filed,error message is :' + err.message)
}
})
```
### stop<sup>9+</sup>
stop(): Promise\<void>
通过Promise方式停止播放音视频资源,只能在prepared/playing/paused/complete状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------- |
| Promise\<void> | 停止播放的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------------------- |
| 5400102 | Operation not allowed. Return by promise. |
**示例:**
```js
avPlayer.stop().then(() => {
console.info('stop success');
}, (err) => {
console.error('stop filed,error message is :' + err.message)
})
```
### reset<sup>9+</sup><a name=avplayer_reset></a>
reset(callback: AsyncCallback\<void>): void
通过回调方式重置播放,只能在initialized/prepared/playing/paused/complete/stopped/error状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | -------------------- |
| callback | function | 是 | 重置播放的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------------------ |
| 5400102 | Operation not allowed. Return by callback. |
**示例:**
```js
avPlayer.reset((err) => {
if (err == null) {
console.info('reset success');
} else {
console.error('reset filed,error message is :' + err.message)
}
})
```
### reset<sup>9+</sup>
reset(): Promise\<void>
通过Promise方式通过Promise方式重置播放,只能在initialized/prepared/playing/paused/complete/stopped/error状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------- |
| Promise\<void> | 重置播放的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------------------- |
| 5400102 | Operation not allowed. Return by promise. |
**示例:**
```js
avPlayer.reset().then(() => {
console.info('reset success');
}, (err) => {
console.error('reset filed,error message is :' + err.message)
})
```
### release<sup>9+</sup><a name=avplayer_release></a>
release(callback: AsyncCallback\<void>): void
通过回调方式销毁播放资源,除released状态,都可以调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | -------------------- |
| callback | function | 是 | 销毁播放的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------------------ |
| 5400102 | Operation not allowed. Return by callback. |
**示例:**
```js
avPlayer.release((err) => {
if (err == null) {
console.info('reset success');
} else {
console.error('release filed,error message is :' + err.message)
}
})
```
### release<sup>9+</sup>
release(): Promise\<void>
通过Promise方式通过Promise方式销毁播放,除released状态,都可以调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------- |
| Promise\<void> | 销毁播放的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------------------- |
| 5400102 | Operation not allowed. Return by promise. |
**示例:**
```js
avPlayer.release().then(() => {
console.info('release success');
}, (err) => {
console.error('release filed,error message is :' + err.message)
})
```
### getTrackDescription<sup>9+</sup>
getTrackDescription(callback: AsyncCallback\<Array\<MediaDescription>>): void
通过回调方式获取音视频轨道信息,可以在prepared/playing/paused状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------------------------------ | ---- | -------------------------------------------- |
| callback | AsyncCallback<Array<[MediaDescription](#mediadescription8)>> | 是 | 音视频轨道信息MediaDescription数组回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ------------------------------------------ |
| 5400102 | Operation not allowed. Return by callback. |
**示例:**
```js
avPlayer.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}`);
}
});
```
### getTrackDescription<sup>9+</sup>
getTrackDescription(): Promise\<Array\<MediaDescription>>
通过Promise方式获取音频轨道信息,可以在prepared/playing/paused状态调用。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**返回值:**
| 类型 | 说明 |
| ------------------------------------------------------ | ------------------------------------------------- |
| Promise<Array<[MediaDescription](#mediadescription8)>> | 音视频轨道信息MediaDescription数组Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | ----------------------------------------- |
| 5400102 | Operation not allowed. Return by promise. |
**示例:**
```js
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}`);
});
for (let i = 0; i < arrayDescription.length; i++) {
printfDescription(arrayDescription[i]);
}
```
### seek<sup>9+</sup>
seek(timeMs: number, mode?:SeekMode): void
跳转到指定播放位置,只能在prepared/playing/paused/complete状态调用,可以通过[seekDone事件](#seekDone_on)确认是否生效。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ---------------------- | ---- | ------------------------------------------------------------ |
| timeMs | number | 是 | 指定的跳转时间节点,单位毫秒(ms),取值范围为[0, [duration](#avplayer_duration)]。 |
| mode | [SeekMode](#seekmode8) | 否 | 基于视频I帧的跳转模式,**仅在视频资源播放时设置**。 |
**示例:**
```js
let seekTime = 1000
avPlayer.seek(seekTime, media.SeekMode.SEEK_PREV_SYNC)
```
### on('seekDone')<sup>9+</sup><a name = seekDone_on></a>
on(type: 'seekDone', callback: Callback\<number>): void
监听seek生效的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | seek生效的事件回调类型,支持的事件:'seekDone',每次调用seek后都会回调此事件。 |
| callback | function | 是 | seek生效的事件回调方法,只会上报用户请求的time位置。<br/>**视频播放:**[SeekMode](#seekmode8)会造成实际跳转位置与用户设置产生偏差,精准位置需要通过currentTime获取,事件回调的time仅代表完成用户某一次请求。 |
**示例:**
```js
avPlayer.on('seekDone', (seekDoneTime:number) => {
console.info('seekDone success,and seek time is:' + seekDoneTime)
})
```
### off('seekDone')<sup>9+</sup><a name = seekDone_off></a>
off(type: 'seekDone'): void
取消监听seek生效的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ---------------------------------------------------- |
| type | string | 是 | seek生效的事件回调类型,取消注册的事件:'seekDone'。 |
**示例:**
```js
avPlayer.off('seekDone')
```
### setSpeed<sup>9+</sup>
setSpeed(speed: PlaybackSpeed): void
设置倍速模式,只能在prepared/playing/paused/complete状态调用,可以通过[speedDone事件](#speedDone_on)确认是否生效。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | -------------------------------- | ---- | ------------------ |
| speed | [PlaybackSpeed](#playbackspeed8) | 是 | 指定播放倍速模式。 |
**示例:**
```js
avPlayer.setSpeed(media.AVPlayerSpeed.SPEED_FORWARD_2_00_X)
```
### on('speedDone')<sup>9+</sup><a name = speedDone_on></a>
on(type: 'speedDone', callback: Callback\<number>): void
监听setSpeed生效的事件
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | setSpeed生效的事件回调类型,支持的事件:'speedDone',每次调用setSpeed后都会回调此事件。 |
| callback | function | 是 | setSpeed生效的事件回调方法,上报生效的倍速模式,具体见[PlaybackSpeed](#playbackspeed8)。 |
**示例:**
```js
avPlayer.on('speedDone', (speed:number) => {
console.info('speedDone success,and speed value is:' + speed)
})
```
### off('speedDone')<sup>9+</sup><a name = speedDone_off></a>
off(type: 'speedDone'): void
取消监听setSpeed生效的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | --------------------------------------------------------- |
| type | string | 是 | setSpeed生效的事件回调类型,取消注册的事件:'speedDone'。 |
**示例:**
```js
avPlayer.off('speedDone')
```
### setBitrate<sup>9+</sup>
setBitrate(bitrate: number): void
选择要播放的指定比特率,仅对**HLS协议网络流**有效,只能在prepared/playing/paused/complete状态调用,可以通过[bitrateDone](#bitrateDone_on)事件确认是否生效。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------ | ---- | ------------------------------------------------------------ |
| bitrate | number | 是 | 指定比特率,可以通过[availableBitrates](#availableBitrates_on)事件获得当前HLS协议流可用的比特率,如果用户指定的比特率不在此列表中,则播放器将从可用比特率列表中选择最小和最接近的比特率。 |
**示例:**
```js
let bitrate = 96000
avPlayer.setBitrate(bitrate)
```
### on('bitrateDone')<sup>9+</sup><a name = bitrateDone_on></a>
on(type: 'bitrateDone', callback: Callback\<number>): void
监听setBitrate生效的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | setBitrate生效的事件回调类型,支持的事件:'bitrateDone',每次调用setBitrate后都会回调此事件。 |
| callback | function | 是 | setBitrate生效的事件回调方法,上报生效的比特率。 |
**示例:**
```js
avPlayer.on('bitrateDone', (bitrate:number) => {
console.info('bitrateDone success,and bitrate value is:' + bitrate)
})
```
### off('bitrateDone')<sup>9+</sup><a name = bitrateDone_off></a>
off(type: 'bitrateDone'): void
取消监听setBitrate生效的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | setBitrate生效的事件回调类型,取消注册的事件:'bitrateDone'。 |
**示例:**
```js
avPlayer.off('bitrateDone')
```
### on('availableBitrates')<sup>9+</sup><a name = availableBitrates_on></a>
on(type: 'availableBitrates', callback: (bitrates: Array\<number>) => void): void
监听HLS协议流可用的比特率列表,只会在切换prepared状态后上报。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | HLS协议可用比特率上报事件回调类型,支持的事件:'availableBitrates',只会在prepared之后上报一次。 |
| callback | function | 是 | HLS协议可用比特率上报事件回调方法,使用数组存放支持的比特率。 |
**示例:**
```js
avPlayer.on('availableBitrates', (bitrates: Array<number>) => {
console.info('availableBitrates success,and availableBitrates length is:' + bitrates.length)
})
```
### off('availableBitrates')<sup>9+</sup><a name = availableBitrates_off></a>
off(type: 'availableBitrates'): void
取消监听HLS协议流可用的比特率列表。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | HLS协议可用比特率上报事件回调类型,取消注册的事件:'availableBitrates'。 |
**示例:**
```js
avPlayer.off('availableBitrates')
```
### setVolume<sup>9+</sup>
setVolume(volume: number): void
设置媒体播放音量,只能在prepared/playing/paused/complete状态调用,可以通过[volumeChange事件](#volumeChange_on)确认是否生效。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| volume | number | 是 | 指定的相对音量大小,取值范围为[0.00-1.00],1表示最大音量,即100%。 |
**示例:**
```js
let volume = 1.0
avPlayer.setVolume(volume)
```
### on('volumeChange')<sup>9+</sup><a name = volumeChange_on></a>
on(type: 'volumeChange', callback: Callback\<number>): void
监听setVolume生效的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | setVolume生效的事件回调类型,支持的事件:'volumeChange',每次调用setVolume后都会回调此事件。 |
| callback | function | 是 | setVolume生效的事件回调方法,上报生效的媒体音量。 |
**示例:**
```js
avPlayer.on('volumeChange', (vol:number) => {
console.info('volumeChange success,and new volume is :' + vol)
})
```
### off('volumeChange')<sup>9+</sup><a name = volumeChange_off></a>
off(type: 'volumeChange'): void
取消监听setVolume生效的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | setVolume生效的事件回调类型,取消注册的事件:'availableBitrates'。 |
**示例:**
```js
avPlayer.off('volumeChange')
```
### on('endOfStream')<sup>9+</sup><a name = endOfStream_on></a>
on(type: 'endOfStream', callback: Callback<void>): void
监听资源播放至结尾的事件;如果用户设置**loop=1**,播放会跳转至开头重播;如果用户没有设置loop,会通过[stateChange](#stateChange_on)上报completed状态。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | 资源播放至结尾的事件回调类型,支持的事件:'endOfStream',当播放至结尾时会上报此事件。 |
| callback | function | 是 | 资源播放至结尾的事件回调方法。 |
**示例:**
```js
avPlayer.on('endOfStream', () => {
console.info('endOfStream success')
})
```
### off('endOfStream')<sup>9+</sup><a name = endOfStream_off></a>
off(type: 'endOfStream'): void
取消监听资源播放至结尾的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | 资源播放至结尾的事件回调类型,取消注册的事件:'endOfStream'。 |
**示例:**
```js
avPlayer.off('endOfStream')
```
### on('timeUpdate')<sup>9+</sup><a name = timeUpdate_on></a>
on(type: 'timeUpdate', callback: Callback\<number>): void
监听资源播放当前时间,单位为毫秒(ms),用于刷新进度条当前位置,默认间隔1s时间上报,因用户操作(seek)产生的时间变化会立刻上报。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ---------------------------------------------- |
| type | string | 是 | 时间更新的回调类型,支持的事件:'timeUpdate'。 |
| callback | function | 是 | 当前时间。 |
**示例:**
```js
avPlayer.on('timeUpdate', (time:number) => {
console.info('timeUpdate success,and new time is :' + time)
})
```
### off('timeUpdate')<sup>9+</sup><a name = timeUpdate_off></a>
off(type: 'timeUpdate'): void
取消监听资源播放当前时间。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | -------------------------------------------------- |
| type | string | 是 | 时间更新的回调类型,取消注册的事件:'timeUpdate'。 |
**示例:**
```js
avPlayer.off('timeUpdate')
```
### on('durationUpdate')<sup>9+</sup><a name = durationUpdate_on></a>
on(type: 'durationUpdate', callback: Callback\<number>): void
监听资源播放资源的时长,单位为毫秒(ms),用于刷新进度条长度,默认只在prepared上报一次,同时允许一些特殊码流刷新多次时长。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | -------------------------------------------------- |
| type | string | 是 | 时长更新的回调类型,支持的事件:'durationUpdate'。 |
| callback | function | 是 | 资源时长。 |
**示例:**
```js
avPlayer.on('durationUpdate', (duration) => {
console.info('durationUpdate success,new duration is :' + duration)
})
```
### off('durationUpdate')<sup>9+</sup><a name = durationUpdate_off></a>
off(type: 'durationUpdate'): void
取消监听资源播放资源的时长。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------ |
| type | string | 是 | 时长更新的回调类型,取消注册的事件:'durationUpdate'。 |
**示例:**
```js
avPlayer.off('durationUpdate')
```
### on('bufferingUpdate')<sup>9+</sup><a name = bufferingUpdate_on></a>
on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void
订阅音视频缓存更新事件,仅网络播放支持该订阅事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | 播放缓存事件回调类型,支持的事件:'bufferingUpdate'。 |
| callback | function | 是 | 播放缓存事件回调方法。<br/>[BufferingInfoType](#bufferinginfotype8)为BUFFERING_PERCENT或CACHED_DURATION时,value值有效,否则固定为0。 |
**示例:**
```js
avPlayer.on('bufferingUpdate', (infoType: media.BufferingInfoType, value: number) => {
console.info('bufferingUpdate success,and infoType value is:' + infoType + ', value is :' + value)
})
```
### off('bufferingUpdate')<sup>9+</sup><a name = bufferingUpdate_off></a>
off(type: 'bufferingUpdate'): void
取消监听音视频缓存更新事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | --------------------------------------------------------- |
| type | string | 是 | 播放缓存事件回调类型,取消注册的事件:'bufferingUpdate'。 |
**示例:**
```js
avPlayer.off('bufferingUpdate')
```
### on('startRenderFrame')<sup>9+</sup><a name = startRenderFrame_on></a>
on(type: 'startRenderFrame', callback: Callback\<void>): void
订阅视频播放开始首帧渲染的更新事件,仅视频播放支持该订阅事件,该事件仅代表播放服务将第一帧画面送显示模块,实际效果依赖显示服务渲染性能。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | 视频播放开始首帧渲染事件回调类型,支持的事件:'startRenderFrame'。 |
| callback | function | 是 | 视频播放开始首帧渲染事件回调方法。 |
**示例:**
```js
avPlayer.on('startRenderFrame', () => {
console.info('startRenderFrame success')
})
```
### off('startRenderFrame')<sup>9+</sup><a name = startRenderFrame_off></a>
off(type: 'startRenderFrame'): void
取消监听视频播放开始首帧渲染的更新事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | 视频播放开始首帧渲染事件回调类型,取消注册的事件:'startRenderFrame'。 |
**示例:**
```js
avPlayer.off('startRenderFrame')
```
### on('videoSizeChange')<sup>9+</sup><a name = videoSizeChange_on></a>
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')<sup>9+</sup><a name = videoSizeChange_off></a>
off(type: 'videoSizeChange'): void
取消监听视频播放宽高变化事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | 视频播放宽高变化事件回调类型,取消注册的事件:'videoSizeChange'。 |
**示例:**
```js
avPlayer.off('videoSizeChange')
```
### on('audioInterrupt')<sup>9+</sup><a name = audioInterrupt_on></a>
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.InterruptEvent<sup>9+</sup>](js-apis-audio.md#interruptevent9) | 是 | 音频焦点变化事件回调方法。 |
**示例:**
```js
avPlayer.on('audioInterrupt', (info: audio.InterruptEvent) => {
console.info('audioInterrupt success,and InterruptEvent info is:' + info)
})
```
### off('audioInterrupt')<sup>9+</sup><a name = audioInterrupt_off></a>
off(type: 'audioInterrupt'): void
取消监听音频焦点变化事件。
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | 音频焦点变化事件回调类型,取消注册的事件:'audioInterrupt'。 |
**示例:**
```js
avPlayer.off('audioInterrupt')
```
## AVPlayerState<sup>9+</sup><a name = avplayerstate></a>
[AVPlayer](#avplayer9)的状态机,可通过state属性主动获取当前状态,也可通过监听[stateChange](#stateChange_on)事件上报当前状态,状态机之间的切换规则,可参考[AVPlayer播放器开发指导](../../media/avplayer-playback.md)
**系统能力:** SystemCapability.Multimedia.Media.AVPlayer
| 名称 | 类型 | 说明 |
| :-----------------------------: | :----: | :----------------------------------------------------------- |
| idle | string | 闲置状态,AVPlayer刚被创建[createAVPlayer()](#mediacreateavplayer9)或者调用了reset()方法之后,进入Idle状态。<br/>首次创建createAVPlayer(),所有属性都为默认值。<br/>调用reset()方法,url<sup>9+</sup> 或 fdSrc<sup>9+</sup>属性会被重置,其他用户设置的属性将被保留。 |
| initialized | string | 资源初始化,在Idle 状态设置 url<sup>9+</sup> 或 fdSrc<sup>9+</sup>属性,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<a name = error_state></a> | string | 错误状态,当**播放引擎**发生**不可逆的错误**,详见[错误分类](#error_info),则会转换至当前状态,可以调用reset()重置,也可以调用release()销毁重建。<br/>**注意:** 区分error状态和 [on('error')](#error_on)<br/>1、进入error状态时,会触发[on('error')](#error_on)监听事件,可以通过[on('error')](#error_on)事件获取详细错误信息;<br/>2、处于error状态时,播放服务进入不可播控的状态,要求客户端设计容错机制,使用reset()重置或者release()销毁重建;<br/>3、如果客户端收到[on('error')](#error_on),但未进入error状态:<br/>原因1:客户端未按状态机调用API或传入参数错误,被AVPlayer拦截提醒,需要客户端调整代码逻辑;<br/>原因2:播放过程发现码流问题,导致容器、解码短暂异常,不影响连续播放和播控操作的,不需要客户端设计容错机制。 |
## AVFileDescriptor<sup>9+</sup>
音视频文件资源描述,一种特殊资源的播放方式,使用场景:应用中的音频资源被连续存储在同一个文件中,需要根据偏移量和长度进行播放。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| fd | number | 是 | 资源句柄,通过resourceManager.getRawFileDescriptor获取。 |
| offset | number | 是 | 资源偏移量,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误。 |
| length | number | 是 | 资源长度,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误。 |
## SeekMode<sup>8+</sup>
视频播放的Seek模式枚举,可通过seek方法作为参数传递下去。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| -------------- | ---- | ------------------------------------------------------------ |
| SEEK_NEXT_SYNC | 0 | 表示跳转到指定时间点的下一个关键帧,建议向后快进的时候用这个枚举值。 |
| SEEK_PREV_SYNC | 1 | 表示跳转到指定时间点的上一个关键帧,建议向前快进的时候用这个枚举值。 |
## PlaybackSpeed<sup>8+</sup>
视频播放的倍速枚举,可通过setSpeed方法作为参数传递下去。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer
| 名称 | 值 | 说明 |
| -------------------- | ---- | ------------------------------ |
| SPEED_FORWARD_0_75_X | 0 | 表示视频播放正常播速的0.75倍。 |
| SPEED_FORWARD_1_00_X | 1 | 表示视频播放正常播速。 |
| SPEED_FORWARD_1_25_X | 2 | 表示视频播放正常播速的1.25倍。 |
| SPEED_FORWARD_1_75_X | 3 | 表示视频播放正常播速的1.75倍。 |
| SPEED_FORWARD_2_00_X | 4 | 表示视频播放正常播速的2.00倍。 |
## VideoScaleType<sup>9+</sup>
枚举,视频缩放模式。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer
| 名称 | 值 | 说明 |
| ------------------------- | ---- | ------------------------------------------------ |
| VIDEO_SCALE_TYPE_FIT | 0 | 视频拉伸至与窗口等大。 |
| VIDEO_SCALE_TYPE_FIT_CROP | 1 | 保持视频宽高比拉伸至填满窗口,内容可能会有裁剪。 |
## MediaDescription<sup>8+</sup>
通过key-value方式获取媒体信息。
**系统能力:** SystemCapability.Multimedia.Media.Core
**示例:**
```js
import media from '@ohos.multimedia.media'
function printfItemDescription(obj, key) {
let property = obj[key];
console.info('audio key is ' + key); // 通过key值获取对应的value。key值具体可见[MediaDescriptionKey]
console.info('audio value is ' + property); //对应key值得value。其类型可为任意类型,具体key对应value的类型可参考[MediaDescriptionKey]
}
let audioPlayer = media.createAudioPlayer();
audioPlayer.getTrackDescription((error, arrList) => {
if (arrList != null) {
for (let i = 0; i < arrList.length; i++) {
printfItemDescription(arrList[i], media.MediaDescriptionKey.MD_KEY_TRACK_TYPE); //打印出每条轨道MD_KEY_TRACK_TYPE的值
}
} else {
console.log(`audio getTrackDescription fail, error:${error}`);
}
});
```
## AVRecorder<sup>9+</sup>
音视频录制管理类,用于音视频媒体录制。在调用AVRecorder的方法前,需要先通过createAVRecorder()构建一个AVRecorder实例。
音视频录制demo可参考:[音视频录制开发指导](../../media/avrecorder.md)
### 属性
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
| 名称 | 类型 | 可读 | 可写 | 说明 |
| ------- | ------------------------------------ | ---- | ---- | ------------------ |
| state9+ | [AVRecorderState](#avrecorderstate9) | 是 | 否 | 音视频录制的状态。 |
### prepare<sup>9+</sup><a name=avrecorder_prepare></a>
prepare(config: AVRecorderConfig, callback: AsyncCallback\<void>): void
异步方式进行音视频录制的参数设置。通过注册回调函数获取返回值。
**需要权限:** ohos.permission.MICROPHONE
不涉及音频录制时,可以不需要获取ohos.permission.MICROPHONE权限。涉及相机视频录制则需要额外获取相机权限ohos.permission.CAMERA。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------------------------- | ---- | ------------------------------------- |
| config | [AVRecorderConfig](#avrecorderconfig9) | 是 | 配置音视频录制的相关参数。 |
| callback | AsyncCallback\<void> | 是 | 异步音视频录制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 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, (err) => {
if (err == null) {
console.info('prepare success');
} else {
console.info('prepare failed and error is ' + err.message);
}
})
```
### prepare<sup>9+</sup>
prepare(config: AVRecorderConfig): Promise\<void>
异步方式进行音视频录制的参数设置。通过Promise获取返回值。
**需要权限:** ohos.permission.MICROPHONE
不涉及音频录制时,可以不需要获ohos.permission.MICROPHONE权限。涉及相机视频录制则需要额外获取相机权限ohos.permission.CAMERA。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | -------------------------------------- | ---- | -------------------------- |
| config | [AVRecorderConfig](#avrecorderconfig9) | 是 | 配置音视频录制的相关参数。 |
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------------------------ |
| Promise\<void> | 异步音视频录制prepare方法的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../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
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);
});
```
### getInputSurface<sup>9+</sup><a name=avrecorder_getinputsurface></a>
getInputSurface(callback: AsyncCallback\<string>): void
异步方式获得录制需要的surface。此surface提供给调用者,调用者从此surface中获取surfaceBuffer,填入相应的视频数据。
应当注意,填入的视频数据需要携带时间戳(单位ns)和buffersize。时间戳的起始时间请以系统启动时间为基准。
需在prepare()事件成功触发后,才能调用getInputSurface()方法。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------- | ---- | --------------------------- |
| callback | AsyncCallback\<string> | 是 | 异步获得surface的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../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 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);
}
});
// videoOutput = await cameraManager.createVideoOutput(videoProfiles[0], surfaceID);
```
### getInputSurface<sup>9+</sup>
getInputSurface(): Promise\<string>
异步方式获得录制需要的surface。此surface提供给调用者,调用者从此surface中获取surfaceBuffer,填入相应的视频数据。
应当注意,填入的视频数据需要携带时间戳(单位ns)和buffersize。时间戳的起始时间请以系统启动时间为基准。
需在prepare()事件成功触发后,才能调用getInputSurface方法。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 类型 | 说明 |
| ---------------- | -------------------------------- |
| Promise\<string> | 异步获得surface的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 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);
});
// videoOutput = await cameraManager.createVideoOutput(videoProfiles[0], surfaceID);
```
### start<sup>9+</sup><a name=avrecorder_start></a>
start(callback: AsyncCallback\<void>): void
异步方式开始视频录制。通过注册回调函数获取返回值。
纯音频录制需在prepare()事件成功触发后,才能调用start方法。纯视频录制,音视频录制需在getInputSurface()事件成功触发后,才能调用start方法。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ---------------------------- |
| callback | AsyncCallback\<void> | 是 | 异步开始视频录制的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../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
AVRecorder.start((err) => {
if (err == null) {
console.info('start AVRecorder success');
} else {
console.info('start AVRecorder failed and error is ' + err.message);
}
});
```
### start<sup>9+</sup>
start(): Promise\<void>
异步方式开始视频录制。通过Promise获取返回值。
纯音频录制需在prepare()事件成功触发后,才能调用start方法。纯视频录制,音视频录制需在getInputSurface()事件成功触发后,才能调用start方法。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------------------- |
| Promise\<void> | 异步开始视频录制方法的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
AVRecorder.start().then(() => {
console.info('start AVRecorder success');
}).catch((err) => {
console.info('start AVRecorder failed and catch error is ' + err.message);
});
```
### pause<sup>9+</sup><a name=avrecorder_pause></a>
pause(callback: AsyncCallback\<void>): void
异步方式暂停视频录制。通过注册回调函数获取返回值。
需要start()事件成功触发后,才能调用pause方法,可以通过调用resume()接口来恢复录制。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | --------------------------- |
| callback | AsyncCallback\<void> | 是 | 异步获得surface的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../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
AVRecorder.pause((err) => {
if (err == null) {
console.info('pause AVRecorder success');
} else {
console.info('pause AVRecorder failed and error is ' + err.message);
}
});
```
### pause<sup>9+</sup>
pause(): Promise\<void>
异步方式暂停视频录制。通过Promise获取返回值。
需要start()事件成功触发后,才能调用pause方法,可以通过调用resume()接口来恢复录制。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------------------- |
| Promise\<void> | 异步暂停视频录制方法的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
AVRecorder.pause().then(() => {
console.info('pause AVRecorder success');
}).catch((err) => {
console.info('pause AVRecorder failed and catch error is ' + err.message);
});
```
### resume<sup>9+</sup><a name=avrecorder_resume></a>
resume(callback: AsyncCallback\<void>): void
异步方式恢复视频录制。通过注册回调函数获取返回值。
需要在pause()事件成功触发后,才能调用resume方法。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ---------------------------- |
| callback | AsyncCallback\<void> | 是 | 异步恢复视频录制的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../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
AVRecorder.resume((err) => {
if (err == null) {
console.info('resume AVRecorder success');
} else {
console.info('resume AVRecorder failed and error is ' + err.message);
}
});
```
### resume<sup>9+</sup>
resume(): Promise\<void>
异步方式恢复视频录制。通过Promise获取返回值。
需要在pause()事件成功触发后,才能调用resume方法。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------------------- |
| Promise\<void> | 异步恢复视频录制方法的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
AVRecorder.resume().then(() => {
console.info('resume AVRecorder success');
}).catch((err) => {
console.info('resume AVRecorder failed and catch error is ' + err.message);
});
```
### stop<sup>9+</sup><a name=avrecorder_stop></a>
stop(callback: AsyncCallback\<void>): void
异步方式停止视频录制。通过注册回调函数获取返回值。
需要在start()或pause()事件成功触发后,才能调用stop方法。
纯音频录制时,需要重新调用prepare()接口才能重新录制。纯视频录制,音视频录制时,需要重新调用prepare()和getInputSurface()接口才能重新录制。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ---------------------------- |
| callback | AsyncCallback\<void> | 是 | 异步停止视频录制的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../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
AVRecorder.stop((err) => {
if (err == null) {
console.info('stop AVRecorder success');
} else {
console.info('stop AVRecorder failed and error is ' + err.message);
}
});
```
### stop<sup>9+</sup>
stop(): Promise\<void>
异步方式停止视频录制。通过Promise获取返回值。
需要在start()或pause()事件成功触发后,才能调用stop方法。
纯音频录制时,需要重新调用prepare()接口才能重新录制。纯视频录制,音视频录制时,需要重新调用prepare()和getInputSurface()接口才能重新录制。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------------------- |
| Promise\<void> | 异步停止视频录制方法的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
AVRecorder.stop().then(() => {
console.info('stop AVRecorder success');
}).catch((err) => {
console.info('stop AVRecorder failed and catch error is ' + err.message);
});
```
### reset<sup>9+</sup><a name=avrecorder_reset></a>
reset(callback: AsyncCallback\<void>): void
异步方式重置音视频录制。通过注册回调函数获取返回值。
纯音频录制时,需要重新调用prepare()接口才能重新录制。纯视频录制,音视频录制时,需要重新调用prepare()和getInputSurface()接口才能重新录制。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ------------------------------ |
| callback | AsyncCallback\<void> | 是 | 异步重置音视频录制的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | --------------------------------- |
| 5400103 | IO error. Return by callback. |
| 5400105 | Service died. Return by callback. |
**示例:**
```js
AVRecorder.reset((err) => {
if (err == null) {
console.info('reset AVRecorder success');
} else {
console.info('reset AVRecorder failed and error is ' + err.message);
}
});
```
### reset<sup>9+</sup>
reset(): Promise\<void>
异步方式重置音视频录制。通过Promise获取返回值。
纯音频录制时,需要重新调用prepare()接口才能重新录制。纯视频录制,音视频录制时,需要重新调用prepare()和getInputSurface()接口才能重新录制。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 类型 | 说明 |
| -------------- | --------------------------------------- |
| Promise\<void> | 异步重置音视频录制方法的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | -------------------------------- |
| 5400103 | IO error. Return by promise. |
| 5400105 | Service died. Return by promise. |
**示例:**
```js
AVRecorder.reset().then(() => {
console.info('reset AVRecorder success');
}).catch((err) => {
console.info('reset AVRecorder failed and catch error is ' + err.message);
});
```
### release<sup>9+</sup><a name=avrecorder_release></a>
release(callback: AsyncCallback\<void>): void
异步方式释放音视频录制资源。通过注册回调函数获取返回值。
释放音视频录制资源之后,该AVRecorder实例不能再进行任何操作。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ---------------------------------- |
| callback | AsyncCallback\<void> | 是 | 异步释放音视频录制资源的回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | --------------------------------- |
| 5400105 | Service died. Return by callback. |
**示例:**
```js
AVRecorder.release((err) => {
if (err == null) {
console.info('release AVRecorder success');
} else {
console.info('release AVRecorder failed and error is ' + err.message);
}
});
```
### release<sup>9+</sup>
release(): Promise\<void>
异步方式释放音视频录制资源。通过Promise获取返回值。
释放音视频录制资源之后,该AVRecorder实例不能再进行任何操作。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------------------------- |
| Promise\<void> | 异步释放音视频录制资源方法的Promise返回值。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | --------------------------------- |
| 5400105 | Service died. Return by callback. |
**示例:**
```js
AVRecorder.release().then(() => {
console.info('release AVRecorder success');
}).catch((err) => {
console.info('release AVRecorder failed and catch error is ' + err.message);
});
```
### on('stateChange')<sup>9+</sup><a name=avrecorder_onstatechange></a>
on(type: 'stateChange', callback: (state: AVRecorderState, reason: StateChangeReason) => void): void
订阅录制状态机AVRecorderState切换的事件,当 AVRecorderState状态机发生变化时,会通过订阅的回调方法通知用户。用户只能订阅一个状态机切换事件的回调方法,当用户重复订阅时,以最后一次订阅的回调接口为准。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | 状态机切换事件回调类型,支持的事件:'stateChange',用户操作和系统都会触发此事件。 |
| callback | function | 是 | 状态机切换事件回调方法:<br>state: [AVRecorderState](#avrecorderstate9),表示当前播放状态 ;<br>reason: [StateChangeReason](#statechangereason9),表示当前播放状态的切换原因。 |
**示例:**
```js
AVRecorder.on('stateChange', async (state, reason) => {
console.info('case state has changed, new state is :' + state + ',and new reason is : ' + reason);
}
});
```
### off('stateChange')<sup>9+</sup>
off(type: 'stateChange'): void
取消订阅播放状态机[AVRecorderState](#avrecorderstate9)切换的事件。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | 状态机切换事件回调类型,支持的事件:'stateChange',用户操作和系统都会触发此事件。 |
**示例:**
```js
AVRecorder.off('stateChange');
```
### on('error')<sup>9+</sup><a name=avrecorder_onerror></a>
on(type: 'error', callback: ErrorCallback): void
订阅AVRecorder的错误事件,该事件仅用于错误提示,不需要用户停止播控动作。如果此时[AVRecorderState](#avrecorderstate9)也切至error状态,用户需要通过reset()或者release()退出录制操作。
用户只能订阅一个错误事件的回调方法,当用户重复订阅时,以最后一次订阅的回调接口为准。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------- | ---- | ------------------------------------------------------------ |
| type | string | 是 | 录制错误事件回调类型'error'。 <br>- 'error':录制过程中发生错误,触发该事件。 |
| callback | ErrorCallback | 是 | 录制错误事件回调方法。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | --------------------------------- |
| 5400103 | IO error. Return by callback. |
| 5400105 | Service died. Return by callback. |
**示例:**
```js
AVRecorder.on('error', (err) => {
console.info('case avRecorder.on(error) called, errMessage is ' + err.message);
});
```
### off('error')<sup>9+</sup>
off(type: 'error'): void
取消订阅录制错误事件,取消后不再接收到AVRecorder的错误事件。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| type | string | 是 | 录制错误事件回调类型'error'。 <br>- 'error':录制过程中发生错误,触发该事件。 |
**错误码:**
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
| 错误码ID | 错误信息 |
| -------- | --------------------------------- |
| 5400103 | IO error. Return by callback. |
| 5400105 | Service died. Return by callback. |
**示例:**
createVideoRecorder(): Promise<[VideoRecorder](#videorecorder9)>
```js
AVRecorder.off('error');
```
异步方式创建视频录制实例。通过Promise获取返回值。
一台设备只允许创建一个录制实例。
## AVRecorderState<sup>9+</sup>
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder
音视频录制的状态机。可通过state属性获取当前状态。
**系统接口:** 该接口为系统接口
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
**返回值:**
| 名称 | 类型 | 说明 |
| -------- | ------ | ------------------------------------------------------------ |
| 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)方法释放资源。 |
| 类型 | 说明 |
| ----------------------------------------- | ------------------------------------------------------------ |
| Promise<[VideoRecorder](#videorecorder9)> | Promise对象。异步返回VideoRecorder实例,失败时返回null。可用于录制视频媒体。 |
## AVRecorderConfig<sup>9+</sup>
**错误码:**
表示音视频录制的参数设置。
以下错误码的详细介绍请参见[媒体错误码](../errorcodes/errorcode-media.md)
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
| 错误码ID | 错误信息 |
| -------- | ----------------------------- |
| 5400101 | No memory. Return by promise. |
| 名称 | 类型 | 必填 | 说明 |
| --------------- | ---------------------------------------- | ---- | ------------------------------------------------------------ |
| 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) | 否 | 录制的地理位置。 |
**示例:**
通过audioSourceType和videoSourceType区分纯音频录制、纯视频录制或音视频录制。纯音频录制时,仅需要设置audioSourceType;纯视频录制时,仅需要设置videoSourceType;音视频录制时,audioSourceType和videoSourceType均需要设置。
```js
let videoRecorder
## AVRecorderProfile<sup>9+</sup>
media.createVideoRecorder().then((video) => {
if (video != null) {
videoRecorder = video;
console.info('video createVideoRecorder success');
} else {
console.info('video createVideoRecorder fail');
}
}).catch((error) => {
console.info(`video catchCallback, error:${error}`);
});
```
音视频录制的配置文件。
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
| 名称 | 类型 | 必填 | 说明 |
| ---------------- | -------------------------------------------- | ---- | -------------------------------------- |
| audioBitrate | number | 否 | 音频编码比特率,选择音频录制时必填。 |
| audioChannels | number | 否 | 音频采集声道数,选择音频录制时必填。 |
| audioCodec | [CodecMimeType](#codecmimetype8) | 否 | 音频编码格式,选择音频录制时必填。 |
| audioSampleRate | number | 否 | 音频采样率,选择音频录制时必填。 |
| fileFormat | [ContainerFormatType](#containerformattype8) | 是 | 文件的容器格式,必要参数 |
| videoBitrate | number | 否 | 音视频编码比特率,选择视频录制时必填。 |
| videoCodec | [CodecMimeType](#codecmimetype8) | 否 | 音视频编码格式,选择视频录制时必填。 |
| videoFrameWidth | number | 否 | 录制视频帧的宽,选择视频录制时必填。 |
| videoFrameHeight | number | 否 | 录制视频帧的高,选择视频录制时必填。 |
| videoFrameRate | number | 否 | 录制视频帧率,选择视频录制时必填。 |
## MediaErrorCode<sup>8+</sup>
## AudioSourceType<sup>9+</sup>
媒体服务错误类型枚举。
表示视频录制中音频源类型的枚举。
**系统能力:** SystemCapability.Multimedia.Media.Core
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
| 名称 | 值 | 说明 |
| -------------------------- | ---- | -------------------------------------- |
| 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 | 表示在当前版本下,不支持此操作。 |
| 名称 | 值 | 说明 |
| ------------------------- | ---- | ---------------------- |
| AUDIO_SOURCE_TYPE_DEFAULT | 0 | 默认的音频输入源类型。 |
| AUDIO_SOURCE_TYPE_MIC | 1 | 表示MIC的音频输入源。 |
## MediaType<sup>8+</sup>
## VideoSourceType<sup>9+</sup>
媒体类型枚举。
表示视频录制中视频源类型的枚举。
**系统能力:** SystemCapability.Multimedia.Media.Core
**系统能力:** SystemCapability.Multimedia.Media.AVRecorder
| 名称 | 值 | 说明 |
| -------------- | ---- | ---------- |
| MEDIA_TYPE_AUD | 0 | 表示音频。 |
| MEDIA_TYPE_VID | 1 | 表示视频。 |
| 名称 | 值 | 说明 |
| ----------------------------- | ---- | ------------------------------- |
| VIDEO_SOURCE_TYPE_SURFACE_YUV | 0 | 输入surface中携带的是raw data。 |
| VIDEO_SOURCE_TYPE_SURFACE_ES | 1 | 输入surface中携带的是ES data。 |
## CodecMimeType<sup>8+</sup>
## ContainerFormatType<sup>8+</sup>
Codec MIME类型枚举
表示容器格式类型的枚举,缩写为CFT
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| ------------ | --------------------- | ------------------------ |
| VIDEO_H263 | 'video/h263' | 表示视频/h263类型。 |
| VIDEO_AVC | 'video/avc' | 表示视频/avc类型。 |
| VIDEO_MPEG2 | 'video/mpeg2' | 表示视频/mpeg2类型。 |
| VIDEO_MPEG4 | 'video/mp4v-es' | 表示视频/mpeg4类型。 |
| VIDEO_VP8 | 'video/x-vnd.on2.vp8' | 表示视频/vp8类型。 |
| AUDIO_AAC | 'audio/mp4a-latm' | 表示音频/mp4a-latm类型。 |
| AUDIO_VORBIS | 'audio/vorbis' | 表示音频/vorbis类型。 |
| AUDIO_FLAC | 'audio/flac' | 表示音频/flac类型。 |
| 名称 | 值 | 说明 |
| ----------- | ----- | --------------------- |
| CFT_MPEG_4 | 'mp4' | 视频的容器格式,MP4。 |
| CFT_MPEG_4A | 'm4a' | 音频的容器格式,M4A。 |
## MediaDescriptionKey<sup>8+</sup>
## Location
媒体信息描述枚举
视频录制的地理位置
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| ------------------------ | --------------- | ------------------------------------------------------------ |
| MD_KEY_TRACK_INDEX | 'track_index' | 表示轨道序号,其对应键值类型为number。 |
| MD_KEY_TRACK_TYPE | 'track_type' | 表示轨道类型,其对应键值类型为number,参考[MediaType](#mediatype8)。 |
| MD_KEY_CODEC_MIME | 'codec_mime' | 表示codec_mime类型,其对应键值类型为string。 |
| MD_KEY_DURATION | 'duration' | 表示媒体时长,其对应键值类型为number,单位为毫秒(ms)。 |
| MD_KEY_BITRATE | 'bitrate' | 表示比特率,其对应键值类型为number,单位为比特率(bps)。 |
| MD_KEY_WIDTH | 'width' | 表示视频宽度,其对应键值类型为number,单位为像素(px)。 |
| MD_KEY_HEIGHT | 'height' | 表示视频高度,其对应键值类型为number,单位为像素(px)。 |
| MD_KEY_FRAME_RATE | 'frame_rate' | 表示视频帧率,其对应键值类型为number,单位为100帧每秒(100fps)。 |
| MD_KEY_AUD_CHANNEL_COUNT | 'channel_count' | 表示声道数,其对应键值类型为number。 |
| MD_KEY_AUD_SAMPLE_RATE | 'sample_rate' | 表示采样率,其对应键值类型为number,单位为赫兹(Hz)。 |
| 名称 | 类型 | 必填 | 说明 |
| --------- | ------ | ---- | ---------------- |
| latitude | number | 是 | 地理位置的纬度。 |
| longitude | number | 是 | 地理位置的经度。 |
## BufferingInfoType<sup>8+</sup>
## MediaErrorCode<sup>8+</sup>
缓存事件类型枚举。
媒体服务错误类型枚举。
> **说明:**
> 从API version 8 开始支持,从API version 9 开始废弃,建议使用[媒体错误码](../errorcodes/errorcode-media.md)替代。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| ----------------- | ---- | -------------------------------- |
| BUFFERING_START | 1 | 表示开始缓存。 |
| BUFFERING_END | 2 | 表示结束缓存。 |
| BUFFERING_PERCENT | 3 | 表示缓存百分比。 |
| CACHED_DURATION | 4 | 表示缓存时长,单位为毫秒(ms)。 |
| 名称 | 值 | 说明 |
| -------------------------- | ---- | -------------------------------------- |
| 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
> **说明:**
> AVPlayer9+</sup>发布后停止维护,请使用[AVPlayer](#avplayer9)<sup>9+</sup>
音频播放管理类,用于管理和播放音频媒体。在调用AudioPlayer的方法前,需要先通过[createAudioPlayer()](#mediacreateaudioplayer)构建一个[AudioPlayer](#audioplayer)实例。
音频播放demo可参考:[音频播放开发指导](../../media/audio-playback.md)
......@@ -303,6 +2692,7 @@ Codec MIME类型枚举。
| currentTime | number | 是 | 否 | 音频的当前播放位置,单位为毫秒(ms)。 |
| duration | number | 是 | 否 | 音频时长,单位为毫秒(ms)。 |
| state | [AudioState](#audiostate) | 是 | 否 | 可以查询音频播放的状态,该状态不可作为调用play/pause/stop等状态切换的触发条件。 |
### play<a name=audioplayer_play></a>
play(): void
......@@ -438,7 +2828,7 @@ audioPlayer = undefined;
### getTrackDescription<sup>8+</sup><a name=audioplayer_gettrackdescription1></a>
getTrackDescription(callback: AsyncCallback<Array\<MediaDescription>>): void
getTrackDescription(callback: AsyncCallback\<Array\<MediaDescription>>): void
通过回调方式获取音频轨道信息。需在[dataLoad](#audioplayer_on)事件成功触发后,才能调用。
......@@ -474,7 +2864,7 @@ audioPlayer.getTrackDescription((error, arrList) => {
### getTrackDescription<sup>8+</sup><a name=audioplayer_gettrackdescription2></a>
getTrackDescription(): Promise<Array\<MediaDescription>>
getTrackDescription(): Promise\<Array\<MediaDescription>>
通过Promise方式获取音频轨道信息。需在[dataLoad](#audioplayer_on)事件成功触发后,才能调用
......@@ -675,20 +3065,11 @@ audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件
| stopped | string | 音频播放停止,stop/播放结束后处于此状态。 |
| error | string | 错误状态。 |
## AVFileDescriptor<sup>9+</sup>
音视频文件资源描述,一种特殊资源的播放方式,使用场景:应用中的音频资源被连续存储在同一个文件中,需要根据偏移量和长度进行播放。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------------------------------------------ |
| fd | number | 是 | 资源句柄,通过resourceManager.getRawFileDescriptor获取 |
| offset | number | 是 | 资源偏移量,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误 |
| length | number | 是 | 资源长度,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误 |
## VideoPlayer<sup>8+</sup>
> **说明:**
> AVPlayer<sup>9+</sup>发布后停止维护,请使用[AVPlayer](#avplayer9)<sup>9+</sup>
视频播放管理类,用于管理和播放视频媒体。在调用VideoPlayer的方法前,需要先通过[createVideoPlayer()](#mediacreatevideoplayer8)构建一个[VideoPlayer](#videoplayer8)实例。
视频播放demo可参考:[视频播放开发指导](../../media/video-playback.md)
......@@ -697,18 +3078,18 @@ audioPlayer.setVolume(3); //设置volume为无效值,触发'error'事件
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer
| 名称 | 类型 | 可读 | 可写 | 说明 |
| ------------------------ | ---------------------------------- | ---- | ---- | ------------------------------------------------------------ |
| url<sup>8+</sup> | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。<br>**支持路径示例**<br>1. fd类型播放:fd://xx<br>![](figures/zh-cn_image_url.png)<br>2. http网络播放: http://xx<br/>3. https网络播放: https://xx<br/>4. hls网络播放路径:http://xx或者https://xx<br/> |
| fdSrc<sup>9+</sup> | [AVFileDescriptor](#avfiledescriptor9) | 是 | 是 | 视频媒体文件描述,使用场景:应用中的视频资源被连续存储在同一个文件中。<br/>**使用示例**<br/>假设一个连续存储的音乐文件: <br/>视频1(地址偏移:0,字节长度:100)<br/>视频2(地址偏移:101,字节长度:50)<br/>视频3(地址偏移:151,字节长度:150)<br/>1. 播放视频1:AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }<br/>2. 播放视频2:AVFileDescriptor { fd = 资源句柄; offset = 101; length = 50; }<br/>3. 播放视频3:AVFileDescriptor { fd = 资源句柄; offset = 151; length = 150; }<br/>假设是一个独立的视频文件: 请使用src=fd://xx <br/> |
| loop<sup>8+</sup> | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。 |
| videoScaleType<sup>9+</sup> | [VideoScaleType](#videoscaletype9) | 是 | 是 | 视频缩放模式。 |
| audioInterruptMode<sup>9+</sup> | [audio.InterruptMode](js-apis-audio.md#interruptmode9) | 是 | 是 | 音频焦点模型。 |
| currentTime<sup>8+</sup> | number | 是 | 否 | 视频的当前播放位置,单位为毫秒(ms)。 |
| duration<sup>8+</sup> | number | 是 | 否 | 视频时长,单位为毫秒(ms),返回-1表示直播模式。 |
| state<sup>8+</sup> | [VideoPlayState](#videoplaystate8) | 是 | 否 | 视频播放的状态。 |
| width<sup>8+</sup> | number | 是 | 否 | 视频宽,单位为像素(px)。 |
| height<sup>8+</sup> | number | 是 | 否 | 视频高,单位为像素(px)。 |
| 名称 | 类型 | 可读 | 可写 | 说明 |
| ------------------------------- | ------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ |
| url<sup>8+</sup> | string | 是 | 是 | 视频媒体URL,支持当前主流的视频格式(mp4、mpeg-ts、webm、mkv)。<br>**支持路径示例**<br>1. fd类型播放:fd://xx<br>![](figures/zh-cn_image_url.png)<br>2. http网络播放: http://xx<br/>3. https网络播放: https://xx<br/>4. hls网络播放路径:http://xx或者https://xx<br/> |
| fdSrc<sup>9+</sup> | [AVFileDescriptor](#avfiledescriptor9) | 是 | 是 | 视频媒体文件描述,使用场景:应用中的视频资源被连续存储在同一个文件中。<br/>**使用示例**<br/>假设一个连续存储的音乐文件: <br/>视频1(地址偏移:0,字节长度:100)<br/>视频2(地址偏移:101,字节长度:50)<br/>视频3(地址偏移:151,字节长度:150)<br/>1. 播放视频1:AVFileDescriptor { fd = 资源句柄; offset = 0; length = 100; }<br/>2. 播放视频2:AVFileDescriptor { fd = 资源句柄; offset = 101; length = 50; }<br/>3. 播放视频3:AVFileDescriptor { fd = 资源句柄; offset = 151; length = 150; }<br/>假设是一个独立的视频文件: 请使用src=fd://xx <br/> |
| loop<sup>8+</sup> | boolean | 是 | 是 | 视频循环播放属性,设置为'true'表示循环播放。 |
| videoScaleType<sup>9+</sup> | [VideoScaleType](#videoscaletype9) | 是 | 是 | 视频缩放模式。 |
| audioInterruptMode<sup>9+</sup> | [audio.InterruptMode](js-apis-audio.md#interruptmode9) | 是 | 是 | 音频焦点模型。 |
| currentTime<sup>8+</sup> | number | 是 | 否 | 视频的当前播放位置,单位为毫秒(ms)。 |
| duration<sup>8+</sup> | number | 是 | 否 | 视频时长,单位为毫秒(ms),返回-1表示直播模式。 |
| state<sup>8+</sup> | [VideoPlayState](#videoplaystate8) | 是 | 否 | 视频播放的状态。 |
| width<sup>8+</sup> | number | 是 | 否 | 视频宽,单位为像素(px)。 |
| height<sup>8+</sup> | number | 是 | 否 | 视频高,单位为像素(px)。 |
### setDisplaySurface<sup>8+</sup>
......@@ -1098,8 +3479,8 @@ seek(timeMs: number, mode?:SeekMode): Promise\<number>
**返回值:**
| 类型 | 说明 |
| -------------- | ------------------------------------------- |
| 类型 | 说明 |
| ---------------- | ------------------------------------------- |
| Promise\<number> | 跳转到指定播放位置的Promise返回值,单位ms。 |
**示例:**
......@@ -1231,7 +3612,7 @@ videoPlayer.release().then(() => {
### getTrackDescription<sup>8+</sup>
getTrackDescription(callback: AsyncCallback<Array\<MediaDescription>>): void
getTrackDescription(callback: AsyncCallback\<Array\<MediaDescription>>): void
通过回调方式获取视频轨道信息。
......@@ -1267,7 +3648,7 @@ videoPlayer.getTrackDescription((error, arrList) => {
### getTrackDescription<sup>8+</sup>
getTrackDescription(): Promise<Array\<MediaDescription>>
getTrackDescription(): Promise\<Array\<MediaDescription>>
通过Promise方式获取视频轨道信息。
......@@ -1526,71 +3907,11 @@ videoPlayer.on('availableBitratesCollect', (bitrates) => {
| stopped | string | 视频播放停止。 |
| error | string | 错误状态。 |
## SeekMode<sup>8+</sup>
视频播放的Seek模式枚举,可通过seek方法作为参数传递下去。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| -------------- | ---- | ------------------------------------------------------------ |
| SEEK_NEXT_SYNC | 0 | 表示跳转到指定时间点的下一个关键帧,建议向后快进的时候用这个枚举值。 |
| SEEK_PREV_SYNC | 1 | 表示跳转到指定时间点的上一个关键帧,建议向前快进的时候用这个枚举值。 |
## PlaybackSpeed<sup>8+</sup>
视频播放的倍速枚举,可通过setSpeed方法作为参数传递下去。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer
| 名称 | 值 | 说明 |
| -------------------- | ---- | ------------------------------ |
| SPEED_FORWARD_0_75_X | 0 | 表示视频播放正常播速的0.75倍。 |
| SPEED_FORWARD_1_00_X | 1 | 表示视频播放正常播速。 |
| SPEED_FORWARD_1_25_X | 2 | 表示视频播放正常播速的1.25倍。 |
| SPEED_FORWARD_1_75_X | 3 | 表示视频播放正常播速的1.75倍。 |
| SPEED_FORWARD_2_00_X | 4 | 表示视频播放正常播速的2.00倍。 |
## VideoScaleType<sup>9+</sup>
枚举,视频缩放模式。
**系统能力:** SystemCapability.Multimedia.Media.VideoPlayer
| 名称 | 值 | 说明 |
| ---------------------------- | ------ | ---------- |
| VIDEO_SCALE_TYPE_FIT | 0 | 视频拉伸至与窗口等大。 |
| VIDEO_SCALE_TYPE_FIT_CROP| 1 | 保持视频宽高比拉伸至填满窗口,内容可能会有裁剪。 |
## MediaDescription<sup>8+</sup>
通过key-value方式获取媒体信息。
**系统能力:** SystemCapability.Multimedia.Media.Core
**示例:**
```js
import media from '@ohos.multimedia.media'
function printfItemDescription(obj, key) {
let property = obj[key];
console.info('audio key is ' + key); // 通过key值获取对应的value。key值具体可见[MediaDescriptionKey]
console.info('audio value is ' + property); //对应key值得value。其类型可为任意类型,具体key对应value的类型可参考[MediaDescriptionKey]
}
let audioPlayer = media.createAudioPlayer();
audioPlayer.getTrackDescription((error, arrList) => {
if (arrList != null) {
for (let i = 0; i < arrList.length; i++) {
printfItemDescription(arrList[i], media.MediaDescriptionKey.MD_KEY_TRACK_TYPE); //打印出每条轨道MD_KEY_TRACK_TYPE的值
}
} else {
console.log(`audio getTrackDescription fail, error:${error}`);
}
});
```
## AudioRecorder
> **说明:**
> AVRecorder<sup>9+</sup>发布后停止维护,请使用[AVRecorder](#avrecorder9)<sup>9+</sup>
音频录制管理类,用于录制音频媒体。在调用AudioRecorder的方法前,需要先通过[createAudioRecorder()](#mediacreateaudiorecorder) 构建一个[AudioRecorder](#audiorecorder)实例。
音频录制demo可参考:[音频录制开发指导](../../media/audio-recorder.md)
......@@ -1830,17 +4151,17 @@ audioRecorder.prepare(audioRecorderConfig); // prepar
**系统能力:** SystemCapability.Multimedia.Media.AudioRecorder
| 名称 | 类型 | 必填 | 说明 |
| --------------------- | --------------------------------------- | ---- | ------------------------------------------------------------ |
| audioEncoder<sup>(deprecated)</sup> | [AudioEncoder](#audioencoder) | 否 | 音频编码格式,默认设置为AAC_LC。<br/>**说明:** 从API Version 8 开始废弃,建议使用audioEncoderMime替代。 |
| audioEncodeBitRate | number | 否 | 音频编码比特率,默认值为48000。 |
| audioSampleRate | number | 否 | 音频采集采样率,默认值为48000。 |
| numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 |
| format<sup>(deprecated)</sup> | [AudioOutputFormat](#audiooutputformat) | 否 | 音频输出封装格式,默认设置为MPEG_4。<br/>**说明:** 从API Version 8 开始废弃,建议使用fileFormat替代。 |
| location | [Location](#location) | 否 | 音频采集的地理位置。 |
| uri | string | 是 | 音频输出URI:fd://xx&nbsp;(fd&nbsp;number)<br/>![](figures/zh-cn_image_url.png) <br/>文件需要由调用者创建,并赋予适当的权限。 |
| audioEncoderMime<sup>8+</sup> | [CodecMimeType](#codecmimetype8) | 否 | 音频编码格式。 |
| fileFormat<sup>8+</sup> | [ContainerFormatType](#containerformattype8) | 否 | 音频编码格式。 |
| 名称 | 类型 | 必填 | 说明 |
| ----------------------------------- | -------------------------------------------- | ---- | ------------------------------------------------------------ |
| audioEncoder<sup>(deprecated)</sup> | [AudioEncoder](#audioencoder) | 否 | 音频编码格式,默认设置为AAC_LC。<br/>**说明:** 从API Version 8 开始废弃,建议使用audioEncoderMime替代。 |
| audioEncodeBitRate | number | 否 | 音频编码比特率,默认值为48000。 |
| audioSampleRate | number | 否 | 音频采集采样率,默认值为48000。 |
| numberOfChannels | number | 否 | 音频采集声道数,默认值为2。 |
| format<sup>(deprecated)</sup> | [AudioOutputFormat](#audiooutputformat) | 否 | 音频输出封装格式,默认设置为MPEG_4。<br/>**说明:** 从API Version 8 开始废弃,建议使用fileFormat替代。 |
| location | [Location](#location) | 否 | 音频采集的地理位置。 |
| uri | string | 是 | 音频输出URI:fd://xx&nbsp;(fd&nbsp;number)<br/>![](figures/zh-cn_image_url.png) <br/>文件需要由调用者创建,并赋予适当的权限。 |
| audioEncoderMime<sup>8+</sup> | [CodecMimeType](#codecmimetype8) | 否 | 音频编码格式。 |
| fileFormat<sup>8+</sup> | [ContainerFormatType](#containerformattype8) | 否 | 音频编码格式。 |
## AudioEncoder<sup>(deprecated)</sup>
......@@ -1879,6 +4200,9 @@ audioRecorder.prepare(audioRecorderConfig); // prepar
## VideoRecorder<sup>9+</sup>
> **说明:**
> AVRecorder<sup>9+</sup>发布后停止维护,请使用[AVRecorder](#avrecorder9)<sup>9+</sup>
视频录制管理类,用于录制视频媒体。在调用VideoRecorder的方法前,需要先通过[createVideoRecorder()](#mediacreatevideorecorder9)构建一个[VideoRecorder](#videorecorder9)实例。
视频录制demo可参考:[视频录制开发指导](../../media/video-recorder.md)
......@@ -2647,32 +4971,6 @@ videoRecorder.on('error', (error) => { // 设
| location | [Location](#location) | 否 | 录制视频的地理位置。 |
| url | string | 是 | 视频输出URL:fd://xx&nbsp;(fd&nbsp;number)<br/>![](figures/zh-cn_image_url.png) |
## AudioSourceType<sup>9+</sup>
表示视频录制中音频源类型的枚举。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder
**系统接口:** 该接口为系统接口
| 名称 | 值 | 说明 |
| ------------------------- | ---- | ---------------------- |
| AUDIO_SOURCE_TYPE_DEFAULT | 0 | 默认的音频输入源类型。 |
| AUDIO_SOURCE_TYPE_MIC | 1 | 表示MIC的音频输入源。 |
## VideoSourceType<sup>9+</sup>
表示视频录制中视频源类型的枚举。
**系统能力:** SystemCapability.Multimedia.Media.VideoRecorder
**系统接口:** 该接口为系统接口
| 名称 | 值 | 说明 |
| ----------------------------- | ---- | ------------------------------- |
| VIDEO_SOURCE_TYPE_SURFACE_YUV | 0 | 输入surface中携带的是raw data。 |
| VIDEO_SOURCE_TYPE_SURFACE_ES | 1 | 输入surface中携带的是ES data。 |
## VideoRecorderProfile<sup>9+</sup>
视频录制的配置文件。
......@@ -2693,25 +4991,3 @@ videoRecorder.on('error', (error) => { // 设
| videoFrameWidth | number | 是 | 录制视频帧的宽。 |
| videoFrameHeight | number | 是 | 录制视频帧的高。 |
| videoFrameRate | number | 是 | 录制视频帧率。 |
## ContainerFormatType<sup>8+</sup>
表示容器格式类型的枚举,缩写为CFT。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 值 | 说明 |
| ----------- | ----- | --------------------- |
| CFT_MPEG_4 | 'mp4' | 视频的容器格式,MP4。 |
| CFT_MPEG_4A | 'm4a' | 音频的容器格式,M4A。 |
## Location
视频录制的地理位置。
**系统能力:** SystemCapability.Multimedia.Media.Core
| 名称 | 类型 | 必填 | 说明 |
| --------- | ------ | ---- | ---------------- |
| latitude | number | 是 | 地理位置的纬度。 |
| longitude | number | 是 | 地理位置的经度。 |
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册