我在FFmpeg的帮助下将图像水印添加到视频中,但FFmpeg使用以下命令花费了过多的时间 -
String[] cmd = {"-i",videoPath, "-i", waterMark.toString(),"-filter_complex","overlay=5:5","-codec:a", "copy", outputPath};
所以我尝试了另一个更快一点但增加输出文件大小的命令(我不想要)
String[] cmd = {"-y","-i", videoPath, "-i", waterMark.toString(), "-filter_complex", "overlay=5:5", "-c:v","libx264","-preset", "ultrafast", outputPath};
有人请向我解释如何在不增加输出大小的情况下提高FFmpeg水印速度。谢谢。
你提到7MB视频需要30-60秒。
在速度和质量之间进行选择时总是存在折衷。
我使用7MB文件在手机上进行了测试,花了13秒,仍然很慢,但我们不能指望那么好。
提高速度的方法:
-r
命令降低帧速率-b:v
和-b:a
命令更改比特率-crf
更改恒定速率因子。默认值为21
量化器标度的范围是0-51:其中0是无损的,23是默认值,51是最差的。较低的值是较高的质量,主观的理智范围是18-28。考虑18在视觉上无损或几乎如此:它应该与输入看起来相同或几乎相同,但它在技术上不是无损的。
这是我发现在大多数Android设备上最好的工作:
String[] s = {"-i", VideoPath, "-i", ImagePath, "-filter_complex", "[0:v]pad=iw:if(lte(ih\\,iw)\\,ih\\,2*trunc(iw*16/9/2)):(ow-iw)/2:(oh-ih)/2[v0];[1:v][v0]scale2ref[v1][v0];[v0][v1]overlay=x=(W-w)/2:y=(H-h)/2[v]", "-map", "[v]", "-map", "0:a", "-g", "2", "-c:v", "libx264", "-preset", "ultrafast", "-r", myFrameRate, directoryToStore[0] + "/" + SavedVideoName};
我略微降低了帧率,你可以尝试最适合你的帧。我正在使用Google的mp4parser
来检索帧速率。
我必须赞扬@Gyan为我提供了一种方法来完美地缩放放置在视频之上的图像,你可以看看我问here的问题。
此外,您可以删除我在上面使用的-g
命令,即用于更改GOP。
这是你的命令编辑:
String[] cmd = {"-i", videoPath, "-i", waterMark.toString(), "-filter_complex", "[0:v]pad=iw:if(lte(ih\\,iw)\\,ih\\,2*trunc(iw*16/9/2)):(ow-iw)/2:(oh-ih)/2[v0];[1:v][v0]scale2ref[v1][v0];[v0][v1]overlay=x=(W-w)/2:y=(H-h)/2[v]", "-map", "[v]", "-map", "0:a", "-c:v", "libx264", "-preset", "ultrafast", "-r", myFrameRate, outputPath};
如果您不确定帧速率,可以将其从命令中删除,并首先测试速度是否降低。
试试吧,如果您有任何疑问,请询问。
OP选择使用以下命令:
String[] cmd = {"-y","-i", videoPath, "-i", waterMark.toString(), "-filter_complex", "overlay=(main_w-overlay_w-10):5", "-map", "0:a","-c:v", "libx264", "-crf", "28","-preset", "ultrafast" ,outputPath};
这是一个非常常见的问题。简单的答案是你无法在Android上提高ffmpeg
的编码速度。您在手机上进行编码,因此您不希望使用编码器的桌面/服务器性能,也不需要硬件加速支持。
用户可以做一些事情:
-c:a copy
的音频(你已经这样做了)。-preset ultrafast
放弃编码速度的编码效率(你也已经这样做了)。--disable-asm
进行编译,因此您可以利用x264中的各种ARM和NEON优化来显着提高编码速度。但是,我不知道哪些Android设备支持这种功能,但需要深入研究。要快速检查您是否正在使用任何优化,请参阅ffmpeg
的控制台输出并搜索using cpu capabilities
。如果none!
然后它没有使用任何优化,否则它可能会说ARMv7 NEON
或类似的东西。ffmpeg
并直接使用MediaCodec。我对此毫无头绪并且懒得查找它,但我认为它使用硬件进行编码,我猜你可以使用它来制作叠加层。如果我错了,有人会纠正我。