FFmpeg将图像水印添加到视频过程非常慢

时间:2019-04-09 09:50:19

标签: android ffmpeg android-ffmpeg

我正在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加水印速度。  谢谢。

2 个答案:

答案 0 :(得分:3)

您提到一个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};

答案 1 :(得分:1)

这是一个非常常见的问题。 简单的答案是,您无法在Android上提高ffmpeg的编码速度。您是在手机上进行编码,因此您不希望使用编码器来实现台式机/服务器的性能并且没有硬件加速支持。

用户可以执行以下操作:

  • Stream copy-c:a copy的音频(您已经在这么做了)。

  • 使用-preset ultrafast放弃编码效率来提高编码速度(您已经在这样做了)。

  • 使用scale过滤器减小输出宽度x高度(对于您来说可能不是可接受的选项)。

  • 确保您的x264没有使用--disable-asm进行编译,因此您可以利用x264中的各种ARM和NEON优化来显着提高编码速度。但是,我不知道哪些Android设备支持该功能,但这值得研究。要快速查看是否正在使用任何优化,请参考ffmpeg的控制台输出并搜索using cpu capabilities。如果none!未使用任何优化,则可能会说ARMv7 NEON或类似的内容。

  • 将编码卸载到服务器。也可以节省用户的电池寿命。

  • 所有这些都给人烦恼的水印吗?避免重新编码,并使用播放器覆盖水印。

  • 显然是FFmpeg has MediaCodec decoding support on Android,但是编码是这里的瓶颈。但是,也许它将节省一些fps。

  • 向FFmpeg发送补丁,以启用MediaCodec编码支持或等待其他人才能使用。

  • 忘记ffmpeg并直接使用MediaCodec。我对此一无所知,也懒得查找它,但是我认为它使用硬件进行编码,我猜您可以使用它进行覆盖。如果我错了,有人纠正我。