【问题标题】:Delphi XE5 firemonkey api callDelphi XE5 firemonkey api调用
【发布时间】:2014-04-15 14:43:37
【问题描述】:

我正在尝试通过直接调用 android api TJAudioRecord 在 firemonkey 中录制音频,但它不起作用,audioRecord.getState 返回 STATE_UNINITIALIZED 无论我尝试了什么,请帮忙?

这个函数有一些错误

  audioRecord := 

    TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.VOICE_COMMUNICATION,
                                                 16000,
                                                 TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
                                                  TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,
                                                  bufferSize);

完整代码

 bufferSize := TJAudioRecord.JavaClass.getMinBufferSize(16000,
                                                            TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
                                                           TJAudioFormat.JavaClass.ENCODING_PCM_16BIT);

     if (bufferSize <> TJAudioRecord.JavaClass.ERROR_BAD_VALUE) then
     begin
      audioRecord := TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.VOICE_COMMUNICATION,
                                                 16000,
                                                 TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
                                                  TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,
                                                  bufferSize);
        ShowMessage(IntToStr(buffersize));
       if (audioRecord.getState = TJAudioRecord.JavaClass.STATE_INITIALIZED)then begin
      //then begin
      audioRecord.startRecording;
      ShowMessage('ok');
      end;
    end;
     except
    ShowMessage('Error 0');
    end;

【问题讨论】:

  • 您正在检查getMinBufferSize() 的结果是否有ERROR_BAD_VALUE (-2),但您也没有检查它是否有ERROR (-1),这表明存在硬件问题。我建议您检查&gt;0 的结果而不是具体错误。
  • buffersize没问题,它返回4096,它不会初始化,而且我在权限列表中打开了audiorecord

标签: android delphi audio firemonkey


【解决方案1】:

我使用以下代码,它适用于我的三星 Galaxy Note III。

  Ses := TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.MIC, 11025, TJAudioFormat.JavaClass.CHANNEL_IN_MONO, TJAudioFormat.JavaClass.ENCODING_PCM_16BIT, 44100 * 2);
  (Ses As JAudioRecord).startRecording;
  Okunan := 0;
  M := TMemoryStream.Create;
  for I := 1 to 2 do
  Begin
    Tampon := TJavaArray<SmallInt>.Create(44100);
    Okunan := Okunan + (Ses As JAudioRecord).read(Tampon, 0, 44100);
    M.Write(Tampon.Data^, Tampon.Length * 2);
    Tampon.Free;
  End;
  (Ses As JAudioRecord).stop;
  Ses.release;
  M.SaveToFile(TPath.GetRingtonesPath+'/ses.raw');

【讨论】:

  • 谢谢,我已经用你的例子修改了我的代码,它正在工作
  • 很高兴您解决了这个问题。那你会接受答案吗?
  • 当然 :) 我需要弄清楚将这段代码放入线程中,就是这样,标准 deplhi TThread 抛出异常
  • 我用线程对象试了一下,也得到了异常。
  • Delphi 允许您编写在多个平台(iOS、Android、OSX、Win32 和 Win64)上运行的代码。跨平台支持增加了开销。如果您不需要跨平台,Delphi 不是正确的选择。如果你这样做了,当你尝试使用相同的源时,它会在所有非 Android 的东西上胜过 Android Studio。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多