我想要将视频中的特定部分静音。
例如,对于一段 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
为了在请求的场景中进行最少量的重新编码,这是我执行的过程:
- 从视频中提取音频。这不会重新编码音频。
ffmpeg -i video.mp4 -vn -acodec copy audio.aac
-vn
没有视频。-acodec copy
说使用已经存在的相同音频流。
来源:https://stackoverflow.com/a/27413824/2554605
- 使部分音频静音。这将对音频进行重新编码。
ffmpeg -i audio.aac -af "volume=enable='between(t,5,10)':volume=0" muted-audio.aac
- 用我们刚刚创建的静音音频流替换视频上的音频流。这不会重新编码视频。
来源:https://superuser.com/a/277667/379486ffmpeg -i video.mp4 -i muted-audio.aac -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
结果是我们只需要重新编码音频,这比重新编码视频+音频的破坏性和耗时要小得多。