Проблемы с записью аудио-буфера и воспроизведением буфера, проблема при записи данных в аудиотрек - PullRequest
2 голосов
/ 10 января 2012

Здесь я пытаюсь сделать запись и воспроизведение голоса одновременно, он работает нормально в течение нескольких секунд и принудительно закрывается, показывая ошибку при записи в буфер в аудиотреке (m_track.write (buffer, 0, BUF_SIZE);). Пожалуйста, проверьте код ниже и предложите правильно инициализировать объект звуковой дорожки.

    int SAMPLE_RATE = 8000;
    int BUF_SIZE = 1024;
    byte[] buffer = new byte[BUF_SIZE];

function()
{
try
{
            buffersize = AudioRecord
                    .getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                            AudioFormat.ENCODING_PCM_16BIT);

        } catch (Throwable t) {
            Log.e("Audio", "Buffer size failed");
        }

        if (buffersize <= BUF_SIZE) {
            buffersize = BUF_SIZE;
        }
        try {

            m_record = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, buffersize * 2);

            m_track = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                    SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, buffersize * 2,
                    AudioTrack.MODE_STREAM);

            m_track.setPlaybackRate(SAMPLE_RATE);
        } catch (Throwable t) {
            Log.e("Audio", "Audio Failed");
        }

        m_record.startRecording();
        m_track.play();
        try {
            m_thread = new Runnable() {
                public void run() {
                    while (m_isRun) {

                        m_record.read(buffer, 0, BUF_SIZE);
                        m_track.write(buffer, 0, BUF_SIZE);
                    }
                }
            };

            m_thread.run();
        } catch (Exception e) {
            Log.e("ERROR", "exception: " + e.getLocalizedMessage());
        }

        Log.i("D2Record", "loopback exit");
    }

1 Ответ

2 голосов
/ 10 января 2012

Я не совсем знаком с этой темой, но думаю, что у вас проблемы с размерами буфера.Я оставляю большую часть кода и концентрируюсь в основном на обработке буфера.

int SAMPLE_RATE = 8000;
int BUF_SIZE = 1024;

int buffersize = AudioRecord
                .getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
bufferSize = Math.Max(bufferSize, AudioTrack
                .getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
bufferSize = Math.max(bufferSize, BUF_SIZE);
byte[] buffer = new byte[bufferSize];

m_record = new AudioRecord(MediaRecorder.AudioSource.MIC,
                SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT, bufferSize);
m_track = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, bufferSize,
                AudioTrack.MODE_STREAM);

m_track.setPlaybackRate(SAMPLE_RATE);
m_record.startRecording();
m_track.play();
while (m_isRun) {
    // You should check 'read' for errors after read.
    int read = m_record.read(buffer, 0, bufferSize);
    // You should check 'wrote' for errors after write.
    int wrote = m_track.write(buffer, 0, read);
}
...