我有一组 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
这样做的目的是以迂回的方式使用相同的输入两次进行修剪,而无需知道持续时间,也无需重新编码。
- 第二个输入从开始处截断了 4 秒。
- 该
-shortest
选项使用最短输入持续时间来确定输出持续时间。这将导致从第一个输入截断最后 4 秒以匹配截断的第二个输入的持续时间。 - 因为需要两个流才能
-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