5

我正在编码NV21来自相机预览的帧。由于某种原因,在其他设备上运行良好的架构Sony Xperia Z1Android 4.3. 它发回质量不正确(低)的编码帧。

MediaCodec的格式是COLOR_FormatYUV420SemiPlanarNV12我通过交换 U 和 V 分量转换NV21为)。NV12发回给我的输出缓冲区的大小非常小,与我正在使用的分辨率 ( ) 和比特率 ( )MediaCodec不对应。前几帧质量很好,但随后显着下降:1280x7201000000

int encoderStatus = mMediaCodec.dequeueOutputBuffer(mBufferInfo, TIMEOUT_USEC);
// a few encoderStatus checks skipped
ByteBuffer encodedData = outputBuffers[encoderStatus];
Log.i(Constants.TAG, "Buffer size " + mBufferInfo.size);

这给了我关于 Xperia Z1 的以下日志:

Buffer size 26
Buffer size 52172
Buffer size 23650
Buffer size 14394
Buffer size 3591
Buffer size 1849
Buffer size 3908

...

Buffer size 1043
Buffer size 248
Buffer size 836
Buffer size 518
Buffer size 1112

正常工作的示例日志Sony Xperia ZR

Buffer size 21
Buffer size 51048
Buffer size 21063
Buffer size 24228
Buffer size 28040
...
Buffer size 44959
Buffer size 44972
Buffer size 44957
Buffer size 45004
Buffer size 44999
Buffer size 44957

任何意见,将不胜感激。

4

1 回答 1

5

您确定您以正确的单位(微秒)传递时间戳 - 并且它设置了合理的帧速率吗?

  • 一些编码器可能会忽略时间戳,并且仅根据帧速率设置每帧的固定比特率预算。

  • 其他人可能会尝试根据时间戳计算每帧允许使用多少位。

如果时间戳以例如毫秒为单位给出,这可能导致编码器将编码帧的大小减小到零。

于 2013-12-18T16:12:39.470 回答