缓冲到MediaCodec的表面输入
已经演示了如何向MediaCodec提供像CameraPreview一样的Surface输入,但是在提交给MediaCodec
之前是否有实际的方法来缓冲这个输入?
在我的实验中,Galaxy Nexus在使用CameraToMpegTest.java中的直接同步编码方法制作音频/视频流时遇到了难以接受的打嗝
当通过byte[]
或ByteBuffer
输入使用MediaCodec
时,我们可以将未编码的数据提交给ExecutorService
或类似的队列进行处理,以确保即使设备出现应用程序控制的CPU使用率峰值,也不会丢帧。 但是,由于需要在Android的Camera和MediaCodec之间执行颜色格式转换,所以对于高分辨率实时视频而言,这种方法是不现实的。
想法 :
有没有办法将使用EGL14.eglCopyBuffers(EGLDisplay d, EGLSurface s, NativePixmapType p)
创建的NativePixmapType
提供给MediaCodec
?
Android的任何人都可以评论Camera和MediaCodec之间的ByteBuffer格式是否协调一致吗?
你根本不想复制数据。 分配存储并复制大量数据可能需要足够长的时间来杀死帧速率。 这通常会排除byte []和ByteBuffer []解决方案,即使您不必进行U / V平面交换。
通过系统移动数据的最有效方式是使用Surface。 技巧是Surface不是缓冲区,它是一个缓冲区队列的接口。 缓冲区通过引用传递; 当你unlockCanvasAndPost()
你实际上是将当前缓冲区放置到消费者队列中,这通常是在不同的进程中。
没有公共的机制来创建新的缓冲区并将其添加到队列使用的集合中,或者从队列中提取缓冲区,所以您不能在侧面实现DIY缓冲区方案。 没有公共接口来更改池中缓冲区的数量。
了解导致打嗝的原因是很有用的。 用于分析此类问题的Android工具是systrace,可用于Android 4.1+(文档,示例,bigflake示例)。 如果您可以确定CPU负载的来源,或者确定它不是CPU,而是让一些代码纠结在一起,那么您可能会有一个解决方案,比向Surface添加更多缓冲区要容易得多。
链接地址: http://www.djcxy.com/p/16487.html