在我的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格式是否在路线图上?
解决方法
通过系统移动数据的最有效方法是使用Surface.诀窍是Surface不是缓冲区,它是queue of buffers的接口.缓冲区通过引用传递;当你解锁CanvasAndPost()时,你实际上是将当前缓冲区放在消费者的队列中,这通常是在一个不同的过程中.
没有用于创建新缓冲区并将其添加到队列使用的集合或从队列中提取缓冲区的公共机制,因此您无法在侧面实现DIY缓冲方案.没有公共接口可以更改池中的缓冲区数量.
了解导致打嗝的原因是很有用的.用于分析此类问题的Android工具是systrace,可在Android 4.1(docs,example,bigflake example)中找到.如果您可以确定cpu负载的来源,或者确定它不是cpu而是某些代码变得混乱,那么您可能会有一个解决方案比向Surface添加更多缓冲区容易得多.