0

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

我在这里使用了一个例子。我正在获取解码数据MedaBuffer。对于渲染,MediaBuffer->data()AwesomeLocalRenderer在 AwesomePlayer.cpp 中尝试过。

但屏幕画面失真

这是原始和崩溃图片的 链接

并在示例中尝试过这个

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);`

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

提前致谢。

4

1 回答 1

0

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

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

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

PS:出于调试目的,您还可以参考这个问题,该问题捕获了转储 YUV 数据并对其进行分析的方法。

于 2014-02-21T00:34:02.073 回答