已经演示了如何使用CameraPreview之类的Surface输入来馈送MediaCodec,但是在提交到该输入之前是否有缓冲此输入的实用方法MediaCodec
?
在我的实验中,Galaxy Nexus在CameraToMpegTest.java中使用直接,同步编码方法来产生音频/视频流时遇到了不可接受的问题
当使用MediaCodec
withbyte[]
或ByteBuffer
input时,ExecutorService
即使设备的CPU使用率超出了我们的应用程序控制,我们也可以将未编码的数据提交到一个或类似的队列进行处理,以确保不会丢失任何帧。但是,由于需要在Android的Camera和MediaCodec之间执行颜色格式转换,因此该方法对于高分辨率的实时视频是不现实的。
想法:
有没有办法将NativePixmapType
创建的内容提供EGL14.eglCopyBuffers(EGLDisplay d, EGLSurface s, NativePixmapType p)
给MediaCodec
?
Android上的任何人都可以评论路线图上是否在Camera和MediaCodec之间协调ByteBuffer格式吗?
您真的根本不想复制数据。分配存储空间并复制大量数据可能会花费足够长的时间来破坏帧速率。这通常排除了byte []和ByteBuffer []解决方案,即使您不必进行U / V平面交换也是如此。
在系统中移动数据的最有效方法是使用Surface。诀窍是,Surface不是缓冲区,它是缓冲区队列的接口。缓冲区通过引用传递;当您unlockCanvasAndPost()
实际上将当前缓冲区放入使用者的队列时,通常是在不同的过程中。
没有创建新缓冲区并将其添加到队列使用的集合或从队列中提取缓冲区的公共机制,因此您无法在一侧实现DIY缓冲区方案。没有公共接口可以更改池中的缓冲区数量。
知道是什么引起了打ic,这将很有用。用于分析此类问题的Android工具是systrace,可在Android 4.1+中使用(docs,example,bigflake example)。如果您可以确定CPU负载的来源,或者确定它不是CPU,而是纠结了一些代码,那么您将拥有比向Surface增加更多缓冲区容易得多的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句