AudioTrack AudioRecord android问题,沉默

时间:2017-06-25 07:53:14

标签: android multithreading service audiorecord audiotrack

有人知道是否需要将audiorecord和audiotrack以特殊方式/类型的线程,可运行,服务等分开,以便它能够一起工作?现在我可以开始录音,然后听音乐也没有问题。

但是,如果我在录音时开始和停止音频录音,那么音频录音开始输出0就像它被静音一样。 (但它没有静音或停止)

如果我开始录音电话然后是录音带,那么录音带也会被静音#34;

同样奇怪的是,当我拔下并插上我的有线耳机时,它将再次开始录制/输出录音而不是0(这让我觉得我的手机联想B和联想C2太便宜了(电路/硬件问题)或构建问题)但我不知道。

任何人都突然听到这个问题并且#34; audiorecord或audiorecord响应拔出/插入有线头设备而没有应用任何设置/方法?

代码更新

class myRecordAndPlayer(){

public void initiateRecorder() {
    if(audio.getMode()!=AudioManager.MODE_IN_CALL) {
        audio.setMode(AudioManager.MODE_IN_CALL);
        //audio.setSpeakerphoneOn(false); for mode in com (mode in com produces more echo/crosstalk)
    }

    rec = true;
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
            AudioRecord audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) * 10);
            try {
                audioRecorder.startRecording();
                while (rec) {
                    bytes_read = audioRecorder.read(buf_audio, 0, buf_audio_len);


public void initiatePlayer() {
    if(!play) {
        play = true;
        android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
        Thread receiveThread = new Thread(new Runnable() {
            @Override
            public void run() {
                AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, BUF_SIZE, AudioTrack.MODE_STREAM);
                track.play();
                try {
                    while(play) {
                        track.write(bufToPlay, 0, bufToPlay.length);

1 个答案:

答案 0 :(得分:0)

未经测试。

private Thread audioRecordThread
private AudioRecord audioRecorder;
private AudioTrack audioTrack;

public void initialize() {
    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, BUF_SIZE, AudioTrack.MODE_STREAM);

    audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) * 10);

    audioRecordThread = new Thread(new Runnable() {
            public void run() {
                writeAudioDataToAudioTrack();
            }
        });
}

public void start() {
    audioTrack.play();
    audioRecorder.startRecording();
    audioRecordThread.start();
}

private void writeAudioDataToAudioTrack() {
    while(AudioRecord.RECORDSTATE_RECORDING == audioRecord.getRecordingState()) {
        audioTrack.write(bufToPlay, 0, bufToPlay.length);
    }
}
相关问题