我正在尝试使用Android MediaCodec API对NV12流进行硬件编码(avc)。
使用OMX.qcom.video.encoder.avc时,分辨率1280x720和640x480工作正常,而其他(即640x360,320x240,800x480)产生输出,其中色度分量似乎发生偏移(请参阅snapshot)。
我通过将输入图像保存到jpeg文件来仔细检查输入图像是否正确。 此问题仅发生在QualComm设备(即三星Galaxy S4)上。
任何人都能正常使用吗?还需要任何额外的设置/怪癖吗?
答案 0 :(得分:3)
解码器(MediaCodec)有其MediaFormat,可以使用getOutputFormat接收。返回的实例可以打印到日志。在那里你可以看到一些有用的信息。例如,在您的情况下,像“slice-height”这样的值可能很有用。我怀疑它等于1280x720和640x480的高度,并且与其他分辨率不同。可能你应该使用这个值来获得色度偏移。
答案 1 :(得分:3)
是的,OMX.qcom.video.encoder.avc会这样做但不会在所有设备/ android版本上。在我的带有Android 4.3的Nexus 4上,编码器工作正常,但不在我的S3上(运行4.1)
使用OMX.qcom.video.encoder.avc(似乎某些S3有另一个编码器)运行4.1的S3的解决方案是在Chroma窗格之前添加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。
您的快照显示了我所拥有的相同类型的文物,您可能需要针对某些分辨率进行类似的黑客攻击,可能需要另一个填充长度
您还应该避免使用不是16的倍数的分辨率,即使在4.3显然(http://code.google.com/p/android/issues/detail?id=37769)!