android - 运行 Traceview 方法分析时 MediaCodec 不返回缓冲区

标签 android android-mediacodec

启用 Traceview 方法分析时,MediaCodec 似乎不返回输入或输出缓冲区。重现步骤:

  1. 在 Eclipse 中,运行 Grafika。
  2. 在 Grafika 中,选择“播放视频 (TextureView)”并点击“开始”。
  3. 在 Eclipse DDMS 中,单击“开始方法分析”并保持对话框打开。
  4. 在 Grafika 中,点击“播放”并快速返回到 Eclipse 并单击“确定”。单击“确定”后,Grafika 将显示为挂起(不再绘制任何帧)。

Grafika 详细日志显示,在方法分析停止之前,MediaCodec 没有可用的输入或输出缓冲区。

我的猜测是 MediaCodec 在幕后做了一些 Looper 的事情,这可能与 Traceview 的实现方式冲突,但这只是一个猜测。

这是一个已知问题吗?有没有办法解决它并使用 MediaCodec 分析应用程序?

最佳答案

糟糕。

来自 dalvik/vm/Thread.cpp (第 2105 行):

/*
 * If we're doing method trace profiling, we don't want threads to exit,
 * because if they do we'll end up reusing thread IDs.  This complicates
 * analysis and makes it impossible to have reasonable output in the
 * "threads" section of the "key" file.

通常情况下这很好——如果线程正在退出,它就没有什么可做的了,所以我们让它再多呆一会儿也没关系。 Thread#join() 的信号已经发生,所以没有什么可做的。

但在这种情况下,线程被提供 onFrameAvailable() 回调的 native ACodec 线程暂时附加到 VM。所以这个纯 native 线程想要将自己附加到 VM,调用回调,分离自己,然后回去工作。但是因为方法分析处于 Activity 状态,线程分离会停止,直到方法分析完成......但是方法分析在代码执行恢复之前不会完成。所以我们陷入了僵局。

所以这里有两个问题:

  1. Dalvik 不应该让线程保持 Activity 状态。这会使方法分析变得更加复杂,因为它失去了方便的唯一线程 ID,但这只是一个内务管理问题。
  2. libstagefright 不应在每次要发送“帧可用”消息时附加和分离。这是一个相对昂贵的操作,需要分配一个 Thread 对象,挫败免分配运行的尝试。

我没有看到通过更改应用程序来解决此问题的干净方法——您必须在没有框架可用通知的情况下离开。最好的办法是放弃 TraceView 分析并使用 systrace相反。

关于android - 运行 Traceview 方法分析时 MediaCodec 不返回缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21897288/

相关文章:

android - 如何通过java代码去除checkbox的按钮图片?

android - Realm 中的多态关系

android - 如何在 VerticalScroller(android 开发人员撰写)中显示指标?

java - 文本呈现在实心矩形上,但不呈现在渐变上

java - android应用程序,其中包含指向特定应用程序的快捷方式图标

android - 无法从 Android 将视频作为 rtp 流发送

android - 如何使用 MediaCodec Android 压缩 mp4 视频?

java - mediacodec ExtractMpegFramesTest 示例不匹配

android - 解码音频文件并重新编码为所需的 PCM 格式 : 44, 100 kHz,2 channel ,16 位

Android:如何将 MediaMuxer 与视频/mp4v-es 而不是视频/avc 一起使用?