在 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" />
此权限不需要在运行时请求。
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 顾名思义。