如何删除 MP3 文件的最后 4 秒?

如何删除 MP3 文件的最后 4 秒?

我有一组 MP3 文件,我想删除最后 4 秒的内容。我知道如果我知道每个文件的时间长度,我可以这样做:

ffmpeg -t ${1} -i inputfilename -acodec copy -vcodec copy outputfilename

$1文件的持续时间减去 4 秒是多少。

我真的很想有一种方法,无论文件的长度如何,都可以截断最后 4 秒。“在 EOF 前 4 秒停止”。

注意:我努力弄清楚这个命令行,如果有一个更简单的版本,我很乐意看到它。

答案1

有时在处理音频文件而不是音频加视频,细致入微比 FFmpeg 更好的应用程序是 SoX。在 Ubuntu 上安装功能齐全的 SoX 如下:

sudo apt-get install sox libsox-fmt-all

要从 mp3 文件末尾截取 4 秒,请执行以下操作很简单需要命令:

sox input.mp3 output.mp3 trim 0 -4

在这个例子中,“0”是文件开头的起始位置,而“-4”确定所需段的结束位置:距结尾 4 秒。

对此可以有多种变化,具有多个位置和保存的片段。例如,正如您在评论中提到的,如果您只想删除文件开头的 2 秒,则命令行将是:

sox input.mp3 output.mp3 trim 2

在此示例中,不需要结束位置。SoX 手册页如果您想要更复杂的用法,包含更多 trim 命令的示例...

答案2

改编自使用 ffmpeg 剪切视频

ffmpeg -i input.mp3 -ss 4 -i input.mp3 -c copy -map 0:a -map 1:a -shortest -f nut - | ffmpeg -y -f nut -i - -c copy -map 0:0 output.mp3

这样做的目的是以迂回的方式使用相同的输入两次进行修剪,而无需知道持续时间,也无需重新编码。

  1. 第二个输入从开始处截断了 4 秒。
  2. -shortest选项使用最短输入持续时间来确定输出持续时间。这将导致从第一个输入截断最后 4 秒以匹配截断的第二个输入的持续时间。
  3. 因为需要两个流才能-shortest工作,所以它们被传输到另一个 ffmpeg 以删除第二个输入。

答案3

您可以使用ffprobe随附的内容ffmpeg来获取持续时间。

dur=$(($(ffprobe -loglevel error -show_entries format=duration -of default=nk=1:nw=1 inputfilename | xargs printf %.0f)-4))
ffmpeg -t ${dur} -i inputfilename -c copy outputfilename

第一行用于ffprobe获取持续时间减去 4 秒,然后将其放入名为 的变量中dur

我也习惯xargs对数字进行四舍五入,因为bash进行数学运算时只接受整数。

bc如果您需要更高的准确性,您可以使用。

dur=$(ffprobe -loglevel error -show_entries format=duration -of default=nk=1:nw=1 inputfilename)
dur=$(bc <<< ${dur}-4)
ffmpeg -t ${dur} -i inputfilename -c copy outputfilename

相关内容