Android MediaRecorder JNI (Delphi) 的问题
Problems with Android MediaRecorder JNI (Delphi)
我正在使用 RAD Studio 10.2 Tokyo 并在 Delphi 中编程。
我遇到了使用 JNI 库的 Java 对象的一般问题。
我想做的是找到按下按钮之间 Android 音频源的最大音频振幅。
这是我正在使用的代码。
var
Form1: TForm1;
Recorder: JMediaRecorder;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(Recorder) then
begin
Recorder:= TJMediaRecorder.Create();
Recorder.setAudioSource(1);
Recorder.setOutputFormat(1);
Recorder.setAudioEncoder(1);
Recorder.setOutputFile(TPath.GetTempPath+'/test');
Recorder.prepare();
Recorder.start();
end;
Label1.Text:=IntToStr(Recorder.getMaxAmplitude());
end;
这似乎会产生多个问题。
问题 #1:
尽管我知道 java 中的媒体记录器设置应该类似于
Recorder.setAudioSource(MediaRecorder.AudioSource.MIC).
这不是我可以在 RAD Studio 中输入的内容。我看了一下 API ,发现它应该表示整数 1。问题是它给我一个错误,说它找不到音频源。
问题 #2:
我需要使用
为文件设置路径
Recorder.setOutputFile()
问题是它只接受 JStrings 作为输入。我找遍了所有地方,发现有几个人使用
StringToJString('my super cool string')
我认为这是我不知道的库的一部分,因为当我使用它时它不起作用。
如果您知道另一种从 Android 音频源获取振幅读数的方法,我也会接受它作为答案,因为这是我要解决的总体问题。
一般来说,在 Delphi Android JNI 框架内:
Java class 类型在 Delphi 中使用以 TJ
和 [=70] 为前缀的 classes 表示=] 对象实例在 Delphi 中使用以 J
.
为前缀的接口表示
嵌套 Java classes 由 Delphi classes 和以父 class 名称命名的接口表示后跟 _
后跟嵌套的 class 名称。
Java static constants/fields/properties/methods 在 Delphi 中表示为特殊 JavaClass
class sub-properties/methods 属性.
所以,在你的情况下:
JavaMediaRecorder
class由TJMediaRecorder
class和JMediaRecorder
接口表示。
JavaMediaRecorder.AudioSource
class由TJMediaRecorder_AudioSource
class和JMediaRecorder_AudioSource
接口表示。
Java MediaRecorder.AudioSource.MIC
常数表示为 TJMediaRecorder_AudioSource.JavaClass.MIC
class 属性:
Recorder.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC);
同样的事情适用于 MediaRecorder.setOutputFormat()
和 MediaRecorder.setAudioEncoder()
方法:
Recorder.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP);
Recorder.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB);
至于字符串,JNI对Delphi字符串一无所知,所以必须用StringToJString()
把Delphi字符串转成JNI字符串,用JStringToString()
转JNI 字符串到 Delphi 字符串。这两个函数都在 Delphi RTL 中,特别是在 Androidapi.Helpers
单元 (XE6+) 或 Androidapi.JNI.JavaTypes
单元 (XE5) 中,具体取决于您使用的 Delphi 版本。
Recorder.setOutputFile(StringToJString(TPath.Combine(TPath.GetTempPath, 'test')));
我正在使用 RAD Studio 10.2 Tokyo 并在 Delphi 中编程。
我遇到了使用 JNI 库的 Java 对象的一般问题。
我想做的是找到按下按钮之间 Android 音频源的最大音频振幅。
这是我正在使用的代码。
var
Form1: TForm1;
Recorder: JMediaRecorder;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(Recorder) then
begin
Recorder:= TJMediaRecorder.Create();
Recorder.setAudioSource(1);
Recorder.setOutputFormat(1);
Recorder.setAudioEncoder(1);
Recorder.setOutputFile(TPath.GetTempPath+'/test');
Recorder.prepare();
Recorder.start();
end;
Label1.Text:=IntToStr(Recorder.getMaxAmplitude());
end;
这似乎会产生多个问题。
问题 #1:
尽管我知道 java 中的媒体记录器设置应该类似于
Recorder.setAudioSource(MediaRecorder.AudioSource.MIC).
这不是我可以在 RAD Studio 中输入的内容。我看了一下 API ,发现它应该表示整数 1。问题是它给我一个错误,说它找不到音频源。
问题 #2:
我需要使用
为文件设置路径Recorder.setOutputFile()
问题是它只接受 JStrings 作为输入。我找遍了所有地方,发现有几个人使用
StringToJString('my super cool string')
我认为这是我不知道的库的一部分,因为当我使用它时它不起作用。
如果您知道另一种从 Android 音频源获取振幅读数的方法,我也会接受它作为答案,因为这是我要解决的总体问题。
一般来说,在 Delphi Android JNI 框架内:
Java class 类型在 Delphi 中使用以
TJ
和 [=70] 为前缀的 classes 表示=] 对象实例在 Delphi 中使用以J
. 为前缀的接口表示
嵌套 Java classes 由 Delphi classes 和以父 class 名称命名的接口表示后跟
_
后跟嵌套的 class 名称。Java static constants/fields/properties/methods 在 Delphi 中表示为特殊
JavaClass
class sub-properties/methods 属性.
所以,在你的情况下:
Java
MediaRecorder
class由TJMediaRecorder
class和JMediaRecorder
接口表示。Java
MediaRecorder.AudioSource
class由TJMediaRecorder_AudioSource
class和JMediaRecorder_AudioSource
接口表示。Java
MediaRecorder.AudioSource.MIC
常数表示为TJMediaRecorder_AudioSource.JavaClass.MIC
class 属性:Recorder.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC);
同样的事情适用于 MediaRecorder.setOutputFormat()
和 MediaRecorder.setAudioEncoder()
方法:
Recorder.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP);
Recorder.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB);
至于字符串,JNI对Delphi字符串一无所知,所以必须用StringToJString()
把Delphi字符串转成JNI字符串,用JStringToString()
转JNI 字符串到 Delphi 字符串。这两个函数都在 Delphi RTL 中,特别是在 Androidapi.Helpers
单元 (XE6+) 或 Androidapi.JNI.JavaTypes
单元 (XE5) 中,具体取决于您使用的 Delphi 版本。
Recorder.setOutputFile(StringToJString(TPath.Combine(TPath.GetTempPath, 'test')));