让QualComm编码器通过MediaCodec API工作

时间:2013-07-05 16:19:03

标签: android video-encoding hardware-acceleration android-hardware mediacodec

我正在尝试使用Android MediaCodec API对NV12流进行硬件编码(avc)。

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

我通过将输入图像保存到jpeg文件来仔细检查输入图像是否正确。 此问题仅发生在QualComm设备(即三星Galaxy S4)上。

任何人都能正常使用吗?还需要任何额外的设置/怪癖吗?

2 个答案:

答案 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)!