Play Back audio from mic in real Time

前端 未结 1 691
悲哀的现实
悲哀的现实 2020-12-08 18:19

I have a function , that records audio, and stores it into a file. This is what is looks like:

private void startRecord(){

      File file = new File(Enviro         


        
相关标签:
1条回答
  • 2020-12-08 18:25

    This works for me:

    boolean isRecording = false;
    AudioManager am = null;
    AudioRecord record = null;
    AudioTrack track = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setVolumeControlStream(AudioManager.MODE_IN_COMMUNICATION);
    
        initRecordAndTrack();
    
        am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
        am.setSpeakerphoneOn(true);
    
        (new Thread()
        {
            @Override
            public void run()
            {
                recordAndPlay();
            }
        }).start();
    
        Button startButton = (Button) findViewById(R.id.start_button);
        startButton.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (!isRecording)
                {
                    startRecordAndPlay();
                }
            }
        });
        Button stopButton = (Button) findViewById(R.id.stop_button);
        stopButton.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (isRecording)
                {
                    stopRecordAndPlay();
                }
            }
        });
    }
    
    private void initRecordAndTrack()
    {
        int min = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        record = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                                 min);
        if (AcousticEchoCanceler.isAvailable())
        {
            AcousticEchoCanceler echoCancler = AcousticEchoCanceler.create(record.getAudioSessionId());
            echoCancler.setEnabled(true);
        }
        int maxJitter = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
        track = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, maxJitter,
                               AudioTrack.MODE_STREAM);
    }
    
    private void recordAndPlay()
    {
        short[] lin = new short[1024];
        int num = 0;
        am.setMode(AudioManager.MODE_IN_COMMUNICATION);
        while (true)
        {
            if (isRecording)
            {
                num = record.read(lin, 0, 1024);
                track.write(lin, 0, num);
            }
        }
    }
    
    private void startRecordAndPlay()
    {
        record.startRecording();
        track.play();
        isRecording = true;
    }
    
    private void stopRecordAndPlay()
    {
        record.stop();
        track.pause();
        isRecording = false;
    }
    

    You also need two buttons in your activity_main layout with the id start_button and stop_button.

    This sample also contains an EchoCanceler!

    Good luck!

    0 讨论(0)
提交回复
热议问题