我正在尝试使用带有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);`
但我的本机代码崩溃了。我无法获得真实的图像或损坏或黑屏。
先谢谢。
答案 0 :(得分:0)
如果您使用HW
加速解码器,则组件输出端口上的分配将基于Native Window
。换句话说,输出缓冲区基本上是gralloc
句柄,已由Stagefright
框架传递。 (参考:OMXCodec::allocateOutputBuffersFromNativeWindow
)。因此,返回的MediaBuffer
不应被解释为普通的YUV
缓冲区。
如果是AwesomeLocalRenderer
,框架会在调用mTarget->render
时执行软件颜色转换,如下所示。如果您跟踪代码流,您会发现MediaBuffer
内容直接解释为YUV
缓冲区。
对于HW
加速编解码器,您应该使用AwesomeNativeWindowRenderer
。如果您有使用AwesomeLocalRenderer
的任何特殊条件,请突出显示相同内容。我可以适当地改进这个回应。
P.S:出于调试目的,您还可以参考this question,它捕获了转储YUV数据并进行分析的方法。