合并特定日期的多个 MP3 文件

合并特定日期的多个 MP3 文件

每天我的服务器上都会创建大约 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

如果其中一个文件名包含单引号 ( '),则此解决方案会失败。​​如果有人知道如何更正此问题,请进行更改。

相关内容