在Android上解码和渲染视频

时间:2011-07-21 16:48:35

标签: android opengl-es processing android-video-player stagefright

我需要做的是解码视频帧并在梯形表面上渲染帧。我正在使用Android 2.2作为我的开发平台

我没有使用媒体播放器服务,因为我需要访问已解码的帧。

这是我到目前为止所拥有的:

  • 我正在使用stagefright框架来提取已解码的视频帧。
  • 然后将每个帧从YUV420转换为RGB格式
  • 然后将转换的帧复制到纹理并渲染到OpenGL表面
  • 请注意,我正在使用Processing而不是直接使用OpenGL调用。

所以现在我的问题是

  • 我只能使用stagefright
  • 解码mp4文件
  • 渲染太慢,对于320x420帧大约100ms
  • 还没有音频,我只能渲染视频,但我仍然不知道如何同步播放音频帧。

所以我的问题......

  • 我如何支持其他视频格式?我应该使用stagefright还是应该切换到ffmpeg?
  • 我该如何改善表现?我应该能够支持至少720p?
  • 我应该直接使用OpenGL调用而不是Processing吗?这会改善性能吗?
  • 如何在播放期间同步音频帧?

1 个答案:

答案 0 :(得分:2)

将其他视频格式和编解码器添加到stagefright

如果你有“其他”视频格式的解析器,那么你需要实现Stagefright媒体提取器插件并集成到真棒播放器中。同样,如果您有所需视频编解码器的OMX组件,则需要将它们集成到OMXCodec类中。 在stagefright中使用FFMPEG组件,或使用FFMPEG播放器而不是stagefright似乎并不重要。 但是,如果Opencore中已经提供了所需的格式,那么您可以修改Android Stack,以便为这些格式选择Opencore。您需要将获取YUV数据的逻辑移植到Opencore。 (与MIO肮脏)

播放效果

用于正常播放的表面褶皱使用Overlay进行渲染。它通常提供大约4-8个视频缓冲区(到目前为止我所看到的)。因此,您可以检查在OPEN GL渲染中获得的缓冲区数量。增加缓冲区肯定会提高性能。 另外,检查YUV到RGB转换所花费的时间。可以优化或使用开源库来提高性能。 通常Open GL不用于视频渲染(以图形而闻名)。所以不确定表现。

音频视频同步

音频时间用作参考。在Stagefright中,真棒播放器使用音频播放器播放音频。该播放器实现了一个提供时间数据的界面。真棒玩家使用它来渲染视频。基本上,当视频帧的呈现时间与正在播放的音频样本的呈现时间匹配时,呈现视频帧。

词shash