터미널 만 사용하여 LAME & FLAC를 사용하여 .flac에서 .mp3로 이동하는 방법은 무엇입니까?


31

오랫동안 나는 LAME 플러그인과 함께 Audacity를 포함하는 상대적으로 복잡한 기술을 사용했습니다. 이것은 내가 추측하는 것은 좋지만 터미널 접근 방식의 매력은 조금 더 세분화되어 [options]최신 바이너리를 사용할 수 있다는 것입니다.

또한 MacBook이 약간 노화되고 있으며 불필요한 GUI를 제거 할 수 있다면 더욱 좋습니다.

미리 감사드립니다.


1
;)
Mortimer

하하 .. 질문에 대답했지만 이틀 동안 답을 확인할 수 없다는 것입니다. 죄송합니다. 여전히 여기서 어떻게 작동하는지 알아 내십시오. 멋진 사이트. : D
boehj

답변:


41

태그를 유지하지 않고 단일 파일 변환

brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3
  • --decode --stdout = -dc
  • lame - $outfile = STDIN에서 입력
  • --preset extreme= ~ 245kbit / s VBR

일부 ID3 태그를 유지하는 쉘 스크립트

#!/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

2
질문의 텍스트에 대한 참조가 아니라 여기에 답변을 게시해야합니다. IMHO, 당신은 질문과 답변을 편집하고 결론을 여기로 옮겨야합니다.
lpacheco

알았어 할게. 죄송합니다.
boehj

2
${file%.flac}.mp3대단해! 이전 ${x:: ${#x}-3}m4a에는 노래의 파일 이름을 .wav에서 .m4a로 변경하기 위해 사용 했습니다. 꽤 쉬운 방법을 보는 것이 좋습니다.
Jason Salaz

1
옵션 3에 버그가있는 것 같습니다. 아마도 lame 버전 때문일 수도 있지만 현재 코드는 입력 스트림을 입력 파일로 사용해야하며 출력 파일이 지정되어 있지 않습니다. 필요한. 나를 위해 최종 코드는 다음과 같습니다 !/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"
Mehal

또한이 '찾기'작업을 수행하는 스크립트를 작성하는 것이 좋습니다.
Mehal

10

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

나는 방금 이것을했고 그것은 말했다 :``메타 데이터 : 주석 : 표지 (전면) 인코더 : Lavc57.107.100 png```macOS 파인더는 표지 예술을 보여줍니다. ffmpeg 3.4.2 추출.
Habbie

그런 다음 ffmpeg가 매우 오래되었다는 것을 깨달았습니다. 작업 표지 아트와 동일한 크기의 mp3 파일과 동일한 결과로 4.1.3으로 업그레이드했습니다.
Habbie

4

나는 너희들이 가진 것을 가져 갔지만 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은 아마도 올바른 프로세스 수입니다.


2

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*//'.
  • 인터넷과 유사한 스크립트에서 FFmpeg 출력은 비슷 -f wav하며 실제로 LAME가 다시 인코딩 할 파이프 설정에서는 의미가없는 FFmpeg 출력을 압축합니다. 대신 여기의 출력 -f s16le -acodec pcm_s16le은 기본적으로 RAW 출력으로 설정됩니다 . 이와 같은 다른 프로세스로 오디오를 파이핑하는 데 적합합니다.
  • 파이프의 LAME 측에서 RAW 출력을 처리하기 위해 -r옵션 을 추가해야했습니다 .
  • 또한,주의 --tt, --ta, --tl, --tn--tgLAME에 대한 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옵션이 더 잘 작동; 모든 메타 데이터가 제자리에 작성되므로 중복 파일을 생성해야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.