在安卓系统上解码和渲染视频

4
我需要做的是解码视频帧并将这些帧呈现在梯形表面上。我的开发平台是Android 2.2版本。
我不使用MediaPlayer服务,因为我需要访问已解码的帧。
目前我所做的有:
- 我正在使用Stagefright框架提取已解码的视频帧。 - 然后将每一帧从YUV420格式转换为RGB格式。 - 然后将转换后的帧复制到纹理,并呈现到OpenGL表面上。 - 需要注意的是,我正在使用Processing而不是直接使用OpenGL调用。
现在我面临的问题是:
- 我只能使用Stagefright解码MP4文件。 - 渲染太慢,对于320x420的帧约为100ms。 - 尚未添加音频,我只能播放视频,但仍然不知道如何同步播放音频帧。
以下是我的问题:
- 如何支持其他视频格式?我应该使用Stagefright还是切换到FFmpeg? - 如何提高性能?我应该至少支持720p吗? - 我应该直接使用OpenGL调用而不是Processing吗?这样会提高性能吗? - 如何在播放过程中同步音频帧?

Android 2.2...在什么设备上?PC?平板电脑?更新的老款G1 - genpfault
1
它实际上是在一个定制的嵌入式设备上,类似于平板电脑。它基于ARM Cortex A8处理器。希望这回答了你的问题。 - mctma
1个回答

2

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

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

播放性能

用于正常播放的surface flinger使用覆盖层进行渲染。通常会提供大约4-8个视频缓冲区(根据我所见)。因此,您可以检查在OpenGL渲染中获取了多少个不同的缓冲区。增加缓冲区肯定会提高性能。 此外,请检查YUV到RGB转换所需的时间。可以优化或使用开源库来提高性能。 通常不使用OpenGL进行视频渲染(用于图形),因此不确定性能。

音视频同步

音频时间用作参考。在Stagefright中,Awesome Player使用音频播放器播放音频。此播放器实现了提供时间数据的接口。 Awesome Player将其用于呈现视频。基本上,当视频帧的呈现时间与正在播放的音频样本的时间匹配时,才会呈现视频帧。

Shash


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接