如何使用 ffmpeg 静音视频的特定部分

如何使用 ffmpeg 静音视频的特定部分

我想要将视频中的特定部分静音。

例如,对于一段 3 分钟长的视频,我想静音 5-10 秒,以及 33-36 秒。

现在,

我知道如何应用音频过滤器。

ffmpeg -i input.mp4 -af "volume=enable='between(t,5,10)':volume=0, volume=enable='between(t,33,36)':volume=0" output.mp4

但 ffmpeg 似乎试图重新编码整个视频!视频和音频已完全转码。

我只需要使特定部分静音,我想保持其他所有内容不变。

有没有快速运行它的方法?

谢谢

答案1

这里您缺少的是有关音频和视频流转码所要使用的编解码器的规范。

  • 要指定音频编解码器,请使用:-c:a
  • 要指定视频编解码器,请使用:-c:v

如果您只想重新包装数据,而不执行任何转码,则可以使用“copy”作为视频/音频编解码器(即“-c:a copy”“-c:v copy”)。

但是,当视频或音频流使用任何过滤器时,就无法“复制”该流。想想看 - 如果您真的“复制”了组成原始音频和视频的 1 和 0,并创建了具有相同 1 和 0 的输出,那么您就无法更改数据的任何内容。过滤器会更改组成数据的实际字节,因此不可能同时应用过滤器和“复制”数据。

就您而言,您将被迫对音频流进行转码,因为您在该流上使用音频过滤器。不过,您可以使用“-c:v copy”参数保留视频流不变。

对于音频流,如果您关心的是质量,则可以使用“-c:a pcm_s16le”指定未压缩的音频编解码器。但是,据我所知,该编解码器与 MP4 容器不兼容。

答案2

为了在请求的场景中进行最少量的重新编码,这是我执行的过程:

  1. 从视频中提取音频。这不会重新编码音频。
    ffmpeg -i video.mp4 -vn -acodec copy audio.aac
    
  2. 使部分音频静音。这将对音频进行重新编码。
    ffmpeg -i audio.aac -af "volume=enable='between(t,5,10)':volume=0" muted-audio.aac
    
  3. 用我们刚刚创建的静音音频流替换视频上的音频流。这不会重新编码视频。
    ffmpeg -i video.mp4 -i muted-audio.aac -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
    
    来源:https://superuser.com/a/277667/379486

结果是我们只需要重新编码音频,这比重新编码视频+音频的破坏性和耗时要小得多。

相关内容