delphi 如何删除音频效果(增益,降噪,...)在Android应用程序中录制时

dldeef67  于 2023-10-18  发布在  Android
关注(0)|答案(1)|浏览(179)

在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) ;

有了大卫的答案,我可以测试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" />

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

v1l68za4

v1l68za41#

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

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

根据documentation for AudioEffect,您可以创建其中一个后代的示例,例如:

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

其中LSessionID是名称所暗示的。

相关问题