【问题标题】:Buffering Surface input to MediaCodec将 Surface 输入缓冲到 MediaCodec
【发布时间】:2013-10-15 22:07:48
【问题描述】:

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

在我的experiments 中,Galaxy Nexus 在使用CameraToMpegTest.java 中的直接同步编码方法生成音频/视频流时遇到了无法接受的问题

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

想法

  1. 有没有办法将使用EGL14.eglCopyBuffers(EGLDisplay d, EGLSurface s, NativePixmapType p) 创建的NativePixmapType 提供给MediaCodec

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

【问题讨论】:

  • 那么,在将帧传递到 MediaCodec 的输入时,您是否找到了解决问题的方法?就我而言,我在将 MediaCodec 的输出提供给 MediaMuxer 时对其进行缓冲。但是在调用 swapBuffers() 来提供 MediaMuxer 的输入时,我遇到了问题。

标签: android android-mediacodec


【解决方案1】:

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

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

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

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

【讨论】:

  • 好建议! Systrace 确实帮了大忙。是否可以嵌套Trace 段?我似乎无法显示在父级中开始和结束的片段。
  • 它应该可以工作。我尝试了一个简单的示例(两个beginSection()onCreate() 中的不同点调用,两个endSection() 在最后调用)并得到了我的预期。
  • 我在尝试从设备上的 h264 TS 文件或通过 UDP(实时摄像头馈送或从服务器流式传输 H264 TS)流式传输视频时在平板电脑上看到“打嗝” Galaxy Note 10.1使用 4.1.2(我认为,它不在我面前)打嗝并且总是返回 0 的 BufferInfo.size(我们已经将我们的最小 sdk 提高到 18(4.3),因为那时 CTS for codec 进入)。 .. 然而,Lenovo Yoga 10 @4.3 在播放过程中出现了稳定的卡顿……它的出现是因为输入缓冲区很少可用……
  • 我正在使用与 Grafika“显示和捕获视频”示例类似的管道。调用 swapBuffers() 将缓冲区传送到 MediaCodec 会变得很慢。同时执行 Android alpha 动画会进一步降低 swapBuffers() 的性能。也许 GPU 的填充率是瓶颈。这个答案提出的解决方案是什么?
  • @Petrakeas:您应该创建一个新问题,而不是评论现有答案。使用 [android] [mediacodec] [grafika] 的标签,并详细描述您要做什么以及如何衡量性能。
猜你喜欢
  • 2016-05-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多