在 Xperia Z1 上使用 MediaCodec 编码相机预览帧时视频质量不一致

And*_*nih 5 android android-mediacodec

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

MediaCodec的格式是COLOR_FormatYUV420SemiPlanar(NV12我通过交换 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);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

任何意见,将不胜感激。

mst*_*sjo 5

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

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

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

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

  • 啊,我应该从 U/V 交换言论中知道这一点。如果您可以将应用程序限制为 API 18+,并且不需要编辑 YUV 空间中的帧,那么您应该考虑切换到 Surface - 它效率更高。Grafika 很乐意在我的 Nexus 7 (2012) 上编码 60fps 预览。(https://github.com/google/grafika) (2认同)