6

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

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

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

任何人都可以正常工作吗?需要任何额外的设置/怪癖吗?

4

2 回答 2

4

Decoder(MediaCodec) 有它的 MediaFormat,可以使用getOutputFormat接收。返回的实例可以打印到日志中。在那里你可以看到一些有用的信息。例如,在您的情况下,“slice-height”之类的值可能很有用。我怀疑它等于 1280x720 和 640x480 的高度,而其他分辨率则不同。可能你应该使用这个值来获得色度偏移。

于 2013-07-07T21:50:48.727 回答
4

是的,OMX.qcom.video.encoder.avc 可以做到这一点,但不是在所有设备/android 版本上。在我的带有 Android 4.3 的 Nexus 4 上,编码器工作正常,但在我的 S3 上却不行(运行 4.1)

使用 OMX.qcom.video.encoder.avc(似乎某些 S3 有另一个编码器)运行 4.1 的 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 )!

于 2013-11-09T21:12:57.457 回答