你们中有人知道在 Linux 中在 MP3 末尾添加固定持续时间的静音的方法吗?例如使用 MEncoder、FFmpeg 等?
它需要是命令行,因为它将被编写脚本并在我们的服务器上运行。
我用谷歌搜索了这个问题,我能做的最好的就是pad
使用索克斯,但是它不适用于 MP3。
我可以将其转换为 WAV,使用 SoX,然后再将其转换回 MP3,并将元数据(减去持续时间)从原始文件复制到新的 MP3。但是,在为此编写脚本之前,我想看看是否有一个一劳永逸的解决方案。
答案1
pad
您可以使用 SoX 的参数和以下语法轻松完成此操作:
sox <oldfile> <newfile> pad <silence at beginning of file> <silence at end of file>
例子:
sox mp3.mp3 mp3withsilence.mp3 pad 0 1
这些静音以秒为单位。(使用不同的语法也可以实现其他用法,以便在特定位置插入这些静音。有关详细信息,请参阅 SoX 文档。)
答案2
使用 ffmpeg,您可以使用 aevalsrc 过滤器来生成静音,然后在第二个命令中使用 concat 协议将它们无损地组合在一起:
ffmpeg -filter_complex aevalsrc=0 -t 10 10SecSilence.mp3
ffmpeg -i "concat:input.mp3|10SecSilence.mp3" -c copy output.mp3
您可以通过更改您想要的任何时间(以秒为单位)来控制静音的长度-t 10
。当然,您只需生成一次静音,然后您就可以保留该文件并使用它来填充您想要的每个文件。您可能还想查找连接解复用器- 它对处理器的要求稍微高一些,但您可能会发现将其放入 shell 脚本中更容易。
如果您想用单个命令完成此操作,则可以使用 concat 过滤器 - 这将要求您重新编码音频(因为过滤器图与 不兼容-codec copy
),因此上面的选项可能最适合您。但对于使用原始 PCM 的人来说,这可能很有用,希望在编码音频之前在末尾添加静音:
ffmpeg -i input.mp3 \
-filter_complex 'aevalsrc=0::d=10[silence];[0:a][silence]concat=n=2:v=0:a=1[out]' \
-map [out] -c:a libmp3lame -q:a 2 output.mp3
通过将静音时间更改为您想要的任何时间(以秒为单位)来控制静音时间的长度d=10
。如果您使用此方法,您可能会发现FFmpeg MP3 编码指南有用。