오랫동안 나는 LAME 플러그인과 함께 Audacity를 포함하는 상대적으로 복잡한 기술을 사용했습니다. 이것은 내가 추측하는 것은 좋지만 터미널 접근 방식의 매력은 조금 더 세분화되어 [options]
최신 바이너리를 사용할 수 있다는 것입니다.
또한 MacBook이 약간 노화되고 있으며 불필요한 GUI를 제거 할 수 있다면 더욱 좋습니다.
미리 감사드립니다.
오랫동안 나는 LAME 플러그인과 함께 Audacity를 포함하는 상대적으로 복잡한 기술을 사용했습니다. 이것은 내가 추측하는 것은 좋지만 터미널 접근 방식의 매력은 조금 더 세분화되어 [options]
최신 바이너리를 사용할 수 있다는 것입니다.
또한 MacBook이 약간 노화되고 있으며 불필요한 GUI를 제거 할 수 있다면 더욱 좋습니다.
미리 감사드립니다.
답변:
brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3
--decode --stdout
= -dc
lame - $outfile
= STDIN에서 입력--preset extreme
= ~ 245kbit / s VBR#!/bin/bash
for f in "$@"; do
[[ "$f" != *.flac ]] && continue
album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"
flac --decode --stdout "$f" | lame --preset extreme --add-id3v2 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" --tn "$tracknumber" --tg "$genre" - "${f%.flac}.mp3"
done
스크립트를 사용하려면 원하는 곳에 저장 ~/bin/flac2mp3
하고로 실행 가능하게 만드십시오 chmod +x ~/bin/flac2mp3
.
그러면 음악 폴더의 모든 flac 파일이 변환됩니다.
find ~/Music/ -name '*.flac' -exec ~/bin/flac2mp3 {} \;
또는 flac2mp3를 한 번만 호출하기 때문에 약간 더 빠릅니다.
find ~/Music/ -name '*.flac' -print0 | xargs -0 ~/bin/flac2mp3
${file%.flac}.mp3
대단해! 이전 ${x:: ${#x}-3}m4a
에는 노래의 파일 이름을 .wav에서 .m4a로 변경하기 위해 사용 했습니다. 꽤 쉬운 방법을 보는 것이 좋습니다.
!/bin/sh file="$1" outfile=${file%.flac}.mp3 eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/") flac -cd "$file" | lame --preset standard \ --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \ --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \ - "$outfile"
ffmpeg는 기본적으로 태그를 유지하지만 아트를 덮지 않습니다.
for f in *.flac; do ffmpeg -i "$f" -aq 1 "${f%flac}mp3"; done
-aq 1
-V 1
절름발이에 해당합니다 . -acodec libfaac
파일을 AAC로 변환합니다.
for f in *.flac; do ffmpeg -i "$f" -acodec libfaac -aq 200 "${f%flac}m4a"; done
나는 너희들이 가진 것을 가져 갔지만 xargs
작업을 병렬화하여을 사용하여 더 빠르게 실행했다 .
find <directory> -name '*.flac' -print0 | xargs -0 -P8 -n1 /usr/local/bin/flac2mp3
그런 다음 위의 / usr / local / bin / flac2mp3 스크립트입니다.
#!/usr/bin/env bash
for f in "$@"; do
[[ "$f" != *.flac ]] && continue
album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"
flac --decode --stdout "$f" \
| lame --preset extreme \
--add-id3v2 \
--tt "$title" \
--ta "$artist" \
--tl "$album" \
--ty "$year" \
--tn "$tracknumber" \
--tg "$genre" \
- "${f%.flac}.mp3"
done
다음은 병렬 처리를 사용한 성능 향상에 대한 몇 가지 통계입니다.
find <dirOfFlac24s> -name '*.flac -print0 | xargs -0 -P8 -n1 /usr/local/bin/flac2mp320
0.00s user 0.00s system 60% cpu 0.002 total
115.94s user 1.40s system 359% cpu 32.655 total
time /usr/local/bin/flac2mp320 <dirOfFlac24s>/*.flac
96.63s user 1.46s system 109% cpu 1:29.98 total
당신은 또한 내 CPU를보다 효과적으로 사용하는 것을 볼 수 있습니다. 나는 인텔 i7을 가지고 있으므로 8은 아마도 올바른 프로세스 수입니다.
FLAC 소스 파일에서 MP3를 직접 인코딩하려고 할 때이 스레드를 찾았습니다. Boehj의 답변 은 적절한 스크립팅 옵션을 제공하지만 개인적으로 FFmpeg를 사용하는 것을 선호 하므로이 작업을 처리하기 위해 작성한 Bash 스크립트입니다. macOS Sierra (10.12.2)에서 테스트되었으며 훌륭하게 작동합니다.
부수입은 : 당신은해야 ffmpeg
하고 lame
이미 맥에 설치되어 있어야합니다. 가장 쉬운 방법은 Homebrew를 사용하는 것입니다. 먼저 Homebrew가 다음과 같이 설치되어 있는지 확인하십시오.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
그런 다음 설치하려면이 명령을 실행 ffmpeg
하고 lame
:
brew install ffmpeg lame
완료되면이 스크립트를 실행할 준비가되었습니다. 이 스크립트는 디렉토리에서 FLAC 파일을 찾지 path/to/FLAC/files
만 .
FLAC 파일이이 스크립트를 실행하는 동일한 디렉토리에 있는 경우 간단하게 변경할 수 있습니다 . 실행시 mp3/
모든 MP3 파일이 있는 하위 디렉토리 가 생성 됩니다. 배치.
find -E "path/to/FLAC/files" -type f -iregex ".*\.(FLAC)$" |\
while read full_audio_filepath
do
# Break up the full audio filepath stuff into different directory and filename components.
audio_dirname=$(dirname "${full_audio_filepath}");
audio_basename=$(basename "${full_audio_filepath}");
audio_filename="${audio_basename%.*}";
# audio_extension="${audio_basename##*.}";
# Set the MP3
mp3_dirpath="${audio_dirname}/mp3";
mp3_filepath="${mp3_dirpath}/${audio_filename}.mp3";
# Create the child MP3 directory.
mkdir -p "${mp3_dirpath}";
# Get the track metadata.
mp3_title=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TITLE= | cut -d '=' -f 2- );
mp3_artist=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:ARTIST= | cut -d '=' -f 2- );
mp3_album=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:ALBUM= | cut -d '=' -f 2- );
mp3_year=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:YEAR= | cut -d '=' -f 2- );
mp3_track=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TRACK= | cut -d '=' -f 2- | sed 's/^0*//' );
mp3_tracktotal=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TRACKTOTAL= | cut -d '=' -f 2- | sed 's/^0*//' );
mp3_genre=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:GENRE= | cut -d '=' -f 2- );
# Where the magic happens.
ffmpeg -y -v quiet -nostdin -i "${full_audio_filepath}" -ar 44100 -sample_fmt s16 -ac 2 -f s16le -acodec pcm_s16le - | \
lame --quiet --add-id3v2 --pad-id3v2 --tt "${mp3_title}" --ta "${mp3_artist}" --tl "${mp3_album}" --tn "${mp3_track}"/"${mp3_tracktotal}" --tg "${mp3_genre}" -r -m s --lowpass 19.7 -V 3 --vbr-new -q 0 -b 96 --scale 0.99 --athaa-sensitivity 1 - "${mp3_filepath}";
done
내가“The Hard Way ™”를 배운 것들에 대한 일부 노트는 다른 사람들이이 스크립트에서 다른 것을 인터넷의 다른 것들과 다르게 얻을 수 있습니다.
grep
(사용 태그 구문 분석에 대한 명령 FFprobe 는 FFmpeg와 함께 설치)를 사용하여 대소 문자를 구분하지 않습니다 -i
그것을 만들 옵션을 grep -i
.cut
명령은 =
태그 이름 의 첫 번째만을 기반으로 출력을 -f 2-
명령으로 만드는 옵션 으로 나누는 것으로 제한됩니다 cut -d '=' -f 2-
. 예를 들어, Pavement 는 제목이“5-4 = Unity”인 노래를 가지고 있으며 컷을 통해 두 번째 청크 만 선택한 경우 해당 제목은“5-4”로 잘립니다.sed
위해 선행 0을 제거 하는 추가 파이프를 추가했습니다 sed 's/^0*//'
.-f wav
하며 실제로 LAME가 다시 인코딩 할 파이프 설정에서는 의미가없는 FFmpeg 출력을 압축합니다. 대신 여기의 출력 -f s16le -acodec pcm_s16le
은 기본적으로 RAW 출력으로 설정됩니다 . 이와 같은 다른 프로세스로 오디오를 파이핑하는 데 적합합니다.-r
옵션 을 추가해야했습니다 .--tt
, --ta
, --tl
, --tn
및 --tg
LAME에 대한 ID3v2는 태그 옵션을. 한 프로세스에서 LAME으로 오디오를 스트리밍 / 파이프하면 소스 파일의 메타 데이터가 손실됩니다. 제안 된 옵션 중 하나는 옵션을 설정 -f ffmetadata "[metadata filename here]"
한 다음 FFmpeg를 다음과 같이 다시 실행하여 FFmpeg 가 메타 데이터를 텍스트 파일에 저장하도록 하는 것 -i "[metadata filename here]" -map_metadata 1 -c:a copy [destination mp3 file] id3v2_version 3 -write_id3v1 1
입니다. 작동하지만 대상 파일의 요구 사항에 유의하십시오. FFmpeg는 파일을 복사 할 수있을 때 메타 데이터를 가져와 매우 낭비적인 프로세스 인 것 같습니다. 값을 얻을 수 FFprobe을 사용하여 다음과 LAME에서 그들을 설정 --tt
, --ta
, --tl
, --tn
및 --tg
옵션이 더 잘 작동; 모든 메타 데이터가 제자리에 작성되므로 중복 파일을 생성해야합니다.