鸿蒙系统中,如何管理音频播放的音量和焦点?

我正在开发一个鸿蒙应用,其中涉及到音频播放功能。请问在鸿蒙系统中,如何控制音频播放的音量?
如何管理音频焦点,以确保多个音频播放任务不会相互干扰?
是否有现成的API可以用来设置音量和获取/设置音频焦点?

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 31
avatarAI BotBETA

在鸿蒙系统中,如何管理音频播放的音量和焦点?

控制音频播放的音量

在鸿蒙系统中,控制音频播放的音量主要通过AudioVolumeManager接口来实现。但请注意,应用无法直接调节系统音量,只能获取音量信息及监听音量变化,音量调节通常通过系统音量面板来完成。以下是一些关键步骤:

  • 获取AudioVolumeManager实例

    import audio from '@kit.AudioKit';
    let audioManager = audio.getAudioManager();
    let audioVolumeManager = audioManager.getVolumeManager();
  • 监听系统音量变化

    audioVolumeManager.on('volumeChange', (volumeEvent: audio.VolumeEvent) => {
      console.info(`VolumeType of stream:${volumeEvent.volumeType}`);
      console.info(`Volume level:${volumeEvent.volume}`);
      console.info(`Whether to updateUI:${volumeEvent.updateUi}`);
    });
  • 管理音频流音量
    对于音频流音量的管理,可以使用AVPlayerAudioRenderersetVolume()方法。例如,使用AVPlayer设置音频流音量的示例代码如下:

    let volume = 1.0; // 指定的音量大小,取值范围为[0.00-1.00],1表示最大音量
    avPlayer.setVolume(volume);

    使用AudioRenderer设置音频流音量的示例代码如下:

    import { BusinessError } from '@kit.BasicServicesKit';
    audioRenderer.setVolume(0.5).then(() => {
      console.info('Invoke setVolume succeeded.');
    }).catch((err: BusinessError) => {
      console.error(`Invoke setVolume failed, code is ${err.code}, message is ${err.message}`);
    });

管理音频焦点

在鸿蒙系统中,管理音频焦点以确保多个音频播放任务不会相互干扰,主要通过AudioManagerAudioRenderer接口来实现。以下是一些关键步骤:

  • 请求音频焦点
    在开始播放音频之前,请求获取音频焦点。例如,使用AudioManager请求音频焦点的示例代码如下:

    AudioManager audioManager;
    AudioInterruptCallback callback = {
      .onInterrupt = [](const InterruptEvent& event) {
        // 处理音频中断事件
      },
      .onRestore = []() {
        // 恢复音频
      }
    };
    AudioAttributes attributes;
    attributes.streamUsage = STREAM_USAGE_MEDIA;
    attributes.contentType = CONTENT_TYPE_MUSIC;
    if (audioManager.RequestAudioFocus(attributes, AUDIOFOCUS_GAIN, callback) != AUDIO_MANAGER_SUCCESS) {
      // 处理请求失败的情况
    }

    使用AudioRenderer请求音频焦点的示例(TypeScript):

    import audio from '@ohos.multimedia.audio';
    let audioRenderer = audio.createAudioRenderer();
    audioRenderer.requestAudioFocus();
  • 处理音频焦点变化
    监听音频焦点变化事件,并根据不同的焦点状态调整音频播放行为。例如,当音频焦点丢失时暂停播放,当重新获得音频焦点时恢复播放。使用AudioManager的示例代码如下:

    class MyAudioFocusListener : public AudioManager::AudioFocusListener {
    public:
      void OnFocusChange(int32_t focusType) {
        switch (focusType) {
          case AUDIOFOCUS_GAIN:
            std::cout << "Gained audio focus\n";
            // 恢复音频播放
            break;
          case AUDIOFOCUS_LOSS:
            std::cout << "Lost audio focus\n";
            // 暂停音频播放
            break;
          case AUDIOFOCUS_LOSS_TRANSIENT:
            std::cout << "Temporarily lost audio focus\n";
            // 暂时暂停音频播放
            break;
          case AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
            std::cout << "Temporarily lost audio focus but allowed to play at lower volume\n";
            // 降低音量
            break;
        }
      }
    };
    
    void InitializeAudio() {
      AudioManager audioManager;
      auto listener = std::make_shared<MyAudioFocusListener>();
      audioManager.AddAudioFocusListener(listener);
      AudioAttributes attributes;
      attributes.streamUsage = STREAM_USAGE_MEDIA;
      attributes.contentType = CONTENT_TYPE_MUSIC;
      int result = audioManager.RequestAudioFocus(attributes, AUDIOFOCUS_GAIN);
      if (result != AUDIO_MANAGER_SUCCESS) {
        std::cerr << "Failed to request audio focus\n";
      }
    }

    使用AudioRenderer的示例(TypeScript):

    audioRenderer.on('audioFocusChange', (focusChange) => {
      // 处理音频焦点变化
    });
  • 释放音频焦点
    音频播放结束或不再需要时,释放音频焦点。例如,使用AudioManager释放音频焦点的示例代码如下:

    void ReleaseAudioFocus() {
      AudioManager audioManager;
      AudioAttributes attributes;
      attributes.streamUsage = STREAM_USAGE_MEDIA;
      attributes.contentType = CONTENT_TYPE_MUSIC;
      if (audioManager.AbandonAudioFocus(attributes) != AUDIO_MANAGER_SUCCESS) {
        // 处理释放音频焦点失败的情况
      }
    }

    使用AudioRenderer释放音频焦点的示例(TypeScript):

    audioRenderer.abandonAudioFocus();

是否有现成的API可以用来设置音量和获取/设置音频焦点?

是的,鸿蒙系统提供了现成的API来设置音量和获取/设置音频焦点。对于音量管理,可以使用AudioVolumeManager接口;对于音频焦点管理,可以使用AudioManagerAudioRenderer接口。这些API提供了简单易用的接口,使得开发者能够轻松地在鸿蒙应用中实现音频播放的音量和焦点管理。

1 个回答

据我所知,在鸿蒙系统中,你可以使用AVPlayer类来管理音频播放的音量和焦点。以下是一个示例代码,展示了如何设置音量和处理音频焦点变化:

import { media } from '@kit.MediaKit';

// 创建AVPlayer实例
let avPlayer = await media.createAVPlayer();

// 设置音频焦点模式
avPlayer.audioInterruptMode = media.audio.InterruptMode.SHARE_MODE;

// 设置音量
avPlayer.setVolume(0.5); // 将音量设置为50%

// 监听音量变化事件
avPlayer.on('volumeChange', (newVolume) => {
    console.log('Volume changed to:', newVolume);
});

// 监听音频焦点变化事件
avPlayer.on('audioInterrupt', (info) => {
    console.log('Audio interrupt info:', info);
    // 根据info.type处理音频焦点变化,例如暂停或恢复播放
});

// 播放音频(假设音频源已设置)
await avPlayer.prepare();
await avPlayer.play();

// 停止播放并释放资源
await avPlayer.stop();
await avPlayer.release();

在这个示例中,你可以通过audioInterruptMode属性设置音频焦点模式,使用setVolume()方法设置音量,并通过监听volumeChange和audioInterrupt事件来处理音量变化和音频焦点变化。播放和停止音频时,你需要先调用prepare()方法准备播放,然后使用play()和stop()方法控制播放状态,最后使用release()方法释放资源。

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

logo
HarmonyOS
子站问答
访问
宣传栏