4

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

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

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

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

所以现在我的问题是

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

所以对于我的问题...

  • 如何支持其他视频格式?我应该使用 stagefright 还是应该切换到 ffmpeg?
  • 我怎样才能提高性能?我应该能够支持至少 720p 吗?
  • 我应该直接使用 OpenGL 调用而不是处理吗?这会提高性能吗?
  • 如何在播放期间同步音频帧?
4

1 回答 1

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 中,awesome player 使用 Audio Player 播放音频。这个播放器实现了一个提供时间数据的接口。很棒的播放器使用它来渲染视频。基本上,当视频帧的呈现时间与正在播放的音频样本匹配时,就会呈现视频帧。

沙什

于 2011-07-29T18:06:06.050 回答