首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过MediaCodec应用编程接口让QualComm编码器工作

通过MediaCodec应用编程接口让QualComm编码器工作
EN

Stack Overflow用户
提问于 2013-07-06 00:19:03
回答 2查看 4.7K关注 0票数 6

我正在尝试做硬件编码(avc)的NV12流使用安卓MediaCodec API。

使用OMX.qcom.video.encoder.avc时,分辨率1280x720和640x480可以正常工作,而其他分辨率(即640x360、320x240、800x480)会在色度分量似乎发生偏移的地方产生输出(请参阅snapshot)。

我已经通过将输入图像保存到jpeg文件中来再次检查输入图像是否正确。此问题仅在QualComm设备(即三星Galaxy S4)上出现。

有没有人能正常工作?是否需要额外的设置/怪癖?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-08 05:50:49

解码器(MediaCodec)有自己的MediaFormat,可以使用getOutputFormat接收。返回的实例可以打印到日志中。在那里你可以看到一些有用的信息。例如,在您的示例中,像"slice-height“这样的值可能会很有用。我怀疑对于1280x720和640x480,它等于高度,而对于其他分辨率,它是不同的。也许你应该使用这个值来获得色度偏移量。

票数 4
EN

Stack Overflow用户

发布于 2013-11-10 05:12:57

是的,OMX.qcom.video.encoder.avc可以做到这一点,但并不是在所有的设备/安卓版本上。在我的Nexus4和Android4.3上,编码器工作得很好,但在我的S3 (运行4.1)上不行。

对于使用OMX.qcom.video.encoder.avc运行4.1的S3 (似乎有些S3有另一个编码器)的解决方案是在色度窗格之前添加1024个字节。

代码语言:javascript
复制
// The encoder may need some padding before the Chroma pane
int padding = 1024;                     
if ((mWidth==640 && mHeight==480) || mWidth==1280 && mHeight==720) padding = 0;

// Interleave the U and V channel
System.arraycopy(buffer, 0, tmp, 0, mYSize); // Y
for (i = 0; i < mUVSize; i++) {
   tmp[mYSize + i*2 + padding] = buffer[mYSize + i + mUVSize]; // Cb (U)
   tmp[mYSize + i*2+1 + padding] = buffer[mYSize + i]; // Cr (V)
}
return tmp;

摄像机使用YV12和编码器COLOR_FormatYUV420SemiPlanar。

你的快照显示了和我一样的伪像,你可能需要一个类似的hack来处理一些分辨率,可能需要不同的填充长度。

你也应该避免分辨率不是16的倍数,即使是4.3 (http://code.google.com/p/android/issues/detail?id=37769)!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17493169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档