Нет звука при использовании Audiotrack

Странная ситуация. Я использую AudioTrack, но звук не воспроизводится.... Мой код для воспроизведения:

private class wPlaySound extends Thread {
    @Override
    public void run() {
        float sampleRate = 8000;
        int sampleSizeInBytes = 2;
        int samplePerFrame = (int) sampleRate / (1000 / 20); // 20мс
        int frameSize = sampleSizeInBytes * samplePerFrame;
        int minBuf = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

        Log.v("w201", "Buffer Size: " + minBuf);

        AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, minBuf * 100, AudioTrack.MODE_STREAM);
        at.setStereoVolume(1.0f,1.0f);
        at.play();
        for (int i = 0; i < position; i = i + frameSize) {
            Log.v("w201","write: "+at.write(data, i, frameSize));
        }
        at.flush();
        at.stop();
        at.release();
    }
}

Я могу понять, слышу ли я шум или какой-то неправильный звук. Но я ничего не слышу....

РЕДАКТИРОВАТЬ: Как я получил данные. Это не идеально и не будет работать на всех устройствах, но это работает на моем телефоне и планшете

private class wRecordSound extends Thread {
    public boolean stop = false;

    public wRecordSound() {
        position = 0;
    }

    @Override
    public void run() {

        int freq = 8000;
        int sampleSizeInBytes = 2;
        int samplePerFrame = (int) freq / (1000 / 20); // 20мс
        int frameSize = sampleSizeInBytes * samplePerFrame;

        final int bufferSize = AudioRecord.getMinBufferSize(freq,
                AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT);

        final AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, freq,
                AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT, bufferSize);
        if (audioRecord.getState()!=AudioRecord.STATE_INITIALIZED) {
            Log.v("w201","audio recorder not init" );
            return;
        }
        try {
            audioRecord.startRecording();
            while (!stop) {


                position += audioRecord.read(data, position, frameSize);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        audioRecord.stop();
        audioRecord.release();
    }
}

РЕДАКТИРОВАТЬ 2: Я обнаружил, что он начинает воспроизводить звук только после того, как я вызвал метод stop AudioTrack. Но что мне делать, если мне нужно играть каждый кадр?

_loop_
_receive_frame_
at.play
at.write(_one frame_)
at.stop

0 ответов

Код ниже:

at.play();
at.write(data, i, frameSize));
at.flush();
at.stop();
at.release(); 

не будет играть правильно. Записывает только блоки, пока данные не будут записаны в буфер, а не до завершения воспроизведения. Вам нужно удалить "flush", он не должен вызываться в любом случае при воспроизведении. Увидеть ниже:

at.play();
at.write(data, i, frameSize));
at.stop();
at.release(); 

Таким образом, остановка завершит воспроизведение. Но если вам нужна немедленная остановка, вы должны сделать:

at.pause();
at.flush();
Другие вопросы по тегам