我有一个基于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,在比我想要的低分辨率下。