2014-04-15 6 views
0

안드로이드 API TJAudioRecord를 직접 호출하여 firemonkey에 오디오를 녹음하려하지만 audioRecord.getState가 작동하지 않으면 STATE_UNINITIALIZED를 반환합니다.Delphi XE5 firemonkey api call

이 기능

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; 
+0

당신은''ERROR_BAD_VALUE' (-2)에 대한 getMinBufferSize'()의 결과를 확인하고 있습니다,하지만 당신은 하드웨어 문제를 나타내는 것뿐만 아니라'ERROR' (-1), 그것을 확인하지 않습니다. 특정 오류 대신'> 0 '에 대한 결과를 확인하는 것이 좋습니다. –

+0

buffersize가 괜찮 으면 4096을 반환하고 초기화하지 않을 것이며 audiorecord를 사용 권한 목록에 설정 했음 – Geeko

답변

1

나는 다음과 같은 코드를 사용하여 내 삼성 갤럭시 노트 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'); 
+0

감사합니다. 내 코드를 수정하여 작동하고 있습니다. – Geeko

+0

당신이 해결했기 때문에 기쁩니다. 그 대답을 받아들시겠습니까? –

+0

확실 :) 스레드에서이 코드를 넣으려면 알아야하고 그게 표준 deplhi TThread 예외를 throw합니다 – Geeko

관련 문제