使用stagefright库在Android中进行H264硬件加速解码

时间:2014-02-20 16:12:32

标签: android-ndk ffmpeg hardware-acceleration stagefright

我正在尝试使用带有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);`

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

先谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

对于HW加速编解码器,您应该使用AwesomeNativeWindowRenderer。如果您有使用AwesomeLocalRenderer的任何特殊条件,请突出显示相同内容。我可以适当地改进这个回应。

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