Mic*_*ael 2 java delphi android mediarecorder delphi-10.2-tokyo
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
这似乎会产生多个问题.
问题#1:
虽然我知道在java中,媒体录制器设置看起来应该是这样的
Recorder.setAudioSource(MediaRecorder.AudioSource.MIC).
Run Code Online (Sandbox Code Playgroud)
这不是我可以在RAD Studio中输入的内容.我看了一下API,发现它应该是1的整数.问题是它给我一个错误,说它无法找到音频源.
问题#2:
我需要为文件设置路径
Recorder.setOutputFile()
Run Code Online (Sandbox Code Playgroud)
这个问题是它只接受JStrings作为输入.我到处看了一眼,发现了一些使用过的人
StringToJString('my super cool string')
Run Code Online (Sandbox Code Playgroud)
我认为这是我不知道的库的一部分,因为它在我使用它时不起作用.
如果你知道另一种方法来获得一个Android音频源的振幅读数,我也会接受这个答案,因为这是我试图解决的整体问题.
一般来说,在Delphi Android JNI框架内:
Java类类型在Delphi中使用前缀的类表示TJ,Java对象实例使用前缀的接口在Delphi中表示J.
嵌套的Java类由Delphi类和接口表示,这些类和接口以父类名称后跟_随后的嵌套类名称命名.
Java静态常量/字段/属性/方法在Delphi中表示为特殊JavaClass类属性的子属性/方法.
所以,在你的情况下:
Java MediaRecorder类由TJMediaRecorder类和JMediaRecorder接口表示.
Java MediaRecorder.AudioSource类由TJMediaRecorder_AudioSource类和JMediaRecorder_AudioSource接口表示.
Java MediaRecorder.AudioSource.MIC常量由TJMediaRecorder_AudioSource.JavaClass.MIC类属性表示:
Recorder.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC);
Run Code Online (Sandbox Code Playgroud)同样的事情适用于MediaRecorder.setOutputFormat()和MediaRecorder.setAudioEncoder()方法:
Recorder.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP);
Recorder.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB);
Run Code Online (Sandbox Code Playgroud)
至于字符串,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')));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |