Bash:FFmpeg:自动化专辑封面标记
Bash: FFmpeg: Automate Album Art Tagging
我的每一个音乐文件夹都是这样设置的 艺术家 > 专辑年份 >
Track 01.flac
Track 02.flac
Track 03.flac
folder.jpg, jpeg, png, etc
我需要做的是 folder.* 是否可用。
if [ -f folder.* ]; then
运行这个命令可以在不替换原始照片的情况下设置更小的尺寸。
for small in folder.*
convert $small -resize 1000x1000 temp$small
然后 运行 对每个文件执行这些命令,以自动将较小尺寸的封面添加到每个音频文件的标签中。
ffmpeg -i TRACK.flac -i SMALLFOLDER.* -map a -map 1:v -disposition:v attached_pic -metadata:s:v comment="Cover (Front)" -codec copy TRACKWITHART.flac
&& rm TRACK.flac
&& mv TRACKWITHART.flac TRACK.flac
&& rm temp$small
最后一点是我在清理。我在用这个管道将命令传递给另一个人时遇到了麻烦,而不是对这类事情最有经验的人。
而且,如果它像上面一样不可用,则需要通过查找从第一个音频文件中提取它。
else
find . -name "*.flac" -print -quit
并使用此命令提取它。
ffmpeg -i TRACK.flac -vf scale=1000:1000 -an FOLDER.png
然后运行上面的其他命令。
现在我不知道是否有人熟悉 FFmpeg 但它实际上是一种噩梦,因为它不一定用于音频标记但我不知道在终端中处理这种自动专辑封面任务的任何其他方法.如果有人可以使用更好的 CLI 实用程序为我指明正确的方向,那就太棒了,或者只是帮助编写此 bash 脚本。你可以看到我对终端相当熟悉并且通过搜索网络完成了一些事情但是将它们一起放在 bash 脚本中对我来说很难理解,如果有人有一些具体的链接,那将不胜感激。
您对如何操作有大致正确的想法。
wooledge BashGuide 几乎是学习 bash 脚本的最佳起点。非常容易上手,直接解决了很多新手写脚本容易犯的坑。
在使用变量存储时始终引用变量 filenames/paths。您需要编写您的脚本,就好像每个 path/filename 都会有空格、换行符、特殊字符等。引用您的变量将大大有助于防止您的脚本 运行s.[=14 时出现任何混乱=]
这是您的代码,已修复并整合到一个工作脚本中:
#!/bin/bash
# check for album art file,
# if none, extract from first flac w/ ffmpeg
# exit script if ffmpeg fails
[[ -f folder.* ]] ||
{ tracks=(*.flac)
ffmpeg -i "${tracks[0]}" -vf scale=1000:1000 -an folder.png \
|| exit 1 ; }
# define an array of all folder.* files
albumart=(folder.*)
ffmpeg -i "${albumart[0]}" -vf scale=1000:1000 "tmp_${albumart[0]}" \
|| exit 1
# use the first element of the array,
# in case there are multiple folder.* files.
# exit if ffmpeg gives error code
for track in *.flac; do
ffmpeg -i "$track" -i "tmp_${albumart[0]}" -map a -map 1:v -disposition:v attached_pic -metadata:s:v comment="Cover (Front)" -codec copy "tmp_${track}" \
&& rm "$track" \
&& mv "tmp_${track}" "$track"
done
rm "tmp_${albumart[0]}"
我冒昧地更改了您的 convert
行图像大小调整代码,以便它由 ffmpeg 处理,因为我不熟悉“转换”。如果您使用的是脚本或二进制文件,您将需要编辑此行(保持新的输入和输出变量不变)。
此脚本不需要任何参数,它会循环遍历并将专辑封面和元数据添加到当前目录中的所有 .flac 文件。它不是为递归工作而设计的;您将需要 cd
进入 & 运行 每个目录中的脚本。
我的每一个音乐文件夹都是这样设置的 艺术家 > 专辑年份 >
Track 01.flac
Track 02.flac
Track 03.flac
folder.jpg, jpeg, png, etc
我需要做的是 folder.* 是否可用。
if [ -f folder.* ]; then
运行这个命令可以在不替换原始照片的情况下设置更小的尺寸。
for small in folder.*
convert $small -resize 1000x1000 temp$small
然后 运行 对每个文件执行这些命令,以自动将较小尺寸的封面添加到每个音频文件的标签中。
ffmpeg -i TRACK.flac -i SMALLFOLDER.* -map a -map 1:v -disposition:v attached_pic -metadata:s:v comment="Cover (Front)" -codec copy TRACKWITHART.flac
&& rm TRACK.flac
&& mv TRACKWITHART.flac TRACK.flac
&& rm temp$small
最后一点是我在清理。我在用这个管道将命令传递给另一个人时遇到了麻烦,而不是对这类事情最有经验的人。
而且,如果它像上面一样不可用,则需要通过查找从第一个音频文件中提取它。
else
find . -name "*.flac" -print -quit
并使用此命令提取它。
ffmpeg -i TRACK.flac -vf scale=1000:1000 -an FOLDER.png
然后运行上面的其他命令。
现在我不知道是否有人熟悉 FFmpeg 但它实际上是一种噩梦,因为它不一定用于音频标记但我不知道在终端中处理这种自动专辑封面任务的任何其他方法.如果有人可以使用更好的 CLI 实用程序为我指明正确的方向,那就太棒了,或者只是帮助编写此 bash 脚本。你可以看到我对终端相当熟悉并且通过搜索网络完成了一些事情但是将它们一起放在 bash 脚本中对我来说很难理解,如果有人有一些具体的链接,那将不胜感激。
您对如何操作有大致正确的想法。
wooledge BashGuide 几乎是学习 bash 脚本的最佳起点。非常容易上手,直接解决了很多新手写脚本容易犯的坑。
在使用变量存储时始终引用变量 filenames/paths。您需要编写您的脚本,就好像每个 path/filename 都会有空格、换行符、特殊字符等。引用您的变量将大大有助于防止您的脚本 运行s.[=14 时出现任何混乱=]
这是您的代码,已修复并整合到一个工作脚本中:
#!/bin/bash
# check for album art file,
# if none, extract from first flac w/ ffmpeg
# exit script if ffmpeg fails
[[ -f folder.* ]] ||
{ tracks=(*.flac)
ffmpeg -i "${tracks[0]}" -vf scale=1000:1000 -an folder.png \
|| exit 1 ; }
# define an array of all folder.* files
albumart=(folder.*)
ffmpeg -i "${albumart[0]}" -vf scale=1000:1000 "tmp_${albumart[0]}" \
|| exit 1
# use the first element of the array,
# in case there are multiple folder.* files.
# exit if ffmpeg gives error code
for track in *.flac; do
ffmpeg -i "$track" -i "tmp_${albumart[0]}" -map a -map 1:v -disposition:v attached_pic -metadata:s:v comment="Cover (Front)" -codec copy "tmp_${track}" \
&& rm "$track" \
&& mv "tmp_${track}" "$track"
done
rm "tmp_${albumart[0]}"
我冒昧地更改了您的 convert
行图像大小调整代码,以便它由 ffmpeg 处理,因为我不熟悉“转换”。如果您使用的是脚本或二进制文件,您将需要编辑此行(保持新的输入和输出变量不变)。
此脚本不需要任何参数,它会循环遍历并将专辑封面和元数据添加到当前目录中的所有 .flac 文件。它不是为递归工作而设计的;您将需要 cd
进入 & 运行 每个目录中的脚本。