鸿蒙(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 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

相关推荐
冯志浩1 小时前
Harmony NEXT:如何给数据库添加自定义分词
harmonyos·掘金·金石计划
爱桥代码的程序媛3 小时前
鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之瑞芯微RK3568移植案例
嵌入式硬件·harmonyos·鸿蒙·鸿蒙系统·移植·openharmony·鸿蒙开发
AORO_BEIDOU3 小时前
防爆手机+鸿蒙系统,遨游通讯筑牢工业安全基石
5g·安全·智能手机·信息与通信·harmonyos
青柠视频云4 小时前
青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
服务器·网络·音视频
华清远见IT开放实验室8 小时前
【项目案例】物联网比较好的10+练手项目推荐,附项目文档/源码/视频
物联网·音视频
逢生博客15 小时前
Mac 搭建仓颉语言开发环境(Cangjie SDK)
macos·华为·鸿蒙
小强在此18 小时前
【基于开源鸿蒙(OpenHarmony)的智慧农业综合应用系统】
华为·开源·团队开发·智慧农业·harmonyos·开源鸿蒙
小东来20 小时前
电脑端视频剪辑软件哪个好用,十多款剪辑软件分享
音视频
PlumCarefree1 天前
基于鸿蒙API10的RTSP播放器(四:沉浸式播放窗口)
华为·harmonyos