我正在尝试解码 mp3 文件并将其流式传输到 AudioTrack。一切正常,但会在 Java 端导致大量 GC。我确保不在我的播放/流循环中分配内存并归咎于 ByteBuffer.Get(byte[], int, int) 分配临时 Java 数组的绑定。任何人都可以确认和/或展示将数据从 MediaCodec 馈送到 AudioTrack 的更好方法吗?(我知道 API 21 引入了 AudioTrack.write(ByteBuffer, ...))谢谢
这是我所做的:
byte[] audioBuffer = new byte[...];
...
ByteBuffer codecOutputBuffer = codecOutputBuffers[outputIndex];
// The next line seems to be the source of a lot of GC during playback
codecOutputBuffer.Get(audioBuffer, 0, bufInfo.Size);
audioTrack.Write(audioBuffer, 0, bufInfo.Size);
Run Code Online (Sandbox Code Playgroud)
更新 1:我尝试使用分配跟踪器来确认分配站点。我发现分配的对象是 8kb 大字节数组。不幸的是,分配跟踪器没有为他们显示分配站点堆栈跟踪:
1 32 org.apache.harmony.dalvik.ddmc.Chunk 6 org.apache.harmony.dalvik.ddmc.DdmServer dispatch
2 16 java.lang.Integer 6 java.lang.Integer valueOf
3 16 byte[] 6
4 8192 byte[] 20
5 …Run Code Online (Sandbox Code Playgroud) android xamarin.android audiotrack xamarin android-mediacodec
如果我像这样扩展可观察的淘汰赛
var x = ko.observable().
extend({
pattern : {
params: someRegex,
message: "An error"
}
})
.extend({
pattern : {
params: someMoreRegex,
message: "Another error"
}
})
Run Code Online (Sandbox Code Playgroud)
这是可观察到的淘汰赛的有效扩展名(即多个模式扩展名)吗?
第二个模式的正则表达式根本没有得到验证。在某些情况下,确实会触发它,但会显示第一个模式错误消息。我最近将表格1.0.2升级到了2.0.3,此功能已经失效,但似乎无法确定为什么它不再起作用。