我正在编码来自相机预览的NV21
帧。出于某种原因,在Sony Xperia Z1
上使用Android 4.3
在其他设备上正常运行的架构无法正常工作。它发回的编码帧质量不正确(低)。
MediaCodec
的格式为COLOR_FormatYUV420SemiPlanar
,NV12
(我通过交换U和V组件将NV21
转换为NV12
。 MediaCodec
发回给我的输出缓冲区的大小非常小,与我正在使用的分辨率(1280x720
)和比特率(1000000
)不对应。前几帧的质量很好,但随后它显着下降:
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
任何建议都将受到赞赏。
答案 0 :(得分:4)
你确定你以正确的单位(微秒)传递时间戳 - 并且它设置了合理的帧速率吗?
某些编码器可能会忽略时间戳,并且仅根据帧速率为每帧设置固定的比特率预算。
其他人可能会尝试根据时间戳计算每帧允许使用的位数。
如果给出时间戳,例如以毫秒为单位,这可能导致编码器将编码帧的大小减小到零。