如何使ffmpeg与Android内置的视频播放器一样高效?

4

我有一个基于https://ikaruga2.wordpress.com/2011/06/15/video-live-wallpaper-part-1/的项目,它使用了http://bambuser.com/opensource 的旧版ffmpeg库。在这个项目中的C++代码中,我们有如下代码行:

        unsigned long long current = GetCurrentTimeInNanoseconds();
        avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, packet.data, packet.size);
        __android_log_print(ANDROID_LOG_DEBUG, "getFrame>>>>", "decode video time: %llu", (GetCurrentTimeInNanoseconds() - current)/1000000);

这段代码在 Xperia Ion 上对每个帧进行解码,每个帧的解码时间在60到90毫秒之间,使用1280x720 h264源视频文件。将帧输出到屏幕的其他处理平均需要30毫秒以上,变化很小。这导致帧速率为10-11fps。
忽略其他处理,平均需要75ms的解码将导致13fps。然而,当我浏览SD卡并单击该mp4文件以在本机查看器中打开它时,它以完整的30fps显示。此外,当我在本机查看器中打开相同mp4的1920x1080版本时,它也以完整的30fps运行,没有卡顿或延迟。这表明(对于我这个新手来说)存在非常严重的问题,因为硬件显然能够快速解码多次。
有哪些标志或选项可以传递给avcode_decode_video以优化解码速度,使其与本机查看器的速度相匹配?是否可以在其他地方进行优化以进一步优化速度?本机查看器可以几乎快一个数量级地解码的原因是什么?
下面的回答非常有帮助,但目前对我来说不太实用。与此同时,通过许多小时的试错,我已经成功地通过一些最佳编码标志将解码时间减少了70%。以下是我用于编码的ffmpeg参数,以防对其他人有所帮助:
        ffmpeg.exe -i "#inputFilePath#" -c:v libx264 -preset veryslow -g 2 -y -s 910x512 -b 5000k -minrate 2000k -maxrate 8000k -pix_fmt yuv420p -tune fastdecode -coder 0 -flags -loop -profile:v main -x264-params subme=5:ref=4 "#ouputFilePath#"

使用这些设置,ffmpeg在20-25秒内解码帧,但是通过sws_scale然后写入纹理,我在Xperia Ion上仍然停留在约22 FPS,在比我想要的低分辨率下。
1个回答

1
本地查看器使用硬件h264解码器,而ffmpeg通常是纯软件的。您必须使用libstagefright构建ffmpeg。

libstagefright选项已被取消。

谢谢。您能否提供有关如何操作的说明链接或获取编译库的下载位置?后者很重要,因为上次我尝试编译ffmpeg时(在我提供的链接中的步骤3-8),由于我使用的是Windows操作系统,没有Linux机器,CygWin无法正常工作,因此编译变得不可能。 - Nicholas
1
在Windows上编译FFmpeg非常麻烦,而为Android交叉编译则更加困难。我建议您下载VirtualBox或其他免费虚拟机环境并在其中安装Ubuntu。您可以在http://www.origenboard.org/wiki/index.php/FFmpeg_on_Android找到预构建的库,但我个人没有使用过这个项目。 - Alex Cohn
请参考https://dev59.com/HW445IYBdhLWcg3wucmo以及其中的参考资料。 - Alex Cohn
谢谢,我稍后会审查它们,并回复告知结果。 - Nicholas
我查看了两个链接以及每个链接中的链接。不幸的是,我没有找到太多关于预构建库的内容。我会继续努力,并在找到任何信息时回复。 - Nicholas

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