Como converter todos os arquivos .wav em subdiretórios para .flac?

3

Eu tenho algumas músicas no formato wav. Eu gostaria de convertê-los para flac (que também é sem perdas, mas tem compressão).

A solução precisa ser recursurada por subdiretórios para localizar arquivos .wav ou .WAV (idealmente insensíveis a maiúsculas e minúsculas), convertê-los em .flac e exportar os arquivos .flac para uma árvore de diretórios diferente. Os arquivos wav originais estão em ~ / Music e os arquivos flac de saída podem entrar em ~ / Music_Flac.

Estou usando o Arch Linux x86_64 e tenho o ffmpeg da seguinte forma:

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
    
por MountainX 04.03.2018 / 09:35

3 respostas

3
Solução

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/ {} \;
  • $0 - passado para o comando shell como um diretório de destino ~/Music_Flac/
  • $1 - passado para o comando shell como um caminho de linha {}
  • bn=${1##*/} - nome da base do arquivo sem caminho do diretório
  • bn=${bn%.*} - nome de base do arquivo com extensão truncada
  • -loglevel 16 - define o nível de registro 16 usado por ffmpeg
por 04.03.2018 / 10:23
1

Outra opção seria usar o globbing do bash para encontrar os arquivos wav, depois os recursos de expansão de parâmetros do shell para alterar a estrutura de diretórios e nomes de arquivos:

shopt -s globstar nocaseglob
for input in Music/**/*.wav
do
  indir=$(dirname "$input")
  outdir=${indir/#Music/Music_Flac}
  [ ! -d "$outdir" ] && mkdir -p "$outdir"
  infile=$(basename "$input")
  outfile=${infile%.???}.flac
  echo ffmpeg -i "$input" "${outdir}/${outfile}"
done

Se os arquivos forem sempre *.wav e *.WAV , você poderá ignorar o shopt nocaseglob e usar for input in Music/**/*.wav Music/**/*.WAV .

Eu não sei quais opções você deseja usar para o ffmpeg, mas eu forneci um exemplo de echo dos caminhos de arquivo de entrada e saída que você pode construir.

Nesta árvore de diretórios de amostra:

$ tree Music
Music
├── a.wav
├── b.WAV
├── c d.wav
└── subdir1
    ├── a.wav
    ├── b.WAV
    ├── c d.wav
    └── subdir2
        ├── a.wav
        ├── b.WAV
        └── c d.wav

a saída do comando de amostra é:

ffmpeg -i Music/a.wav Music_Flac/a.flac
ffmpeg -i Music/b.WAV Music_Flac/b.flac
ffmpeg -i Music/c d.wav Music_Flac/c d.flac
ffmpeg -i Music/subdir1/a.wav Music_Flac/subdir1/a.flac
ffmpeg -i Music/subdir1/b.WAV Music_Flac/subdir1/b.flac
ffmpeg -i Music/subdir1/c d.wav Music_Flac/subdir1/c d.flac
ffmpeg -i Music/subdir1/subdir2/a.wav Music_Flac/subdir1/subdir2/a.flac
ffmpeg -i Music/subdir1/subdir2/b.WAV Music_Flac/subdir1/subdir2/b.flac
ffmpeg -i Music/subdir1/subdir2/c d.wav Music_Flac/subdir1/subdir2/c d.flac

... juntamente com os comandos mkdir necessários ao longo do caminho.

    
por 30.03.2018 / 02:49
-1

Além da resposta do @RomanPerekhrest, que selecionei como a resposta correta para a pergunta, há uma solução de GUI que também funciona bem:

GitHub - dfaust / soundkonverter: o soundKonverter está em modo de manutenção, os PRs são bem-vindos.

Também está no repositório do Arch:

Arch Linux - soundkonverter 3.0.1-1 (x86_64)

    
por 04.03.2018 / 21:45