2015-03-31 25 views
2

我有一个基于https://ikaruga2.wordpress.com/2011/06/15/video-live-wallpaper-part-1/的项目,它使用http://bambuser.com/opensource的ffmpeg库的旧版本。在这个项目中的C++代码,我们有以下几行代码:如何使ffmpeg与Android内置的视频查看器一样高效?

 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); 

此代码不断报道毫秒60和90之间上的Xperia离子每帧解码,采用1280×720的H264源视频文件。其他处理让帧出现在屏幕上的平均时间为30ms,而变化很小。这导致10-11fps的帧率。

忽略其他处理,平均需要75ms的解码会导致13fps。但是,当我浏览我的SD卡并单击该mp4文件以在本机查看器中打开它时,它将显示全速30fps。此外,当我在本机查看器中打开1920x1080版本的同一mp4时,它也以完整的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上徘徊。

回答

1

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

libstagefright option has been pulled

+0

谢谢。你能够提供一个链接指导如何做到这一点或下载位置获得编译库?后者与我上次试图编译ffmpeg时相关(在我提供的链接中的步骤3-8),事实证明这是不可能的,因为我有Windows,无法访问Linux机器,而CygWin根本就拒绝工作。 – Nicholas 2015-03-31 12:55:00

+1

在Windows上编译ffmpeg是一种折磨,而为Android进行交叉编译是在广场上的折磨。我建议你下载一个VirtualBox或其他免费的虚拟机环境并在那里安装Ubuntu。你可以在http://www.origenboard.org/wiki/index.php/FFmpeg_on_Android找到预建的图书馆,但是我没有这个项目的个人经验。 – 2015-03-31 15:47:10

+0

还请参阅http://stackoverflow.com/questions/4725773/ffmpeg-on-android及其中的参考资料。 – 2015-03-31 15:50:21