将图像水印添加到视频处理的FFmpeg非常慢

问题描述 投票:0回答:2

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

android ffmpeg android-ffmpeg
2个回答
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
投票

这是一个非常常见的问题。简单的答案是你无法在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。我对此毫无头绪并且懒得查找它,但我认为它使用硬件进行编码,我猜你可以使用它来制作叠加层。如果我错了,有人会纠正我。
© www.soinside.com 2019 - 2024. All rights reserved.