android – 缓冲SurfaceCodec的Surface输入

已经演示了如何将 feed MediaCodec with Surface input与CameraPreview一样,但是在提交给MediaCodec之前是否有实用的方法来缓冲此输入?

在我的experiments中,galaxy Nexus在CameraToMpegTest.java中使用直接同步编码方法产生音频/视频流时遇到了令人无法接受的打嗝

当使用带有byte []或ByteBuffer输入的MediaCodec时,我们可以将未编码的数据提交给ExecutorService或类似的队列进行处理,以确保不会丢弃任何帧,即使设备的cpu使用率超出了我们应用程序的控制范围.但是,由于要求执行color format conversion between Android’s Camera and MediaCodec,这种方法对于高分辨率的直播视频来说是不现实的.

思考:

>有没有办法将使用EGL14.eglCopyBuffers(EGLDisplay d,EGLSurface s,NativePixmapType p)创建的NativepixmapType提供给MediaCodec?
>来自Android的任何人都可以评论相机和MediaCodec之间是否协调ByteBuffer格式是否在路线图上?

解决方法

你根本不想复制数据.为大量数据分配存储和复制大量数据可能需要足够长的时间来终止帧速率.这通常会排除byte []和ByteBuffer []解决方案,即使您不必进行U / V平面交换.

通过系统移动数据的最有效方法是使用Surface.诀窍是Surface不是缓冲区,它是queue of buffers的接口.缓冲区通过引用传递;当你解锁CanvasAndPost()时,你实际上是将当前缓冲区放在消费者的队列中,这通常是在一个不同的过程中.

没有用于创建新缓冲区并将其添加到队列使用的集合或从队列中提取缓冲区的公共机制,因此您无法在侧面实现DIY缓冲方案.没有公共接口可以更改池中的缓冲区数量.

了解导致打嗝的原因是很有用的.用于分析此类问题的Android工具是systrace,可在Android 4.1(docs,example,bigflake example)中找到.如果您可以确定cpu负载的来源,或者确定它不是cpu而是某些代码变得混乱,那么您可能会有一个解决方案比向Surface添加更多缓冲区容易得多.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...