Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?

我们在做Android平台RTMP推送和GB28181设备对接的时候,遇到这样的问题,有的设备,麦克风采集出来的audio,音量过高或过低,特别是有些设备,采集到的麦克风声音过低,导致播放端听不清前端采集的audio,这时候,就需要针对采集到的audio,做音量放大处理。

先说如何采集,android平台通用的做法是采集audiorecord,设置audio的采样率和channels,为了便于数据进行二次处理,或者同时投递给多个实例,我们的做法,是把采集到的audio,回调上来,然后再设置到jni层:

java 复制代码
void CheckInitAudioRecorder() {
  if (audioRecord_ == null) {
    audioRecord_ = new NTAudioRecordV2(this);
  }

  if (audioRecord_ != null) {
    Log.i(TAG, "CheckInitAudioRecorder call audioRecord_.start()+++...");

    audioRecordCallback_ = new NTAudioRecordV2CallbackImpl();

    audioRecord_.AddCallback(audioRecordCallback_);

    audioRecord_.Start(16000, 1);

    Log.i(TAG, "CheckInitAudioRecorder call audioRecord_.start()---...");
  }
}

audio回调处理:

java 复制代码
class NTAudioRecordV2CallbackImpl implements NTAudioRecordV2Callback {
  @Override
  public void onNTAudioRecordV2Frame(ByteBuffer data, int size, int sampleRate, int channel, int per_channel_sample_number) {

    if ((isPushingRtmp || isRTSPPublisherRunning) && publisherHandle != 0) {
      libPublisher.SmartPublisherOnPCMData(publisherHandle, data, size, sampleRate, channel, per_channel_sample_number);
    }
  }
}

如何实现audio音量放大?

输入音量的调节,需要注意的是,处理音频音量时要尽可能线性,以防止溢出。我们针对jni层的设计如下:

java 复制代码
/**
	 * 设置输入音量, 这个接口一般不建议调用, 在一些特殊情况下可能会用, 一般不建议放大音量
	 *
	 * @param index: 一般是0和1, 如果没有混音的只用0, 有混音的话, 0,1分别设置音量
	 *
	 * @param volume: 音量,默认是1.0,范围是[0.0, 5.0], 设置成0静音, 1音量不变
	 *
	 * @return {0} if successful
	 */
	public native int SmartPublisherSetInputAudioVolume(long handle, int index, float volume);

调用逻辑如下:

java 复制代码
in_audio_volume_selector_ = (Spinner) findViewById(R.id.in_audio_volume_selector);

        final String[] in_audio_volume_sel = new String[]{"0", "0.2", "0.5", "0.8", "1", "1.5", "2", "2.5", "3", "3.5", "4", "4.5", "5"};
        ArrayAdapter<String> adapter_in_audio_volume = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, in_audio_volume_sel);

        adapter_in_audio_volume.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        in_audio_volume_selector_.setAdapter(adapter_in_audio_volume);

        in_audio_volume_selector_.setSelection(4, true);

        in_audio_volume_selector_.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                Log.i(TAG, "Currently audio volume choosing: " + in_audio_volume_sel[position]);

                in_audio_volume_ = Float.parseFloat(in_audio_volume_sel[position]);

                Log.i(TAG, "Choose audio volume=" + in_audio_volume_);

                if (isPushingRtmp || isRTSPPublisherRunning) {
                    if (libPublisher != null && publisherHandle != 0) {
                        libPublisher.SmartPublisherSetInputAudioVolume(publisherHandle, 0, in_audio_volume_);
                    }
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

感兴趣的开发者,可以参考实现,需要注意的是,audio采集可能不限于麦克风,也可能是第三方数据采集源,所以接口设计的时候,尽量考虑在jni层针对数据源做处理,此外,除了音量放大外,还可以做音量缩小,或者实时静音。

相关推荐
音视频牛哥1 小时前
RTMP协议在无人机巡检中的应用场景
无人机·大牛直播sdk·rtsp播放器·rtmp播放器·无人机巡检·无人机播放rtsp·无人机播放rtmp
音视频牛哥2 天前
音视频直播应用场景探讨之RTMP推流还是GB28181接入?
大牛直播sdk·rtmp推流·gb28181客户端·gb28181规范·gb28181接入·rtmp推送摄像头·rtmp同屏
音视频牛哥4 天前
GB28181在融合指挥调度系统应用方案探究和技术实现
实时音视频·大牛直播sdk·gb28181安卓端·gb28181平台·gb28181客户端·gb28181设备·gb28181融合调度
音视频牛哥10 天前
Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?
android·大牛直播sdk·rtsp回调yuv·rtmp回调rgb·rtsp播放器回调rgb·rtmp播放器回调yuv·android rtsp播放器
音视频牛哥12 天前
RTMP播放器延迟最低可以做到多少?
音视频·大牛直播sdk·rtmp播放器·linux rtmp播放器·windows rtmp播放器·android rtmp播放器·ios rtmp播放器
音视频牛哥12 天前
Android终端如何快速接入GB28181平台实现实时音视频回传
大牛直播sdk·gb28181安卓端·gb28181 android·gb28181平台·gb28181对接·gb28181记录仪·gb28181-2022对接
音视频牛哥13 天前
Linux平台屏幕|摄像头采集并实现RTMP推送两种技术方案探究
大牛直播sdk·linux rtmp推流·linux rtmp推送·linux采集屏幕同屏·linux采集摄像头rtmp·linux无纸化同屏·linux arm rtmp
音视频牛哥24 天前
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
大牛直播sdk·linux rtmp推流·linux同屏·linux采集屏幕推流·linux无纸化·linux arm64同屏·linux摄像头rtmp
音视频牛哥1 个月前
Windows平台RTSP|RTMP播放器如何实现实时录像功能
大牛直播sdk·rtsp播放器·rtmp播放器·rtsp录像·rtmp录像·rtsp播放器录像·rtmp播放器录像
音视频牛哥1 个月前
Windows平台RTSP|RTMP播放器如何实时调节音量
大牛直播sdk·播放器·rtsp播放器·rtmp播放器·rtsp player·rtmp player·windows rtsp播放器