我使用NDK为android编译了ffmpeg和h264库。 我正在使用ffmpeg库中的https://github.mydomain.com/api/v3/repos/FooOrganization/BarRepository/releases示例录制视频。一切正常(仍然没有在音频上工作)但相机正在丢帧,每帧保存大约需要100ms,这是不可接受的。
我也试过制作一个队列并将它们保存到另一个线程中(让它称之为B)但最后我需要等待大约120秒,因为后台线程(B)仍在记录帧
除了缩小视频大小外,是否还有解决此问题的方法?理想情况下,我想实时保存帧,至少减少节省时间。是不是Android无法做到这一点?
答案 0 :(得分:2)
首先,检查硬件编码器是否可以更好地服务(通过Java中的MediaRecorder或MediaCodec,或使用本机代码中的OpenMax)。
如果由于某种原因你必须在软件中编码,并且你的设备是多核的,你可以通过编译x264来使用切片多线程获得很多。让我cite my post of 2 years ago:
我们直接使用x264(不涉及ffmpeg代码),并且通过ultafast / zerolatency预设,我们在三星Note10(http://www.gsmarena.com/samsung_galaxy_note_10_1_n8000-4573.php)上使用四核1.4 GHz Cortex-A9 Exynos 4412 CPU获得30 FPS for VGA,这篇文章比Droid的四核1.5 GHz Krait Qualcomm MDM615m / APQ8064(http://www.gsmarena.com/htc_droid_dna-5113.php)弱。
请注意,x264构建脚本不能为Android启用pthreads(因为NDK不包含libpthread.a),如果您只是创建一个虚拟机,您可以构建具有多线程支持的库(非常适合四核CPU) libpthread.a,请参阅https://mailman.videolan.org/pipermail/x264-devel/2013-March/009941.html。
请注意,编码器设置只是问题的一部分。如果您使用已弃用的相机API,则应使用预先分配的缓冲区和后台线程进行相机回调,正如我解释elsewhere。