在ExoPlayer中复制音频ByteBuffer

时间:2018-01-25 15:58:51

标签: android audio bytebuffer exoplayer

我试图处理Android ExoPlayer中的音频缓冲区。在 DefaultAudioSink 类的 writeBuffer 函数中,音频数据来自ByteBuffer对象。在我的例子中,我想从这个ByteBuffer获取值(如果可能的话,如Byte [])来处理数据,然后创建一个新的ByteBuffer并将其提供给audioTrack。

我首先尝试在新的ByteBuffer中克隆原始的ByteBuffer,然后将其发送到audioTrack(如Deep copy duplicate() of Java's ByteBuffer中所述),以验证它是否仍在工作。但结果是目标和原始缓冲区的空缓冲区(与此解决方案一样)

public static ByteBuffer clone(ByteBuffer original) {
    ByteBuffer clone = ByteBuffer.allocate(original.capacity());
    original.rewind();//copy from the beginning
    clone.put(original);
    original.rewind();
    clone.flip();
    return clone;
}

或类似加速音频的内容(如果我删除了快退调用)。

一个简单的

ByteBuffer newBuffer = buffer.duplicate();

具有相同的行为。

我试图了解为什么我无法使用重复的音频ByteBuffer,我可以将其转移到AudioTrack并听到相同的声音。

1 个答案:

答案 0 :(得分:0)

您是否尝试过复制并包装返回的ByteBuffer数组?即。

byte[] copy = Arrays.copyOf(original.array(), original.array().length)
return ByteBuffer.wrap(copy, 0, copy.length)