每天我的服务器上都会创建大约 10 个不同的 mp3 文件。我想做的是设置一个 cronjob 在晚上运行并将当天的曲目合并为一个 mp3 曲目。我不太关心 ID3 信息,但如果这种方法能够合并它们,那就太理想了。
保持简单就是我需要做的:
- 合并当天的 .mp3 文件
- 之后删除单个文件,因为我只需要合并的 mp3
我愿意使用 Python 或 Bash 脚本来执行此操作,但其他任何解决方案也同样有效。这可能吗?
答案1
使用 ffmpeg 的 concat 协议的解决方案
您必须先找到要合并的文件(一天之内)
find path/to/files -name '*.mp3' -mtime -1
并按照另一篇文章中的描述进行合并问题最后,用于连接的字符串必须进行修改才能有效rm
(使用引号而不是管道等)。
最终脚本如下:
#!/bin/bash
concat=$(echo -n "concat:" && find path/to/files -name '*.mp3' -mtime -1 -exec echo -n "{}|" \;)
ffmpeg -i "${concat%|}" -acodec copy output.mp3
IFS=$'\n'
for i in $(echo $concat | sed -e 's/^concat://' -e 's/|$//' -e 's/|/\n/g');
do rm -i $i
done
${concat%|}
删除变量中的最后一个管道,表达式sed
创建一个要删除的文件列表(每行一个)rm
。
可排序解决方案(需要 ffmpeg 1.1 或更新版本)
可以使用较新版本的ffmpeg
文件读取需要连接的文件来自文件. 这允许轻松对片段进行排序。
#!/bin/bash
IFS=$'\n'
concatlist=$(find /path/to/files -name '*.mp3' -mtime -1 -printf "file '%p'\n" | sort)
ffmpeg -f concat -i <(echo "$concatlist") -c copy output.mp3
for i in $(echo "$concatlist" | sed -e "s/^file '//" -e "s/'$//"); do
rm -i "$i"
done
如果其中一个文件名包含单引号 ( '
),则此解决方案会失败。如果有人知道如何更正此问题,请进行更改。