我正在尝试做硬件编码(avc)的NV12流使用安卓MediaCodec API。
使用OMX.qcom.video.encoder.avc时,分辨率1280x720和640x480可以正常工作,而其他分辨率(即640x360、320x240、800x480)会在色度分量似乎发生偏移的地方产生输出(请参阅snapshot)。
我已经通过将输入图像保存到jpeg文件中来再次检查输入图像是否正确。此问题仅在QualComm设备(即三星Galaxy S4)上出现。
有没有人能正常工作?是否需要额外的设置/怪癖?
发布于 2013-07-08 05:50:49
解码器(MediaCodec)有自己的MediaFormat,可以使用getOutputFormat接收。返回的实例可以打印到日志中。在那里你可以看到一些有用的信息。例如,在您的示例中,像"slice-height“这样的值可能会很有用。我怀疑对于1280x720和640x480,它等于高度,而对于其他分辨率,它是不同的。也许你应该使用这个值来获得色度偏移量。
发布于 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个字节。
// 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)!
https://stackoverflow.com/questions/17493169
复制相似问题