我试图处理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并听到相同的声音。
答案 0 :(得分:0)
您是否尝试过复制并包装返回的ByteBuffer数组?即。
byte[] copy = Arrays.copyOf(original.array(), original.array().length)
return ByteBuffer.wrap(copy, 0, copy.length)