如何使ffmpeg像Android的内置视频查看器一样高效?

时间:2015-03-31 01:07:02

标签: android c++ android-ndk ffmpeg

我有一个基于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);

此代码使用1280x720 h264源视频文件连续报告60到90毫秒,以解码Xperia Ion上的每个帧。将帧输出到屏幕的其他处理平均需要30ms,而变化非常小。这导致帧速率为10-11fps。

忽略其他处理,平均75ms的解码将导致13fps。但是,当我浏览我的SD卡并单击该mp4文件以在本机查看器中打开它时,它以完整的30fps显示。此外,当我在本机查看器中打开相同mp4的1920x1080版本时,它也以完整的30fps运行而没有卡顿或延迟。这意味着(对于我的新手来说)某些东西是非常错误的,因为硬件显然能够快速解码很多倍。

可以将哪些标记或选项传递给avcode_decode_video以优化解码速度以匹配本机查看器的速度?可以在其他地方进行优化以进一步优化速度吗?是否有原因使本机查看器可以快速解码几乎一个数量级(考虑到1920x1080源结果)?

修改

以下答案非常有用,但目前对我来说不实用。与此同时,我已经设法将解码时间缩短了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的速度徘徊,分辨率低于I&#39 ;喜欢。

1 个答案:

答案 0 :(得分:1)

本机查看器使用硬件h264解码器,而ffmpeg通常只编译软件。 您必须使用libstagefright构建ffmpeg。

libstagefright选项has been pulled