使用 FFMPEG 批量删除音频结尾
Posted
技术标签:
【中文标题】使用 FFMPEG 批量删除音频结尾【英文标题】:Using FFMPEG to batch remove audio endings 【发布时间】:2019-07-25 15:31:17 【问题描述】:我有超过 1000 个音频文件,所有这些文件都以鼠标单击结束。我想从所有这些中删除最后半秒。音频文件有不同的长度(即 15 秒、5 秒……),但它们的共同点是最后半秒有鼠标点击声。如何使用 Windows 10 命令行批量修剪文件夹中 mp3 文件的结尾?我已经下载了 FFMPEG。谢谢!
【问题讨论】:
【参考方案1】:这是两个问题合二为一:
-
如何从任意持续时间的输入中删除最后 0.5 秒?
如何将其合并到 Windows 批处理脚本中?
我会回答 #1,因为我不是 Windows 用户。批处理脚本由您决定。
使用ffprobe
获取持续时间:
ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp3
使用ffmpeg
修剪:
ffmpeg -i input.mp3 -t <duration> -c copy output.mp3
将<duration>
替换为ffprobe
的输出减去0.5 秒。
【讨论】:
提醒我,有一个输入-toeof
的补丁可以恢复。
感谢 Llogan 的回答。对此,我真的非常感激。我真的不能逐个文件手动完成。如果可能,我需要运行一个 batch.bat 文件,因为有超过 1000 个文件。我希望有人能找到答案。谢谢!【参考方案2】:
如何将其合并到 Windows 批处理脚本中?
应该这样做:
FOR %%A IN (*.mp3) DO (
FOR /F %%B IN ('ffprobe.exe -v error -show_entries format^=duration -of csv^=p^=0 "%%~A" ^| xidel -s - -e ". - 0.5"') DO (
ffmpeg.exe -i "%%~A" -t %%B -c copy "%%~dpnA_trimmed.mp3"
)
)
首先,在批处理中进行浮点计算在官方上是不可能的,而且在非官方的情况下真的很难编写脚本。这就是为什么我建议让Xidel 做数学。它首先是一个从 html/XML/JSON 下载和提取数据的命令行工具,但它可以做的更多!
循环遍历当前目录中的所有 mp3 文件。 llogan 建议的 ffprobe 命令通过管道传送到 Xidel,以减去 0.5 秒。例如,25.547755
现在变为 25.047755
。
不要忘记在 for 循环中转义必要的字符!在这种情况下,=
和 |
。
llogan 建议的 ffmpeg 命令打开 "%%~A
(mp3 文件),将持续时间设置为 %%B
并创建一个新的 mp3 文件 (<filename>_trimmed.mp3
)。
此代码假定 mp3 文件 ffprobe.exe
、xidel.exe
和 ffmpeg.exe
都在同一个目录中。
【讨论】:
嗨 Reino。谢谢你的代码。我希望它会起作用,因为它可以节省我几天的手动编码。我如何让 Xidel 做数学?我要先下载它,然后将下载的文件放在与FFMPEG相同的文件夹下吗?我对上面的任何代码都不熟悉,所以当你说不要忘记转义一些 for 循环时,这是否意味着我需要进一步修改代码?谢谢! 使用“windows 10 命令行”我假设您已经熟悉 cmd/batch。以上是一个简单的批处理脚本,您可以将其复制/粘贴到记事本中并保存为*.bat
文件。当然你也可以直接在 cmd 中输入这个命令(一行!)。在这种情况下,将 %%
替换为 %
。 Xidel 和 FFmpeg 一样,不是标准的 Windows 程序,所以是的,你必须先下载它。如果您希望上述代码正常工作,则确实与 ffmpeg.exe 相同的目录。批量转义意味着在某些字符前面放置一个^
。 =
和 |
已被转义,因此无需进一步修改代码
我做了以下事情:我下载了 Xidel 并将它的一份副本放在 FFmpeg 文件夹中,并在它的外面立即放置一份副本以防万一。我还使用上面的代码创建了一个 batch.bat 文件,但出现此错误:对于有效格式,请键入 CALL /?或为/?该命令的语法不正确。
您确定您在 bat 文件中使用的代码与上述完全相同吗?我相信这样的错误消息表明使用%
而不是%%
。
我只是复制粘贴。没有任何修改。以上是关于使用 FFMPEG 批量删除音频结尾的主要内容,如果未能解决你的问题,请参考以下文章
使用 ffmpeg 批量降低 mp3 音频文件的比特率和大小