为什么ByteBuffer putShort(value)的方法在我的情况下无法正常工作?

时间:2017-12-20 12:22:04

标签: java android kotlin bytebuffer short

我的任务是将short []数组转换为byte []数组,因为需要通过socket发送字节。这是AudioTrack(Android)的字节 要转换,请使用此post,特别是thisthis 当尝试将短转换为字节数组时,此方法仅产生白噪声:

 val sampleBuffer = decoder.decodeFrame(frameHeader, bitstream) as SampleBuffer
 val pcm = sampleBuffer.buffer //pcm is short[] array 

byteBuf = ByteBuffer.allocate(pcm.size * 2) // because 1 short = 2 bytes

while (pcm.size > i) {
   byteBuf.putShort(pcm[i]) 
   i++ 
}

auddioTrack.write(byteBuf.array(), 0, byteBuf.limit());

但是这个转换工作正常:

var i = 0
    val byteBuf = ByteBuffer.allocate(pcm.size * 2)
    val buff =  ByteBuffer.allocate(2)

    //pcm size equals 2304
    while (pcm.size > i) {
       // byteBuf.putShort(pcm[i])
      byteBuf.put(byteArrayOf((pcm[i].toInt() and 0x00FF).toByte(), ((pcm[i].toInt() and 0xFF00) shr (8)).toByte()))                       
     i++
    }

auddioTrack.write(byteBuf.array(), 0, byteBuf.limit());

为什么会这样?

1 个答案:

答案 0 :(得分:0)

byteBuf.array().size将返回缓冲区的大小(pcm.size * 2),无论是否将多少字节写入缓冲区。您可能需要byteBuf.limit()