【问题标题】:No sound when I use Audiotrack使用 Audiotrack 时没有声音
【发布时间】:2019-02-06 14:45:08
【问题描述】:

奇怪的情况。我使用 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();
    }
}

EDIT2:我发现它只有在调用 AudioTrack 的方法 stop 后才开始播放声音。但是如果我需要播放每一帧我该怎么办?

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

【问题讨论】:

  • 我从 MIC 获取的声音。我检查了它有一些数据。即使它错误或我以错误的速度播放它 - 我应该听到一些噪音。但是 100% 静默 byte[] data = new byte[1024 * 1024];
  • 您的问题解决了吗?您是否看到来自 AudioTrack 的任何日志数据,是静默还是输出 write: userSize?
  • @KristianMartinsen 我遇到了与ExoPlayer 类似的问题,第一次播放正常,之后我得到[AudioTrack] write userSize 2400

标签: android audiotrack


【解决方案1】:

以下代码:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多