小编Bra*_*ram的帖子

使用硬件加速的Android MediaCodec解码器在本机代码中访问冲突

我的目标是使用Android MediaCodec解码视频流,然后使用输出图像在本机代码中进行进一步的图像处理.

平台:华硕tf700t android 4.1.1.测试流:H.264全高清@ 24 frm/s

有了Tegra-3 SoC,我依靠硬件支持视频解码.在功能上,我的应用程序表现得如预期的那样:我确实可以访问解码器图像并正确处理它们.但是,我遇到了非常高的解码器CPU负载.

在以下实验中,过程/线程负载由adb shell中的"top -m 32 -t"测量.为了从"top"获得可靠的输出,所有4个cpu内核都通过运行一些永久循环以最低优先级循环的线程来强制激活.这通过重复执行"cat/sys/devices/system/cpu/cpu [0-3]/online"来确认.为了简单起见,只有视频解码,没有音频; 并且没有时序控制,因此解码器尽可能快地运行.

第一个实验:运行应用程序,调用JNI处理函数,但所有进一步的处理调用都被注释掉了.结果:

  • 吞吐量:25 frm/s
  • 1%加载应用程序的线程VideoDecoder
  • 24%负载的进程/系统/ bin/mediaserver的线程Binder_3

似乎解码速度受CPU限制(四核CPU的25%)......启用输出处理时,解码图像正确并且应用程序正常工作.唯一的问题:解码时cpu负载过高.

经过大量的实验,我考虑给MediaCodec一个表面来绘制它的结果.在所有其他方面,代码是相同的.结果:

  • 吞吐量55 frm/s(不错!!)
  • 2%加载应用程序的线程VideoDecoder
  • 1%加载进程/ system/bin/mediaserver的线程mediaserver

实际上,视频显示在提供的Surface上.由于几乎没有任何CPU负载,这必须是硬件加速......

如果提供Surface,de MediaCodec似乎只使用硬件加速?

到现在为止还挺好.我已经倾向于使用Surface作为解决方法(不是必需的,但在某些情况下甚至是一个很好的).但是,如果提供表面,我无法访问输出图像!结果是本机代码中的访问冲突.

这真让我困惑!我没有看到的访问限制任何想法,任何或文档中http://developer.android.com/reference/android/media/MediaCodec.html.此外,谷歌I/O演示文稿http://www.youtube.com/watch?v=RQws6vsoav8中也未提及此方向.

那么:如何使用硬件加速Android MediaCodec解码器并以原生代码访问图像?如何避免访问冲突?任何帮助都会被激活!也有任何解释或提示.

我敢肯定的MediaExtractor和MediaCodec正确使用,因为该应用程序是functionaly OK(只要我不提供表面).它仍然是非常实验性的,在todo列表上有一个很好的API设计;-)

请注意,两个实验之间的唯一区别是变量mSurface:null或"mDecoder.configure(mediaFormat,mSurface,null,0)中的实际Surface";

初始化代码:

mExtractor = new MediaExtractor();
mExtractor.setDataSource(mPath);

// Locate first video stream
for (int i = 0; i < mExtractor.getTrackCount(); i++) {
    mediaFormat = mExtractor.getTrackFormat(i);
    String mime = mediaFormat.getString(MediaFormat.KEY_MIME);
    Log.i(TAG, String.format("Stream %d/%d %s", i, mExtractor.getTrackCount(), mime));
    if (streamId …
Run Code Online (Sandbox Code Playgroud)

android access-violation native-code

5
推荐指数
1
解决办法
3111
查看次数

标签 统计

access-violation ×1

android ×1

native-code ×1