我正在寻找从MediaCodec解码器接收图像帧并将其绘制到Android设备屏幕的最快方法。重要的限制和解释是:
无法使用MediaPlayer。不允许使用中间应用程序。
必须尽快将MediaCodec解码器的输出帧绘制到屏幕上(最小化延迟)。
可用的解码器输出格式如下:
ColorFormat [0] 0x00000013 COLOR_FormatYUV420Planar
ColorFormat [1] 0x00000015 COLOR_FormatYUV420SemiPlanar
ColorFormat [2] 0x7F000001 OMX_SEC_COLOR_FormatNV12TPhysicalAddress
ColorFormat [3] 0x7FC00002 OMX_SEC_COLOR_FormatNV12Tiled
视频分辨率以及每个输出帧的分辨率为960x720。
目标平台是Galaxy Note II,该方法可以特定于该平台(例如,利用可用的硬件功能)。这不需要在其他平台上工作或是通用解决方案。
采用不到66毫秒的方法会很好。不到33毫秒会很棒。我目前的方法需要80-90毫秒,这很糟糕。 (我不打算去描述它,因为我不想在任何特定的方向上扭曲答案。)
答案 0 :(得分:7)
您最好的选择是直接解码为Surface
。解码到ByteBuffer
会让你慢下来。 bigflake上的一些示例(例如ExtractMpegFramesTest
)将解码器的输出发送到屏幕外表面并使用GLES进行检查,但这是一个简单的更改,使其适用于屏幕SurfaceView
更新: Grafika有两个不同的基于MediaCodec的视频播放器,分别将输出发送到SurfaceView和TextureView。