如何将子目录中的所有 .wav 文件转换为 .flac?

Mou*_*inX 5 audio conversion flac

我有一些 wav 格式的歌曲。我想将它们转换为 flac (也是无损的,但有压缩)。

该解决方案需要递归通过子目录来查找 .wav 或 .WAV 文件(最好不区分大小写),将它们转换为 .flac 并将 .flac 文件输出到不同的目录树。原始的 wav 文件位于 ~/Music 中,输出的 flac 文件可以放入 ~/Music_Flac 中。

我使用的是 Arch Linux x86_64,并且我有 ffmpeg,如下所示:

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7.3.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-shared --enable-version3 --enable-omx
libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100
Run Code Online (Sandbox Code Playgroud)

ofr*_*sco 8

如果您想用对应的内容替换所有wav隐含的flac内容,我发现最简单的方法是使用flac二进制文件:

find . -name '*.wav' -exec flac --best {} --delete-input-file \;
Run Code Online (Sandbox Code Playgroud)

以下是该命令不同部分的细分:

  • find .:该命令搜索当前目录及其所有子目录(以 表示.)中的文件。

  • -name '*.wav':该标志指定我们正在寻找具有.wav扩展名的文件。是*匹配任何字符或字符组的通配符,因此该标志将匹配任何以.wav.

  • -exec:此标志告诉命令find对匹配搜索条件的文件执行命令。

  • flac --best {} --delete-input-file:这是对匹配文件执行的命令。是{}一个占位符,表示命令正在处理的文件find。该flac命令使用标志指定的最高压缩级别将文件转换为 FLAC 格式--best。该--delete-input-file标志告诉命令在成功转换为 FLAC 格式后flac删除原始文件。.wav

  • \;:这是命令结束信号所必需的flac,以便-exec选项正常运行。


Rom*_*est 3

find+ffmpeg解决方案:

find ~/Music -type f -iname "*.wav" -exec sh -c \
'bn=${1##*/}; bn=${bn%.*}; ffmpeg -loglevel 16 -i "$1" "${0}${bn}.flac"' ~/Music_Flac/ {} \;
Run Code Online (Sandbox Code Playgroud)
  • $0- 作为目标目录传递到 shell 命令中~/Music_Flac/
  • $1- 作为文件路径传递到 shell 命令中{}
  • bn=${1##*/}- 不带目录路径的文件基名
  • bn=${bn%.*}- 扩展名被截断的文件基名
  • -loglevel 1616- 设置使用的日志记录级别ffmpeg