输入关键词搜索,支持 AI 答疑

音频后处理

更新时间: 2024/08/23 10:24:52

本章节主要介绍音视频SDK提供的各种音频后处理功能。后处理主要指的收到远端音频数据后的处理,主要分为单个远端用户PCM音频数据及播放前的PCM音频数据。目前音频后处理只提供简单的数据回调回调功能,暂不支持修改数据的功能。

音频后处理

单个用户PCM音频数据

  • API 介绍

如果用户期望获取某一个远端用户的PCM音频数据,可以通过 registerRemoteAudioCallBack注册相应的监听器。

  • API 原型
java   /**
     * 注册远端用户 pcm 音频数据回调
     *
     * @param account  远端用户account ,用户离开SDK会自动取消注册
     * @param callback 监听器 ,填 null 表示取消之前的注册的
     * @return 是否注册成功
     */
    public abstract boolean registerRemoteAudioCallBack(String account, IAVChatRemoteAudioCallBack callback);
  • 参数说明
参数 说明
account 期望监听的远端用户accid
callback 远端数据回调,多个用户可以共用一个callback ,null 表示反注册
javapublic interface IAVChatRemoteAudioCallBack {
    /**
     * 远端用户 pcm 音频回调
     * 注意 :此回调是同步回调,并且数据只能读不能修改,一定要先拷贝有效数据( 回调结束后,原始的AudioFrame可能会被SDK复用修改 ),再投递到子线程去<br/> *
     * @param account    用户account
     * @param audioFrame 音频数据
     */
    void onAudioFrame(String account, AudioFrame audioFrame);
}

  • 参数说明
参数 说明
account 期望监听的远端用户accid
audioFrame 音频PCM 数据
  • 注意 onAudioFrame 是同步回调,并且数据只能读不能修改,一定要先拷贝有效数据( 回调结束后,原始的AudioFrame可能会被SDK复用修改 ),再投递到子线程去。参考以下代码:
javaint len = audioFrame.getChannels() * audioFrame.getSamplesPerChannel() * audioFrame.getBytesPerSample();
byte[] bytes = new byte[len];
audioFrame.getData().get(bytes, 0, len);
backgroundHandler.post(new Runnable() {
            @Override
            public void run() {
                    outputStream.write(bytes)
                    }
                });
     };
  • 示例
java// IAVChatRemoteAudioCallBack
IAVChatRemoteAudioCallBack callBack = new IAVChatRemoteAudioCallBack(){

 public void onAudioFrame(String account, AudioFrame audioFrame) {
 int len = audioFrame.getChannels() * audioFrame.getSamplesPerChannel() * audioFrame.getBytesPerSample();
 byte[] bytes = new byte[len];
 audioFrame.getData().get(bytes, 0, len);
 backgroundHandler.post(new Runnable() {
            @Override
            public void run() {
                    outputStream.write(bytes)
                    }
                });
     }
    }
};
// 注册监听器
AVChatManager.getInstance().registerRemoteAudioCallBack(account, callBack);

//使用完了,反注册监听器
AVChatManager.getInstance().registerRemoteAudioCallBack(account, null);

播放PCM音频数据回调

如果用户期望获取播放前的PCM音频数据,可以通过 registerPlayAudioCallBack注册相应的监听器。

  • API 原型
java    /**
     * 注册播放前 pcm 音频数据回调
     *
     * @param callback 监听器 ,填 null 表示取消之前的注册的
     *                 说明:如果用户需要特定的采集率但又不想自己重采样,可以修改{@link AVChatParameters#KEY_AUDIO_PLAYBACK_DEFAULT_SAMPLE_RATE}
     * @return 是否注册成功
     */
    public abstract boolean registerPlayAudioCallBack(IAVChatPlayAudioCallBack callback);

  • 参数说明
参数 说明
callback 播放前视频数据回调 , null 为取消监听
javapublic interface IAVChatPlayAudioCallBack {

    /**
     * 播放前 pcm 音频数据回调<br/>
     * 注意 :此回调是同步回调,并且数据只能读不能修改,一定要先拷贝有效数据( 回调结束后,原始的AudioFrame可能会被SDK复用修改 ),再投递到子线程去<br/>
     * @param audioFrame 音频数据
     * @return true : 保留原始数据,继续播放 , false :丢弃原始数据,不再播放
     */
    boolean onPlayAudioFrame(AudioFrame audioFrame);
}

  • 参数说明
参数 说明
audioFrame 音频PCM 数据
  • 注意 onPlayAudioFrame同步回调,并且数据只能读不能修改,一定要先拷贝有效数据( 回调结束后,原始的AudioFrame可能会被SDK复用修改 ),再投递到子线程去,参考以下代码 :
javaint len = audioFrame.getChannels() * audioFrame.getSamplesPerChannel() * audioFrame.getBytesPerSample();
byte[] bytes = new byte[len];
audioFrame.getData().get(bytes, 0, len);
backgroundHandler.post(new Runnable() {
          @Override
          public void run() {
                 outputStream.write(bytes)
                   }
               });
  };
  • 示例
java
// IAVChatPlayAudioCallBack
IAVChatPlayAudioCallBack callBack = new IAVChatPlayAudioCallBack(){
  
  public boolean onPlayAudioFrame(AudioFrame audioFrame) {
  int len = audioFrame.getChannels() * audioFrame.getSamplesPerChannel() * audioFrame.getBytesPerSample();
  byte[] bytes = new byte[len];
  audioFrame.getData().get(bytes, 0, len);
  backgroundHandler.post(new Runnable() {
          @Override
          public void run() {
                 outputStream.write(bytes)
                   }
               });
       };
    return true;
}

// 注册
AVChatManager.getInstance().registerPlayAudioCallBack(callBack);

//使用完了,取消注册
AVChatManager.getInstance().registerPlayAudioCallBack(null);
此文档是否对你有帮助?
有帮助
去反馈
  • 音频后处理
  • 单个用户PCM音频数据
  • 播放PCM音频数据回调