在 Android 上解码和渲染视频

发布于 2024-11-25 14:18:08 字数 608 浏览 0 评论 0原文

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

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

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

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

所以现在我的问题是

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

那么对于我的问题...

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

What I need to do is to decode video frames and render the frames on a trapezoidal surface. I'm using Android 2.2 as my development platform

I'm not using the mediaplayer service since I need access to the decoded frames.

Here's what I have so far:

  • I am using stagefright framework to extract decoded video frames.
  • each frame is then converted from YUV420 to RGB format
  • the converted frames are then copied to a texture and rendered to an OpenGL surface
  • Note that I am using Processing and not using OpenGL calls directly.

So now my problems are

  • i can only decode mp4 files with stagefright
  • the rendering is too slow, around 100ms for a 320x420 frame
  • there is no audio yet, I can only render videos but I still don't know how to synchronize the playing of the audio frames.

So for my questions...

  • how can I support other video formats? Shoud I use stagefright or should I switch to ffmpeg?
  • how can I improve the performance? I should be able to support at least 720p?
  • Should I use OpenGL calls directly instead of Processing? Will this improve the performance?
  • How can I sync the audio frames during playback?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寻梦旅人 2024-12-02 14:18:08

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

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

播放性能

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

音频视频同步

音频时间用作参考。在 Stagefright 中,awesome Player 使用音频播放器来播放音频。该播放器实现了一个用于提供时间数据的接口。 Awesome Player 使用它来渲染视频。基本上,当视频帧的呈现时间与正在播放的音频样本的呈现时间匹配时,就会渲染视频帧。

沙什

Adding other video formats and codecs to stagefright

If you have parsers for "other" video formats, then you need to implement Stagefright media extractor plug-in and integrate into awesome player. Similarly if you have OMX Components for required Video Codecs, you need to integrate them into OMXCodec class.
Using FFMPEG components in stagefright, or using FFMPEG player instead of stagefright does not seem trivial.
However if required formats are already available in Opencore, then you can modify Android Stack so that Opencore gets chosen for those formats. You need to port the logic of getting YUV data to Opencore.
(get dirty with MIOs)

Playback performance

The surface flinger, used for normal playback uses Overlay for rendering. It usually provides around 4 - 8 video buffers (so far what I have seen). So you can check how many different buffers you are getting in OPEN GL rendering. Increasing buffer will definitely improve the performance.
Also, check time taken for YUV to RGB conversion. Can optimize or use opensource library to improve performance.
Usually Open GL is not used for Video Rendering (known for Graphics). So not sure on the performance.

Audio Video Sync

Audio time is used as reference. In Stagefright, awesome player uses Audio Player for playing out audio. This player implements an interface for providing time data. Awesome player uses this for rendering Video. Basically Video frames are rendered when their presentation time matches with that of audio sample being played.

Shash

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文