“Android + FFMpeg”的友谊真的有用吗?

这个问题并不意味着我有兴趣,如果ffmpeg代码可以在Andoid上使用。 我知道它可以。 我只是问,如果有人有真正的性能取得进展。 经过几个星期的实验,我已经创造了这个问题,我已经足够了…我不想写信给人们甚至不知道他们解码什么样的video(分辨率,编解码器)和谈话的分支只有一些神秘的FPS。 我只是不明白他们想做什么。 此外,我不打算开发仅适用于我的手机或具有一些扩展OpenGLfunction的Android 2.2 ++手机的应用程序。 我有相当受欢迎的手机HTC Desire,所以如果应用程序不工作,那么接下来呢?

那么,我有什么?

  1. 来自最新HEAD分支的FFMpeg源代码。 其实我不能用NDK5弄破它,所以我决定使用被盗的。

  2. Bambuser的构build脚本(bash)与适当的ffmpeg源代码([web]: http : //bambuser.com/r/opensource/ffmpeg-4f7d2fe-android-2011-03-07.tar.gz )。 使用NDK5进行一些更正后,它可以很好地build立起来。

  3. Rockplayer的凝聚ffmpeg源代码与巨大的Android.mk的能力build立脚本([url]: http ://www.rockplayer.com/download/rockplayer_ffmpeg_git_20100418.zip)。 它经过一些修正后由NDK3和NDK5构build。 Rockplayer可能是Android最酷的媒体播放器,我想我会有一些特殊的使用它的构build。

我有一个项目适合的video(不大,不小):600×360 H.264。

我们从第2章和第3章中得到的两个库为我们提供了从video(逐帧,search等)获取帧的可能性。 我没有试图获得一个音轨,因为我不需要一个项目。 我不会在这里发布我的源代码,因为我认为这是传统的,很容易find。

那么,video的结果是什么? HTC Desire,Android 2.2 600×360,H.264解码和渲染都在不同的线程中

  1. Bambuser(armv5te的NDK5 buld,RGBA8888):平均33 ms /帧。
  2. Rockplayer(NDK3为霓虹灯,RGB565构build):平均27ms /帧。

对于第一次看,这不坏,但只是认为这些只是解码帧的结果。 如果有人有更好的解码时间的结果,让我知道。

渲染video最困难的事情就是渲染。 如果我们有位图600×360,我们应该在绘画之前以某种方式缩放,因为不同的手机具有不同的屏幕尺寸,我们不能指望我们的video尺寸与屏幕尺寸相同。

我们有什么select来重新调整一个框架,以适应屏幕? 我能够检查(相同的电话和video源)这些情况:

  1. 在Bambuser的构build中的sws_scale()C函数:70毫秒/帧。 不能接受的。
  2. 在Android(Bitmap.createScaledBitmap)中,愚蠢的位图重新缩放:65毫秒/帧。 不能接受的。
  3. OpenGL渲染正投影在纹理四。 在这种情况下,我不需要缩放框架。 我只需要准备纹理1024×512(在我的情况下是RGBA8888)包含帧像素,并在GPU(gl.glTexImage2D)中加载它。 结果:〜220毫秒/帧来渲染。 不能接受的。 我没有想到,glTexImage2D只是吸在Snapdragon CPU上。

就这样。 我知道有一些方法使用片段着色器来转换使用GPU的YUV像素,但我们将有相同的glTexImage2D和200毫秒只是纹理加载。

但是,这不是结束。 …我唯一的朋友结束… :)这不是绝望的条件。

试图使用RockPlayer你一定会想知道他们如何做这个该死的框架缩放如此之快。 我想他们在ARM架构方面有非常好的经验。 他们最有可能使用avcodec_decode_video2和img_convert(就像我在RP版本中那样),但是接下来他们使用一些技巧(取决于ARM版本)进行缩放。 也许他们也有一些“魔术”buldconfiguration为ffmpeg减less解码时间,但他们发布的Android.mk不是他们使用的Android.mk。 不知道…

所以,现在看起来你不能仅仅为了ffmpeg而build立一个简单的JNI桥梁,而要为Android平台提供真正的媒体播放器。 只有当您有合适的video时,您才能做到这一点,您不需要缩放。

有任何想法吗? 为你祈祷 ;)

Solutions Collecting From Web of "“Android + FFMpeg”的友谊真的有用吗?"

我没有在android上编译ffmpeg。 从这个angular度来讲,播放video纯粹是依赖于实现的,所以没有必要在需要的地方高度优化,而不是使用标准的swscale来测量延迟。 是的 – 你可以build立一个简单的JNI桥,并在NDK中使用它来执行ffmpeg调用,但这已经是一个玩家代码。

根据我的经验,YUV到RGB的转换一直是瓶颈。 因此, 使用OpenGL着色器certificate了这一点。

我为我的项目使用http://writingminds.github.io/ffmpeg-android-java/ 。 对复杂的命令有一些解决方法,但对于简单的命令,包装器对我来说工作得很好。