鸿蒙音视频开发初体验
首先是音频初始化,新建一个AudioRender.ArkTs文件,然后创建AudioStreamInfo和AudioRendererOptions对象
//streamInfo
static audioStreamInfo: audio.AudioStreamInfo = {
//频道
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
//单声道
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
}
//renderInfo
static audioRenderInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_VOICE_ASSISTANT,
rendererFlags: 0
}
创建AudioRendererOptions对象
static audioRenderOptions: audio.AudioRendererOptions = {
streamInfo: AudioRender.audioStreamInfo,
rendererInfo: AudioRender.audioRenderInfo
}
再写一个初始化的方法
static async init() {
AudioRender.renderModel = await audio.createAudioRenderer(AudioRender.audioRenderOptions)
AudioRender.renderModel.on('writeData', (buffer: ArrayBuffer) => {
//校验文件是否存在
if (AudioRender.renderFile) {
//播放逻辑
fileIo.readSync(AudioRender.renderFile.fd, buffer, {
offset: AudioRender.renderSize,
length: buffer.byteLength
})
//更新已经渲染的尺寸
AudioRender.renderSize += buffer.byteLength
}
//自己判断是否结束
if (AudioRender.renderSize >= AudioRender.maxSize) {
//停止读取文件
fileIo.closeSync(AudioRender.renderFile.fd)
//停止播放文件
AudioRender.stop()
}
})
}
下来就是定义几个静态方法如开始录音、停止录音、和释放资源
//开始播放
static async start(filePath: string, callback1?: () => void, callback2?: () => void) {
//每次播放前必须清空上一次的
AudioRender.stop()
//文件读取
AudioRender.renderFile = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE)
//通过文件获取最大size
AudioRender.maxSize = fileIo.statSync(AudioRender.renderFile.fd).size
callback1 && callback1()
if (callback2) {
AudioRender.callBack = callback2
}
AudioRender.renderModel.start()
}
//停止播放
static async stop() {
//校验一下是否是第一次播放 遵循状态机,只有runing的时候才可以
if (AudioRender.renderModel && AudioRender.renderModel.state === audio.AudioState.STATE_RUNNING) {
await AudioRender.renderModel.stop()
AudioRender.callBack && AudioRender.callBack()
// //释放资源
// await AudioRender.renderModel.release()
//重置变量值
AudioRender.renderSize = 0
AudioRender.maxSize = 0
}
}
这里是需要定义的几个变量
//要进行播放的文件
static renderFile: fileIo.File
//播放文件的大小
static maxSize: number = 0
//已经播放的大小
static renderSize: number = 0
//结束回调函数
static callBack: () => void
//播放器
static renderModel: audio.AudioRenderer
整体代码在这里
import { audio } from '@kit.AudioKit'
import { fileIo } from '@kit.CoreFileKit'
export class AudioRender {
//播放器
static renderModel: audio.AudioRenderer
//streamInfo
static audioStreamInfo: audio.AudioStreamInfo = {
//频道
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
//单声道
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
}
//renderInfo
static audioRenderInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_VOICE_ASSISTANT,
rendererFlags: 0
}
static audioRenderOptions: audio.AudioRendererOptions = {
streamInfo: AudioRender.audioStreamInfo,
rendererInfo: AudioRender.audioRenderInfo
}
//要进行播放的文件
static renderFile: fileIo.File
//播放文件的大小
static maxSize: number = 0
//已经播放的大小
static renderSize: number = 0
//结束回调函数
static callBack: () => void
//监听
static async init() {
AudioRender.renderModel = await audio.createAudioRenderer(AudioRender.audioRenderOptions)
AudioRender.renderModel.on('writeData', (buffer: ArrayBuffer) => {
//校验文件是否存在
if (AudioRender.renderFile) {
//播放逻辑
fileIo.readSync(AudioRender.renderFile.fd, buffer, {
offset: AudioRender.renderSize,
length: buffer.byteLength
})
//更新已经渲染的尺寸
AudioRender.renderSize += buffer.byteLength
}
//自己判断是否结束
if (AudioRender.renderSize >= AudioRender.maxSize) {
//停止读取文件
fileIo.closeSync(AudioRender.renderFile.fd)
//停止播放文件
AudioRender.stop()
}
})
}
//开始播放
static async start(filePath: string, callback1?: () => void, callback2?: () => void) {
//每次播放前必须清空上一次的
AudioRender.stop()
//文件读取
AudioRender.renderFile = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE)
//通过文件获取最大size
AudioRender.maxSize = fileIo.statSync(AudioRender.renderFile.fd).size
callback1 && callback1()
if (callback2) {
AudioRender.callBack = callback2
}
AudioRender.renderModel.start()
}
//停止播放
static async stop() {
//校验一下是否是第一次播放 遵循状态机,只有runing的时候才可以
if (AudioRender.renderModel && AudioRender.renderModel.state === audio.AudioState.STATE_RUNNING) {
await AudioRender.renderModel.stop()
AudioRender.callBack && AudioRender.callBack()
// //释放资源
// await AudioRender.renderModel.release()
//重置变量值
AudioRender.renderSize = 0
AudioRender.maxSize = 0
}
}
}
然后就可以在页面中使用,记得写在aboutToAppear()中进行初始化操作然后就可以正常使用了