Immediate Audio Input & Output Android

前端 未结 4 1195
感情败类
感情败类 2021-02-18 16:43

In my Android App, I would like to take in some audio from the mic of the smartphone and play it immediately, live, like a microphone, with no lag. I am currently thinking of us

相关标签:
4条回答
  • 2021-02-18 17:16

    This is actually really tricky on Android. Google themselves have a very good (but slightly long) video explaining the issues.

    They also have a page explaining their latency testing methods and benchmarks for various devices.

    Essentially, stock Android can't do zero-latency audio, however there's nothing stopping hardware partners from adding the required hardware and platform extensions to do so.

    0 讨论(0)
  • 2021-02-18 17:17

    try this. I have not run this.

          recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
          RECORDER_SAMPLERATE, RECORDER_CHANNELS,
          RECORDER_AUDIO_ENCODING, bufferSize * BytesPerElement);
    
        recorder.startRecording();
    
        isRecording = true;
    
        recordingThread = new Thread(new Runnable() {
    
         public void run() {
    
          try {
              int intSize = android.media.AudioTrack.getMinBufferSize(RECORDER_SAMPLERATE,AudioFormat.CHANNEL_OUT_MONO , RECORDER_AUDIO_ENCODING);
              byte[] sData = new byte[bufferSize];
              AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, RECORDER_SAMPLERATE, AudioFormat.CHANNEL_OUT_MONO, RECORDER_AUDIO_ENCODING, intSize, AudioTrack.MODE_STREAM);
              while(isRecording){
              recorder.read(sData, 0, bufferSize);  //isRecording = false; onStop button
    
              if (at!=null) { 
                  at.play();
                  // Write the byte array to the track
                  at.write(sData, 0, sData.length); 
                  at.stop();
                  at.release();
              }
              }
        } catch (IOException e) {
            e.printStackTrace();
        }
     }
      }, "AudioRecorder Thread");
        recordingThread.start();
    
    0 讨论(0)
  • 2021-02-18 17:24

    You can try Google Oboe.

    Oboe is a C++ library that makes it easy to build high-performance audio apps on Android.

    Oboe has already an example for "Immediate Audio Input & Output Android"

    LiveEffect Sample

    This sample simply loops audio from the input stream to the output stream to demonstrate the usage of the 2 stream interfaces.

    https://github.com/google/oboe/tree/master/samples/LiveEffect

    0 讨论(0)
  • 2021-02-18 17:38

    As far as I can think it can be done in a very simple way. I haven't tried it,but you try it. I think it'll work:

    Create two threads one for recording another for playing. Say the threads are TRecord and TPlay.

    In TRecord's run method do this :

    public void run(){
            MediaRecorder mRecorder = null;
            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setOutputFile(mFileName);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    
            try {
                mRecorder.prepare();
            } catch (IOException e) {
                //todo
            }
    
            mRecorder.start();
    }
    

    And it TPlay's run method do this :

    public void run() {
    MediaPlayer   mPlayer = null;
    mPlayer = new MediaPlayer();
            try {
                mPlayer.setDataSource(mFileName);
                mPlayer.prepare();
                mPlayer.start();
            } catch (IOException e) {
                //todo
            }
    }
    

    Now on mainactivity simply create two threads. First start the TRecord thread then Tplay . Try it.

    here is the code for file extension:

    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
     mFileName += "/audiorecordtest.3gp";
    
    0 讨论(0)
提交回复
热议问题