小编Mac*_*zyb的帖子

如何使用 Xamarin for Android 将数据从 MediaCodec 流式传输到 AudioTrack

我正在尝试解码 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

5
推荐指数
0
解决办法
1647
查看次数

使用敲除的多个“模式”验证扩展器

如果我像这样扩展可观察的淘汰赛

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,此功能已经失效,但似乎无法确定为什么它不再起作用。

javascript knockout.js knockout-validation

2
推荐指数
1
解决办法
1645
查看次数