我有一堆音频文件,我需要从每个文件中删除最后 1 秒。音频文件的长度是任意的。
执行此操作的最佳工具/方法是什么?
我对 ffmpeg 有点熟悉,但据我所知,它没有直接选项来执行此操作(必须使用 -ss 和 -to 提供开始和结束时间)。
答案1
你必须使用迂回的方法。提取文件两次,并将第二次输入的时间戳偏移您要修剪的末尾的持续时间。然后使用 set 将两个流通过管道传输到另一个 ffmpeg 实例-shortest
。在第二个 ffmpeg 实例中,仅保存第二个输入中的流。
ffmpeg -i in.mp3 -itsoffset 1 -i in.mp3 -map 0:a:0 -map 1:a:0 -c copy -shortest -f nut - | ffmpeg -f nut -i - -c copy -map 0:1 out.mp3
答案2
您可以使用媒体信息获取持续时间(以毫秒为单位),然后切至持续时间 - 1:
duration=$(mediainfo FILE.mp3 --Inform="Audio;%Duration%")
ffmpeg -to $(($duration / 1000 - 1)) -i FILE.mp3 -c copy FILE_NEW.mp3
答案3
受到该网站上其他问题答案的启发,我也能够编造一些东西。该命令可以find
作为exec
选项传递给
ffmpeg -i FILE1.wma -ss 0 -to $(echo $(ffprobe -i FILE1.wma -show_entries format=duration -v quiet -of csv="p=0") - 1 | bc) -c copy FILE2.wma
中间的部分$(echo $(ffprobe -i FILE1.wma -show_entries format=duration -v quiet -of csv="p=0") - 1 | bc)
首先获得所需的持续时间。管道bc
以浮动格式进行计算。然后,其输出作为参数传递给-to
主命令。
为了便于理解,将上面的长单行命令分解:
ffmpeg -i FILE1.wma -ss 0 -to
$(echo
$(ffprobe -i FILE1.wma -show_entries format=duration -v quiet -of csv="p=0")
- 1 | bc
)
-c copy FILE2.wma