首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法播放编码为ENCODING_PCM_FLOAT的PCM流

无法播放编码为ENCODING_PCM_FLOAT的PCM流
EN

Stack Overflow用户
提问于 2019-10-25 17:33:24
回答 1查看 427关注 0票数 0

我知道有很多关于这个话题的问题。但我对ENCODING_PCM_FLOAT有意见。

我有一个包含以下信息的PCM流:

代码语言:javascript
复制
Encoding : 32 bit float
Byte order: Little Endian
Channels : 2 channels ( stereo)
Sample Rate : 48000

我想把它喂给AudioTrack。我使用以下API:

代码语言:javascript
复制
private final int SAMPLE_RATE = 48000;
private final int CHANNEL_COUNT = AudioFormat.CHANNEL_OUT_STEREO;
private final int ENCODING = AudioFormat.ENCODING_PCM_FLOAT;
...
int bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, CHANNEL_COUNT, ENCODING);    
AudioAttributes audioAttributes = new AudioAttributes.Builder()
    .setUsage(AudioAttributes.USAGE_MEDIA)
    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
    .build();
AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(ENCODING)
    .setSampleRate(SAMPLE_RATE)
    .build();
audioTrack = new AudioTrack(audioAttributes, audioFormat, bufferSize
    , AudioTrack.MODE_STREAM, AudioManager.AUDIO_SESSION_ID_GENERATE);
audioTrack.play();

然后我开始听音频流:

代码语言:javascript
复制
    private void startListening() {
        while (true) {
            try {
                byte[] buffer = new byte[8192];

                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                mSocket.receive(packet);

                FloatBuffer floatBuffer = ByteBuffer.wrap(packet.getData()).asFloatBuffer();
                float[] audioFloats = new float[floatBuffer.capacity()];
                floatBuffer.get(audioFloats);

                for (int i = 0; i < audioFloats.length; i++) {
                    audioFloats[i] = audioFloats[i] / 0x8000000;
                }

                audioTrack.write(audioFloats, 0, audioFloats.length, AudioTrack.WRITE_NON_BLOCKING);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

但我根本听不到任何声音。我可以将字节数组作为PCM_16播放(无需将其转换为浮点数组),但它包含太多噪声。所以我认为流输入不是问题所在。

如果你有任何想法,请让我知道。

感谢您的阅读!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-25 17:46:12

代码语言:javascript
复制
for (int i = 0; i < audioFloats.length; i++) {
    audioFloats[i] = audioFloats[i] / 0x8000000;
}

我是个笨蛋,上面的代码块是不需要的。移除后,音频播放正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58555878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档