当前位置:   article > 正文

OpenHarmony音频流管理开发_openharmony 音视频流转

openharmony 音视频流转

1、OpenHarmony音频流管理开发简介

        AudioStreamManager提供了音频流管理的方法。开发者可以通过本博文了解应用如何通过AudioStreamManager管理音频流。

 2、OpenHarmony音频流管理运作机制

        该模块提供了音频流管理调用关系图

  图1 音频流管理调用关系图

         说明:在进行应用开发的过程中,开发者需要使用getStreamManager()创建一个AudioStreamManager实例,进而通过该实例管理音频流。开发者可通过调用on('audioRendererChange')、on('audioCapturerChange')监听音频播放应用和音频录制应用,在应用状态变化、设备变化、音频属性变化时获得通知。同时可通过off('audioRendererChange')、off('audioCapturerChange')取消相关事件的监听。与此同时,开发者可以通过调用(可选)使用getCurrentAudioRendererInfoArray()获取当前音频播放应用的音频流唯一ID、音频播放客户端的UID、音频状态等信息,同理可调用getCurrentAudioCapturerInfoArray()获取音频录制应用的信息。

3、OpenHarmony音频流管理开发开发指导

        详细API含义可参考:音频管理API文档AudioStreamManager

(1).创建AudioStreamManager实例。

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

  1. var audioManager = audio.getAudioManager();
  2. var audioStreamManager = audioManager.getStreamManager();

(2).使用on('audioRendererChange')监听音频渲染器更改事件。 如果音频流监听应用需要在音频播放应用状态变化、设备变化、音频属性变化时获取通知,可以订阅该事件。更多事件请参考API参考文档

  1. audioStreamManager.on('audioRendererChange', (AudioRendererChangeInfoArray) => {
  2. for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
  3. AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
  4. console.info('## RendererChange on is called for ' + i + ' ##');
  5. console.info('StreamId for ' + i + ' is:' + AudioRendererChangeInfo.streamId);
  6. console.info('ClientUid for ' + i + ' is:' + AudioRendererChangeInfo.clientUid);
  7. console.info('Content for ' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.content);
  8. console.info('Stream for ' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.usage);
  9. console.info('Flag ' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.rendererFlags);
  10. console.info('State for ' + i + ' is:' + AudioRendererChangeInfo.rendererState);
  11. var devDescriptor = AudioRendererChangeInfo.deviceDescriptors;
  12. for (let j = 0; j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
  13. console.info('Id:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].id);
  14. console.info('Type:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].deviceType);
  15. console.info('Role:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].deviceRole);
  16. console.info('Name:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].name);
  17. console.info('Address:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].address);
  18. console.info('SampleRates:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]);
  19. console.info('ChannelCounts' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]);
  20. console.info('ChannelMask:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].channelMasks);
  21. }
  22. }
  23. });

(3).使用off('audioRendererChange')取消监听音频渲染器更改事件。

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

(4).使用on('audioCapturerChange')监听音频捕获器更改事件。 如果音频流监听应用需要在音频录制应用状态变化、设备变化、音频属性变化时获取通知,可以订阅该事件。更多事件请参考API参考文档

  1. audioStreamManager.on('audioCapturerChange', (AudioCapturerChangeInfoArray) => {
  2. for (let i = 0; i < AudioCapturerChangeInfoArray.length; i++) {
  3. console.info(' ## audioCapturerChange on is called for element ' + i + ' ##');
  4. console.info('StreamId for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].streamId);
  5. console.info('ClientUid for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].clientUid);
  6. console.info('Source for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerInfo.source);
  7. console.info('Flag ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerInfo.capturerFlags);
  8. console.info('State for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerState);
  9. for (let j = 0; j < AudioCapturerChangeInfoArray[i].deviceDescriptors.length; j++) {
  10. console.info('Id:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].id);
  11. console.info('Type:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceType);
  12. console.info('Role:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceRole);
  13. console.info('Name:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].name);
  14. console.info('Address:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].address);
  15. console.info('SampleRates:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].sampleRates[0]);
  16. console.info('ChannelCounts' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelCounts[0]);
  17. console.info('ChannelMask:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelMasks);
  18. }
  19. }
  20. });

(5).使用off('audioCapturerChange')取消监听音频捕获器更改事件。

  1. audioStreamManager.off('audioCapturerChange');
  2. console.info('######### CapturerChange Off is called #########');

(6).使用getCurrentAudioRendererInfoArray()获取当前音频渲染器的信息。 该接口可获取音频流唯一ID,音频播放客户端的UID,音频状态以及音频播放器的其他信息。需注意的是若对第三方音频流监听应用未配置ohos.permission.USE_BLUETOOTH权限,则查询到的设备名称和设备地址为空字符串,若正确配置权限,则显示的实际的设备名称和设备地址信息。

  1. await audioStreamManager.getCurrentAudioRendererInfoArray().then( function (AudioRendererChangeInfoArray) {
  2. console.info('######### Get Promise is called ##########');
  3. if (AudioRendererChangeInfoArray != null) {
  4. for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
  5. AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
  6. console.info('StreamId for ' + i +' is:' + AudioRendererChangeInfo.streamId);
  7. console.info('ClientUid for ' + i + ' is:' + AudioRendererChangeInfo.clientUid);
  8. console.info('Content ' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.content);
  9. console.info('Stream' + i +' is:' + AudioRendererChangeInfo.rendererInfo.usage);
  10. console.info('Flag' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.rendererFlags);
  11. console.info('State for ' + i + ' is:' + AudioRendererChangeInfo.rendererState);
  12. var devDescriptor = AudioRendererChangeInfo.deviceDescriptors;
  13. for (let j = 0; j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
  14. console.info('Id:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].id);
  15. console.info('Type:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].deviceType);
  16. console.info('Role:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].deviceRole);
  17. console.info('Name:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].name);
  18. console.info('Address:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].address);
  19. console.info('SampleRates:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]);
  20. console.info('ChannelCounts' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]);
  21. console.info('ChannelMask:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].channelMasks);
  22. }
  23. }
  24. }
  25. }).catch((err) => {
  26. console.log('getCurrentAudioRendererInfoArray :ERROR: ' + err.message);
  27. });

(7).使用getCurrentAudioCapturerInfoArray()获取当前音频捕获器的信息。 该接口可获取音频流唯一ID,音频录制客户端的UID,音频状态以及音频捕获器的其他信息。需注意的是若对第三方音频流监听应用未配置ohos.permission.USE_BLUETOOTH权限,则查询到的设备名称和设备地址为空字符串,若正确配置权限,则显示的实际的设备名称和设备地址信息。

  1. await audioStreamManager.getCurrentAudioCapturerInfoArray().then( function (AudioCapturerChangeInfoArray) {
  2. console.info('getCurrentAudioCapturerInfoArray: **** Get Promise Called ****');
  3. if (AudioCapturerChangeInfoArray != null) {
  4. for (let i = 0; i < AudioCapturerChangeInfoArray.length; i++) {
  5. console.info('StreamId for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].streamId);
  6. console.info('ClientUid for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].clientUid);
  7. console.info('Source for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerInfo.source);
  8. console.info('Flag ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerInfo.capturerFlags);
  9. console.info('State for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerState);
  10. var devDescriptor = AudioCapturerChangeInfoArray[i].deviceDescriptors;
  11. for (let j = 0; j < AudioCapturerChangeInfoArray[i].deviceDescriptors.length; j++) {
  12. console.info('Id:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].id);
  13. console.info('Type:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceType);
  14. console.info('Role:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceRole);
  15. console.info('Name:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].name)
  16. console.info('Address:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].address);
  17. console.info('SampleRates:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].sampleRates[0]);
  18. console.info('ChannelCounts' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelCounts[0]);
  19. console.info('ChannelMask:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelMasks);
  20. }
  21. }
  22. }
  23. }).catch((err) => {
  24. console.log('getCurrentAudioCapturerInfoArray :ERROR: ' + err.message);
  25. });

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/329312?site
推荐阅读
相关标签
  

闽ICP备14008679号