将MediaCodec解码视频帧绘制到屏幕的最快方法?

时间:2013-11-25 21:15:39

标签: android surfaceview yuv decoder mediacodec

我正在寻找从MediaCodec解码器接收图像帧并将其绘制到Android设备屏幕的最快方法。重要的限制和解释是:

  1. 无法使用MediaPlayer。不允许使用中间应用程序。

  2. 必须尽快将MediaCodec解码器的输出帧绘制到屏幕上(最小化延迟)。

  3. 可用的解码器输出格式如下:
    ColorFormat [0] 0x00000013 COLOR_FormatYUV420Planar
    ColorFormat [1] 0x00000015 COLOR_FormatYUV420SemiPlanar
    ColorFormat [2] 0x7F000001 OMX_SEC_COLOR_FormatNV12TPhysicalAddress
    ColorFormat [3] 0x7FC00002 OMX_SEC_COLOR_FormatNV12Tiled

  4. 视频分辨率以及每个输出帧的分辨率为960x720。

  5. 目标平台是Galaxy Note II,该方法可以特定于该平台(例如,利用可用的硬件功能)。这不需要在其他平台上工作或是通用解决方案。

  6. 采用不到66毫秒的方法会很好。不到33毫秒会很棒。我目前的方法需要80-90毫秒,这很糟糕。 (我不打算去描述它,因为我不想在任何特定的方向上扭曲答案。)

1 个答案:

答案 0 :(得分:7)

您最好的选择是直接解码为Surface。解码到ByteBuffer会让你慢下来。 bigflake上的一些示例(例如ExtractMpegFramesTest)将解码器的输出发送到屏幕外表面并使用GLES进行检查,但这是一个简单的更改,使其适用于屏幕SurfaceView

更新: Grafika有两个不同的基于MediaCodec的视频播放器,分别将输出发送到SurfaceView和TextureView。