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
답변1
네가 원한다면바꾸다wav
내가 찾은 가장 쉬운 방법 은 바이너리를 flac
사용하는 것입니다 .flac
find . -name '*.wav' -exec flac --best {} --delete-input-file \;
다음은 명령의 다양한 부분에 대한 분석입니다.
find .
: 이 명령은 현재 디렉터리와 모든 하위 디렉터리( 로 표시 ).
에서 파일을 검색합니다.-name '*.wav'
.wav
: 이 플래그는 확장자를 가진 파일을 찾고 있음을 지정합니다 .*
는 모든 문자 또는 문자 그룹과 일치하는 와일드카드이므로 이 플래그는 로 시작하는 모든 항목과 일치 합니다.wav
.-exec
: 이 플래그는find
검색 기준과 일치하는 파일에 대해 명령을 실행하도록 명령에 지시합니다.flac --best {} --delete-input-file
: 일치하는 파일에 대해 실행되는 명령입니다.{}
명령이 처리 중인 파일에 대한 자리 표시자 입니다find
. 이flac
명령은 플래그에 지정된 가장 높은 압축 수준을 사용하여 파일을 FLAC 형식으로 변환합니다--best
. 이--delete-input-file
플래그는 FLAC 형식으로 성공적으로 변환한 후 원본 파일을 삭제하라는 명령을 지시합니다flac
..wav
\;
: 옵션이 제대로 작동flac
하려면 명령 종료 신호에 필요합니다 .-exec
답변2
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
- 쉘 명령에 대상 디렉토리로 전달됩니다.~/Music_Flac/
$1
- 쉘 명령에 파일 경로로 전달됩니다.{}
bn=${1##*/}
- 디렉토리 경로가 없는 파일 기본 이름bn=${bn%.*}
- 확장자가 잘린 파일 기본 이름-loglevel 16
16
- 사용되는 로깅 수준을 설정합니다.ffmpeg
답변3
또 다른 옵션은 bash의 글로빙을 사용하여 wav 파일을 찾은 다음 쉘 매개변수 확장 기능을 사용하여 디렉토리 구조와 파일 이름을 변경하는 것입니다.
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
파일에 다음 항목만 있으면 *.wav
건너 뛰고 대신 사용할 *.WAV
수 있습니다 .shopt nocaseglob
for input in Music/**/*.wav Music/**/*.WAV
ffmpeg에 어떤 옵션을 사용하고 싶은지 모르겠지만 echo
구축할 수 있는 입력 및 출력 파일 경로의 예를 제공했습니다.
이 예제 디렉토리 트리에서:
$ 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
명령 출력 예는 다음과 같습니다.
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
...그리고 mkdir
그 과정에서 필요한 명령도 있습니다.
답변4
질문에 대한 정답으로 선택한 @RomanPerekhrest의 답변 외에도 매우 잘 작동하는 GUI 솔루션이 있습니다.
Arch 저장소에도 있습니다: