使用ffmpeg批量将flac转换为ogg

使用ffmpeg批量将flac转换为ogg

我正在尝试将此命令转换为将整个目录从 flac 转换为 ogg 的命令:

ffmpeg -i musicfile.flac musicfile.ogg

我已经阅读了手册页。但老实说,这有点超出我的理解范围。我不想使用声音转换器(或任何图形用户界面程序)。所以我转向你们。

我用的是opensuse tumbleweed。而我用的fish,不是bash。一切都是最新的。

正是我想要的,是将 flac 文件夹转换为单独的 ogg 文件夹。当然,质量就像q5一样。假设我将 hi.flac 文件放入~/flac/hi folder,我希望它输出到 ogg 文件夹中,保留文件文件夹结构和名称。~/ogg/hi folder

这可能吗?还是我要求太多了?

我一直在使用flac2all,它的功能与我刚才描述的完全一样,只是它变得越来越慢。所以我想看看使用该ffmpeg命令是否更快。我搜索了一下,有人发布了一个小的 bash 脚本,但它对我不起作用。再次如此。我转向你们。

谢谢阅读。

答案1

也许是这样的:

apt install parallel 

find /music -type d | xargs -i mkdir -p "/out_music/{}"
find /music -type f -name "*.flac" | parallel -j8 ffmpeg -i '{}' -ar 44100 -vn -codec:a libvorbis -qscale:a 7 -y '/out_music/{}.oga'

这将创建名称类似的文件.flac.oga,但就我个人而言,它从未给我带来任何问题。

答案2

我喜欢佩奇的方法,尽管我自己会采取不同的做法:您指定您的外壳是不是bash,所以我假设您不会介意使用不同的 shell 来执行您的 shell;zsh。我打赌fish也可以用于此目的,但我几乎没有使用fish.

#!/usr/bin/zsh
targetfolder="$1"  # save argument to this shell script in
                   # variable $targetfolder


for infile in **/*.flac ; do
#   ^      ^  ^^     
#   |      |   |
#   \-------------------- we have a loop variable $infile…
#          \------------- which we set to a new value from the following list:
#              \--------- recursively (**) list all files ending in .flac (*.flac)

  mkdir -p "${targetfolder}/${infile:h}"
# ^      ^    ^                ^----^^
# |      |    |                |     |
# |      |    |                |     /
# |      |    |                |    |
# \------------------------------------ make a new directory
#        |    |                |    |
#        \----------------------------- making necessary parent directories on the way,
#                              |    |   ignoring all errors
#             |                |    |
#             \------------------------ expands to the argument passed to this script
#                              |    |
#                              \------- expands to the current found file name,
#                                   |   but modified:
#                                   |
#                                   \-- removes the trailing path component, i.e.
#                                       gets the directory containing the file
  ffmpeg -i "${infile}" "${targetfolder}/${infile%.flac}.ogg"
#                                                ^----^
#                                                  |
# remove the trailing ".flac" from the file name --/
done

或者,简而言之,删除所有评论:

#!/usr/bin/zsh
targetfolder="$1"

for infile in **/*.flac ; do
  mkdir -p "${targetfolder}/${infile:h}"
  ffmpeg -i "${infile}" "${targetfolder}/${infile%.flac}.ogg"
done

您可以通过将其保存到某个文件来使用该脚本,例如massconvert.zsh;运行chmod 755 /path/to/massconvert.zsh使其可执行,然后在包含 flac 集合的文件夹中运行它:

cd /home/utemost/flacs
/path/to/massconvert.zsh /home/utemost/oggs

就是这样!

相关内容