【问题标题】:Decoding and Rendering Video on Android在 Android 上解码和渲染视频
【发布时间】:2011-10-10 10:04:47
【问题描述】:

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

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

这是我目前所拥有的:

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

所以现在我的问题是

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

所以对于我的问题...

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

【问题讨论】:

  • Android 2.2...在什么上?个人电脑?药片?更新的年份 G1?
  • 它实际上是在一个定制的嵌入式设备上,或多或少有点像平板电脑。它基于arm cortex a8处理器。希望这能回答你的问题

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


【解决方案1】:

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

沙士

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 2015-08-27
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多