android – 缓冲SurfaceCodec的Surface输入

前端之家收集整理的这篇文章主要介绍了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添加更多缓冲区容易得多.

原文链接:https://www.f2er.com/android/314415.html

猜你在找的Android相关文章