缓冲表面输入到MediaCodec

时间:2013-10-08 19:48:20

标签: android mediacodec

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

在我的experiments中,Galaxy Nexus在CameraToMpegTest.java

中使用直接同步编码方法制作音频/视频流时遇到了令人无法接受的小问题

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

思想

  1. 有没有办法将NativePixmapType创建的MediaCodec提供给{{1}}?

  2. Android上的任何人都可以评论相机和MediaCodec之间的ByteBuffer格式协调是否在路线图上?

1 个答案:

答案 0 :(得分:3)

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

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

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

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