鸿蒙(API 12 Beta2版)媒体开发【音频播放流管理】

对于播放音频类的应用,开发者需要关注该应用的音频流的状态以做出相应的操作,比如监听到状态为播放中/暂停时,及时改变播放按钮的UI显示。

读取或监听应用内音频流状态变化

参考[使用AudioRenderer开发音频播放功能]或[audio.createAudioRenderer],完成AudioRenderer的创建,然后可以通过以下两种方式查看音频流状态的变化:

  • 方法1:直接查看AudioRenderer的[state]:

    import { audio } from '@kit.AudioKit';

    let audioRendererState: audio.AudioState = audioRenderer.state;
    console.info(Current state is: ${audioRendererState })

  • 方法2:注册stateChange监听AudioRenderer的状态变化:

    import { audio } from '@kit.AudioKit';

    audioRenderer.on('stateChange', (rendererState: audio.AudioState) => {
    console.info(State change to: ${rendererState})
    });

获取state后可对照[AudioState]来进行相应的操作,比如更改暂停播放按钮的显示等。

读取或监听所有音频流的变化

如果部分应用需要查询获取所有音频流的变化信息,可以通过AudioStreamManager读取或监听所有音频流的变化。

如下为音频流管理调用关系图:

在进行应用开发的过程中,开发者需要使用getStreamManager()创建一个AudioStreamManager实例,进而通过该实例管理音频流。开发者可通过调用on('audioRendererChange')监听音频流的变化,在音频流状态变化、设备变化时获得通知。同时可通过off('audioRendererChange')取消相关事件的监听。另外,开发者可以主动调用getCurrentAudioRendererInfoArray()来查询播放流的唯一ID、播放流客户端的UID、音频流状态等信息。

开发步骤及注意事项

  1. 创建AudioStreamManager实例。

    在使用AudioStreamManager的API前,需要使用getStreamManager()创建一个AudioStreamManager实例。

    import { audio } from '@kit.AudioKit';

    let audioManager = audio.getAudioManager();
    let audioStreamManager = audioManager.getStreamManager();

  2. 使用on('audioRendererChange')监听音频播放流的变化。 如果音频流监听应用需要在音频播放流状态变化、设备变化时获取通知,可以订阅该事件。

    import { audio } from '@kit.AudioKit';

    audioStreamManager.on('audioRendererChange', (AudioRendererChangeInfoArray: audio.AudioRendererChangeInfoArray) => {
    for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
    let AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
    console.info(## RendererChange on is called for ${i} ##);
    console.info(StreamId for ${i} is: ${AudioRendererChangeInfo.streamId});
    console.info(Content ${i} is: ${AudioRendererChangeInfo.rendererInfo.content});
    console.info(Stream ${i} is: ${AudioRendererChangeInfo.rendererInfo.usage});
    console.info(Flag ${i} is: ${AudioRendererChangeInfo.rendererInfo.rendererFlags});
    for (let j = 0;j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
    console.info(Id: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].id});
    console.info(Type: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceType});
    console.info(Role: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceRole});
    console.info(Name: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].name});
    console.info(Address: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].address});
    console.info(SampleRates: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]});
    console.info(ChannelCount ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]});
    console.info(ChannelMask: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelMasks});
    }
    }
    });

  3. (可选)使用off('audioRendererChange')取消监听音频播放流变化。

    audioStreamManager.off('audioRendererChange');
    console.info('RendererChange Off is called ');

  4. (可选)使用getCurrentAudioRendererInfoArray()获取所有音频播放流的信息。

    该接口可获取音频播放流唯一ID、音频播放客户端的UID、音频状态以及音频播放器的其他信息。

    说明

    对所有音频流状态进行监听的应用需要[声明权限]ohos.permission.USE_BLUETOOTH,否则无法获得实际的设备名称和设备地址信息,查询到的设备名称和设备地址(蓝牙设备的相关属性)将为空字符串。

    import { audio } from '@kit.AudioKit';
    import { BusinessError } from '@kit.BasicServicesKit';

    async function getCurrentAudioRendererInfoArray(): Promise<void> {
    await audioStreamManager.getCurrentAudioRendererInfoArray().then((AudioRendererChangeInfoArray: audio.AudioRendererChangeInfoArray) => {
    console.info(getCurrentAudioRendererInfoArray Get Promise is called );
    if (AudioRendererChangeInfoArray != null) {
    for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
    let AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
    console.info(StreamId for ${i} is: ${AudioRendererChangeInfo.streamId});
    console.info(Content ${i} is: ${AudioRendererChangeInfo.rendererInfo.content});
    console.info(Stream ${i} is: ${AudioRendererChangeInfo.rendererInfo.usage});
    console.info(Flag ${i} is: ${AudioRendererChangeInfo.rendererInfo.rendererFlags});
    for (let j = 0;j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
    console.info(Id: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].id});
    console.info(Type: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceType});
    console.info(Role: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceRole});
    console.info(Name: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].name});
    console.info(Address: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].address});
    console.info(SampleRates: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]});
    console.info(ChannelCount ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]});
    console.info(ChannelMask: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelMasks});
    }
    }
    }
    }).catch((err: BusinessError ) => {
    console.error(Invoke getCurrentAudioRendererInfoArray failed, code is ${err.code}, message is ${err.message});
    });
    }

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档 》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

总结

鸿蒙---作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

相关推荐
修己xj15 小时前
三月,我只想做好这四件事
程序员
不要秃头啊21 小时前
别再谈提效了:AI 时代的开发范式本质变了
前端·后端·程序员
jonjia1 天前
引入新维度化解权衡难题
程序员
jonjia1 天前
优秀的工程师如何打破规则
程序员
jonjia1 天前
在大厂交付大型项目的策略
程序员
jonjia1 天前
RFC 与设计文档
程序员
jonjia1 天前
为什么你(或任何人)应该成为一名研发经理?
程序员
jonjia1 天前
管理技术质量 (Manage Technical Quality)
程序员
jonjia1 天前
大厂软件工程师职业发展路径
程序员