【问题标题】:H264 HW accelerated decoding in Android using stagefright library在 Android 中使用 stagefright 库的 H264 硬件加速解码
【发布时间】:2014-03-21 17:23:30
【问题描述】:

我正在尝试使用带有 Stagefright 库的硬件来解码 h264 视频。

我在here 中使用了一个示例。我在MedaBuffer 中获取解码数据。为了渲染MediaBuffer->data(),我在 AwesomePlayer.cpp 中尝试了AwesomeLocalRenderer

但屏幕画面失真

这里是原始和崩溃图片的Link

并且在例子中也试过这个`

sp<MetaData> metaData = mVideoBuffer->meta_data();
int64_t timeUs = 0;
metaData->findInt64(kKeyTime, &timeUs);
native_window_set_buffers_timestamp(mNativeWindow.get(), timeUs * 1000);
err = mNativeWindow->queueBuffer(mNativeWindow.get(), 
mVideoBuffer->graphicBuffer().get(), -1);`

但是我的本机代码崩溃了。我无法获得真实图片,它或损坏或黑屏。

提前致谢。

【问题讨论】:

  • FWIW,在 Android 4.1+ 中有用于此的公共 API。坏图像看起来像是 YUV 缓冲区中的步幅/对齐问题。
  • 非常感谢您的回复。但我想使用 Android 4.0+。这就是我使用 Android NDK 的原因。

标签: android-ndk ffmpeg hardware-acceleration stagefright


【解决方案1】:

如果您使用的是HW 加速解码器,那么组件输出端口上的分配将基于Native Window。换句话说,输出缓冲区基本上是一个gralloc 句柄,它已被Stagefright 框架传递。 (参考:OMXCodec::allocateOutputBuffersFromNativeWindow)。因此,返回的 MediaBuffer 不应被解释为普通的 YUV 缓冲区。

如果是AwesomeLocalRenderer,框架会在调用mTarget-&gt;render 时执行软件颜色转换,如下所示。如果跟踪代码流,你会发现MediaBuffer的内容被直接解释为YUV缓冲区。

对于HW 加速编解码器,您应该使用AwesomeNativeWindowRenderer。如果您有聘用AwesomeLocalRenderer 的特殊条件,请务必注明。我可以适当地改进这个响应。

P.S:出于调试目的,您还可以参考this question,它捕获了转储YUV数据并对其进行分析的方法。

【讨论】:

  • 非常感谢您的回复。首先,当我尝试 AwesomeNativeWindowRenderer 时,本机代码崩溃了。这是我如何使用它。 mVideoRenderer = new AwesomeNativeWindowRenderer (mNativeWindow, 0); mVideoRenderer->渲染(mVideoBuffer); //在while循环中。这是回溯。 #00 pc 00000000 #01 pc 00005678 mylib.so (AwesomeNativeWindowRenderer::render (android::MediaBuffer*)+260) 当我使用 addr2line 时,这个 status_t err = mNativeWindow->queueBuffer( mNativeWindow.get(), 缓冲区->graphicBuffer().get(), -1);错误可能在 -1 中。
  • @user3215358.. 在您的代码中,您是如何创建mNativeWindow 的? -1 出现在AOSP 代码中,因此,我不会怀疑它。您可以分享您的代码以供审核吗? mNativeWindow 应该指向一个 SurfaceSurfaceTextureClient,它在内部有一个 SurfaceTexture 附加到它上面。我怀疑mNativeWindow 可能没有正确填充。
  • @Ganesh .. 我从 SurfaceView 获取 mNativeWindow。这是我如何获取它的代码link
  • @Ganesh.. 我正在使用 This 教程并且我正在更改阅读和解码部分。
  • @user3215358.. 我需要一些时间来审核.. 但是您能快速启用BufferQueue 中的日志并检查吗?
猜你喜欢
  • 2012-10-08
  • 2015-11-29
  • 2012-02-24
  • 2014-05-13
  • 2016-10-27
  • 2012-07-04
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
相关资源
最近更新 更多