tracks
我有一个包含 3 个文件的目录track1.mp3
,,track2.mp3
。track3.mp3
我想从每个文件中随机选择一个 10 秒的块并将这些块合并到一个名为的新文件中sample.mp3
。如何使用 ffmpeg 执行此操作?
我对 ffmpeg 还很陌生,到目前为止我所做的就是将文件分割成块
ffmpeg -i track1.mp3 -f segment -segment_time 10 -c copy out%03d.mp3
有人帮忙吧。我使用的是 Mac OSX high sierra 和 bash shell
答案1
您可以使用以下 bash 脚本:
numFiles=3
maxStart=10
idx=1
for randomStart in $(jot -r $numFiles 0 $maxStart); do
ffmpeg -y -ss "$randomStart" -i "track${idx}.mp3" -t 10 -c:a copy "track${idx}-chunk.mp3"
idx=$((idx + 1))
done
在这里,您必须指定文件数(track1
到track3
)和最大起始位置(例如,如果您的文件只有 20 秒长,那么您最多应该从 00:00:10 开始)。
该jot
实用程序用于创建 0 到 之间的随机数$maxStart
(即上例中的 10)。在 Linux 上,jot
不可用;而是使用shuf -n $numFiles -i 0-$maxStart
。
然后,连接这些块(参见FFmpeg Wiki 条目):
ffmpeg -f concat -safe 0 -i <(for f in ./*-chunk.mp3; do echo "file '$PWD/$f'"; done) -c copy output.mp3
它使用特殊的 shell 语法来构建临时的连接文件。这将复制比特流,因此无需重新编码。