在 Android 应用程序中录音时如何删除音频效果(增益、降噪等)

问题描述 投票:0回答:1

在 FMX Delphi 11 中,我正在录制音频来处理它。

这是代码片段:

  FChannelConfig:= TJAudioFormat.JavaClass.CHANNEL_IN_STEREO;
  FAudioFormat  := TJAudioFormat.JavaClass.ENCODING_PCM_16BIT;
  FTailleBufferBytes := TJAudioRecord.JavaClass.getMinBufferSize(FSampleRate, FChannelConfig, FAudioFormat); 

  // VOICE_RECOGNITION
  AUDIO_SOURCE:= TJMediaRecorder_AudioSource.JavaClass.VOICE_RECOGNITION ;

  //UNPROCESSED Added in API 24
  if (TJBuild_VERSION.JavaClass.SDK_INT >= 24) then
  begin
    FAudioManager:= TJAudioManager.Wrap((TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.AUDIO_SERVICE) as ILocalObject).GetObjectID);
    AudioMngrProp:= FAudioManager.getProperty(TJAudioManager.JavaClass.PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED) ;
    if (Boolean.Parse(JStringToString(AudioMngrProp))) then
    begin
      AUDIO_SOURCE:= TJMediaRecorder_AudioSource.JavaClass.UNPROCESSED ;
    end;
  end;

  // Init FAudioRecord
  FAudioRecord := TJAudioRecord.JavaClass.init(AUDIO_SOURCE, FSampleRate, FChannelConfig, FAudioFormat, FTailleBufferBytes);

  // Start recording
  (FAudioRecord As JAudioRecord).StartRecording;

在某些 Android 设备中,我在不同方面遇到了糟糕的电平:高 10 倍,低 4 倍,低频时电平降低,... 因此,我决定获取有关 Android 使用的音频效果的所有信息,并尝试在我的应用程序中禁用它。这样做我希望修复我的应用程序中的错误级别。

问题是我在获取这些信息时遇到了问题。

我尝试从 TJAudioEffect 和 TJAutomaticGainControl 类获取信息,但我不知道如何使用它。

  FAudioEffect:= TJAudioEffect.Wrap((TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.AUDIO_SERVICE) as ILocalObject).GetObjectID) ;

  FAutoGainCtrl:= TJAutomaticGainControl.Wrap((TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.AUDIO_SERVICE) as ILocalObject).GetObjectID) ;

有了David的回答,我可以测试TJNoiseSuppressor和TJAutomaticGainControl:

TJNoiseSuppressor.JavaClass.isAvailable
TJAutomaticGainControl.JavaClass.isAvailable

创建 TJAutomaticGainControl 对象时,我必须从 FAudioRecord 获取 ID,AUDIO_SESSION_ID_GENERATE 不起作用,我不明白为什么:

//FAutoGainCtrl:= TJAutomaticGainControl.JavaClass.create(TJAudioManager.JavaClass.AUDIO_SESSION_ID_GENERATE) ;
  var sessionID:= FAudioRecord.getAudioSessionId() ;
  FAutoGainCtrl:= TJAutomaticGainControl.JavaClass.create(sessionID) ;

创建均衡器对象时出现异常: 无法初始化类型的效果引擎

FEqualizer := TJEqualizer.JavaClass.init(0, sessionID);
FEqualizer := TJEqualizer.JavaClass.init(0, (TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.AUDIO_SERVICE) as ILocalObject).GetObjectID) ;

SessionID 不为空。

我以为是权限问题。在清单中,我必须添加 MODIFY_AUDIO_SETTINGS 权限:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

此权限不需要在运行时请求。

android delphi audio firemonkey
1个回答
0
投票

AutomaticGainControl
是使用
create
类方法创建的,例如:

  if TJAutomaticGainControl.JavaClass.isAvailable then
    FAutoGainCtrl := TJAutomaticGainControl.JavaClass.create(TJAudioManager.JavaClass.AUDIO_SESSION_ID_GENERATE);

根据 AudioEffect

 文档,您创建其中一个后代的实例,例如:

  FEqualizer := TJEqualizer.JavaClass.init(0, LSessionID);

其中 LSessionID 顾名思义。

© www.soinside.com 2019 - 2024. All rights reserved.