FFmpeg를 사용하여 모든 * flac를 * .mp3로 변환하는 Bash 스크립트?


28

특정 폴더에서 모든 * .flac를 * .mp3로 변환하고 싶습니다.

이것은 내가 시도했지만 작동하지 않습니다.

# change to the home directory
cd ~/music
# convert all *.flac files
ffmpeg -i *.flac -acodec libmp3lame *.mp3
# (optional: check whether there are any errors printed on the terminal)
sleep 60

내 목표를 얻는 방법?


3
"FOR LOOP"을 시도 했습니까?
Danila Ladner

@DanilaLadner 아직. 실마리 감사합니다.
Kevin Dong

: 나는 동안,이 작업을 수행 병렬, 복사 태그 스크립트 작성 http://tuxhelp.org/#flac-distiller

잊어 버려서 미안 해요 변환 파일 이름이 file.avi.mp3가 된 후 다음을 사용할 수 있습니다. "s / .avi // g"* .avi.mp3 이름 바꾸기.

1
열심히 일한 후에 컴퓨터 휴식을 취하십시오.
MeowMeow

답변:


37

이 시도:

for i in *.flac ; do 
    ffmpeg -i "$i" -acodec libmp3lame "$(basename "${i/.flac}")".mp3
    sleep 60
done

1
공간이 포함 된 파일로는 작동하지 않습니다. $(basename "${i/.flac}")공백을 처리하도록 수정 하려면 어떻게 해야합니까?
ppr

1
@ppr 바로 전에이 줄을 넣어보십시오 forIFS = $ '\ n': 루프
MKC

6
나는 변경하여 공간 문제를 해결 $(basename "${i/.flac}").mp3"$(basename "${i/.flac}").mp3"(주위에 따옴표를 넣어)
MalcolmOcean

50

간단한 1 라이너 솔루션 : find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

http://lewisdiamond.blogspot.ca/2012/01/converting-flac-to-mp3.html

이것은 주어진 디렉토리에 재귀 적으로 적용됩니다. 즉, Music 폴더에서 이것을 실행하면 하위 폴더의 모든 플랙이 변환되고 그 옆에 .mp3가 생성됩니다. 링크에 표시된 것처럼 flac 및 lame (예 : flac 읽기, 파이프에서 lame, 파일 .mp3로 출력)를 직접 사용하여 ffmpeg없이 수행 할 수도 있습니다.


-maxdepth 1재귀를 제한하기 위해 X Tian의 대답과 같은 생각을 사용할 수 있습니다 .

2
그래 넌 할수있어. xargs 또는 for 루프에 파이프 된 ls를 사용할 수도 있습니다. 나는 재귀 검색이 OP가 필요로하는 것에 더 가깝다는 가정을하고 있습니다 (예 : 내 음악 라이브러리에서 모든 .flac 변경).
Lewis Diamond

16
그러나이 명령은 훌륭합니다. * .flac.mp3라는 파일이 생성됩니다. 당신의 명령을 사용하여, 나는 이것을 생각해 냈습니다.find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
Shane

2
그렇습니다. 블로그에서 설명했듯이 .mp3 추가 의이 측면은이 파일이 무손실 소스에서 가져온 것이므로 내 하드 드라이브의 어딘가에서 찾을 수 있기 때문에 좋습니다.
Lewis Diamond

@Shane 의견이 저에게 효과적이었습니다.
Chaudhry Waqas

8

파일 이름에 공백이있는 경우 :

for a in *.flac; do
  f="${a[@]/%flac/mp3}"
  ffmpeg -i "$a" -qscale:a 0 "$f"
done

mp4 및 wav 파일이 혼합 된 폴더가 있습니다. mp3로 어떻게 변환합니까? 고맙습니다.
kRazzy R

2

나는 내가 여기에서 찾은 모든 것을 가져 갔고 아마의 flac를 재귀 적으로 만들뿐만 아니라 다중 스레드를 지원하는 다른 경로를 만들기 위해 상대 경로를 유지하는 작은 도구를 만들었습니다.

오, 그래, 나는 OSMC가 ffmpeg에 대한 패키지를 제공하지 않았기 때문에 ffmpeg를 사용하지 않았지만 avconv 만 보았지만 이미 여기 있기 때문에 "기본적으로" 적어도 가장 중요한 부분은 동일합니다. "avconv"명령을 "ffmpeg"로 바꾸십시오. 나의 첫 번째 실행은 ffmpeg bin과 똑같은 옵션이었습니다.

나는 결코 bash 해커가 아니지만 주어진 요구 사항을 가진 첫 번째 bashscript로 누군가를 관리 할 것입니다. 나는 당신의 의견에 대해 열려 있지만 지금까지는 효과적입니다.

각 코어마다 하나씩 4 개의 인스턴스를 생성하는 스크립트는 다음과 같습니다.

#!/bin/bash
# this should be quite self-explanatory 
for i in {1..4}
do
echo "started instance no: $i"
/home/osmc/transform.sh . &
# sleeping time can be shorter, this is just so, that 
# not all 4 processes will want to start with the same 
# file, during runtime collisions should not become an issue
sleep 5
done
echo "all instances started"

그리고 작업자 스크립트는 다음과 같습니다.

#!/bin/bash
# take care of spaces
IFS=$'\n'
# my music folders, remote is the source, local the target dir
remote=/mnt/music/FLAC
local=/mnt/1tb/mp3
# for all flac files start loop
for i in $(find $remote -type f -iname '*.flac' );
do
## SET VARIABLES for PATHS and FILENAMES
## this might be able to be super short with sed and complex one-liner,
## but I s*ck at regex
fullfile=$i
# strip extension
filename="${i##*/}"
# add new extension
filename="${filename%.*}.mp3"
# get full dirname from inputfile
fulldir=$(dirname "${i}")
# strip leading dirs from full input dir
# count the dirs, add two, then you're good.
reldir="$(echo $fulldir | cut -d'/' -f5-)"
# some subdirs in my collection even have a flac subdir, you might
# ignore this, it strips only if it exists
reldir=${reldir//flac}
# combine target dir and relative dir
outdir="$local/$reldir"
# generate the full output filename for conversion
outfile="$outdir/$filename"
# create whole target directory - yes, I need it only once, but hey,
# it works, didn't want to start a if not exist statement... should I? 
mkdir -p "$outdir"
# run conversion - finally... you may want or need to replace 
# "avconv" with "ffmpeg"
avconv -n -nostats -loglevel info -i "$fullfile" -codec:a libmp3lame -qscale:a 0 "$outfile"
done

https://github.com/erdnuesse/flac-to-mp3 에서 찾을 수 있습니다

감사합니다, 케이


탑승을 환영합니다. +1
Alex Stragies

1

ffmpeg가 여기에서 잘 작동하지 않기 때문에 avconv를 사용하여 @Ketan의 답변을 연구했습니다.

for i in *.flac ; do 
    avconv -i "$i" "./mp3/$i".mp3
done

flac폴더의 파일을 파일 로 변환 mp3한 다음 기존 "mp3"폴더로 이동합니다. 파일은 "original_name.flac.mp3"모델에서 이름이 지정됩니다.


1
find . -maxdepth 1 -type f -name '*.flac' | while IFS= read -r f; do
  ffmpeg -i  "$f" -acodec libmp3lame "$( sed -e's/\.flac/.mp3/g' <<< $f )"
done

1
sed 표현은 엔딩이 필요합니다
Jaime M.

1

GNU Parallel은 이러한 종류의 작업을 위해 만들어졌습니다.

# change to the home directory
cd ~/music
# convert all *.flac files
parallel ffmpeg -i {} -acodec libmp3lame {.}.mp3 ::: *.flac
# (optional: check whether there are any errors printed on the terminal)
sleep 60

작업을 병렬로 실행하고 (CPU 코어 당 하나의 작업) 터미널의 출력이 혼합되지 않도록합니다.

자세한 내용은 15 분 동안 1 장 +2 장을 읽으십시오 : https://zenodo.org/record/1146014


이것은 흥미로워 보인다. {.}.mp3 :::구조가 무엇을하는지 설명해 주 시겠습니까? 아니면 그것을 설명하는 매뉴얼 섹션을 참조하십시오?
jottr


0

예를 들어, 여러 avi 파일이있는 경우 :

ls *.avi | xargs -I {} ffmpeg -i {} {}.mp3

0

도움이된다면 ....이 작업을 수행하기 위해 작은 bash 스크립트를 작성했습니다 .... ffmpeg / flac가 설치되어 있어야합니다.

작동 방식 :

두 가지 인수가 필요합니다.

  1. 음악 라이브러리의 폴더 (flac / ogg / mp3 ...)
  2. 대상 폴더 (이전에 생성해야 함)

그것은 생산 :

  • 원본 폴더에서 대상 폴더로의 정확한 사본 :
    • 비 flac 파일이 복사됩니다.
    • mp3로 변환 된 flac 파일 (VBR 고품질)
  • flac 파일을 변환하는 명령이있는 run.sh 파일 (이 스크립트는 자동으로 실행 됨)

#!/bin/bash

FLAC_PATH=$1
CONV_PATH=$2

DEBUG=0;

function usage {
  echo "";
  echo "    This script convert all flac files from a folder to mp3 files to a second folder";
  echo "";
  echo "    Usage :";
  echo "        ./conv.sh {Source Folder} {Destination Folder}";
  echo "        note : booth folder must exist before starting this script";
  echo "               files other than flac are copied to the destination folder";
  echo "";
}

if [ ! -d "$2" ]; then
  echo "";
  echo " ERROR : [$2] is not a directory.";
  usage
  exit 1
fi;

if [ ! -d "$2" ]; then
  echo "";
  echo " ERROR : [$2] is not a directory.";
  usage
  exit 1
fi;

COMMANDS="run.sh"
echo "" > run.sh
echo " convert from $FLAC_PATH to $CONV_PATH ";

find "${FLAC_PATH}" -type f |while read myFile; do
  SRC_DIR=${myFile%/*}
  SRC_FILE=${myFile##*/}
  DST_DIR=$CONV_PATH/$SRC_DIR
  mkdir -p "${DST_DIR}"
  # TEST if the file is a flac ....
  metaflac --show-md5sum "${myFile}" 2>/dev/null 1>/dev/null
  if [ $? -eq 0 ]; then
    echo -n "  *** $myFile [FLAC !] : "
    DST_FILE=${myFile%.*}
    OUT_PATH="${DST_DIR}/$( echo $SRC_FILE | sed -e 's/.flac$/.mp3/')"

    if [ $DEBUG == 1 ]; then
      echo "  SRC = $myFile";
      echo "  OUT = $OUT_PATH"
    fi;

    if [ -f "$OUT_PATH" ]; then
      echo "  exist, do nothing !";
    else
      echo "  add to compress list !";
      echo "ffmpeg -y -i \"${myFile}\" -codec:a libmp3lame -q:a 0 -map_metadata 0 -id3v2_version 3 \"${OUT_PATH}\" " >> $COMMANDS
    fi;

  else
     echo -n "  *** $SRC_FILE  [NOT FLAC] : "
     if [ -f "${CONV_PATH}/${myFile}" ]; then
       echo " exist, do nothing !"
     else
       echo "  copy."
       cp "${myFile}" "${CONV_PATH}/${myFile}"
     fi
  fi

done;

echo " And now, CONVERT THE FLAC's!!! "
sh run.sh

0

mp3에서 중첩 폴더의 모든 flac 또는 wav 파일을 재귀 적으로 변환하려면 다음 명령을 사용했습니다.

find '~/Music/' -iname '*.flac' , -iname '*.wav' -exec bash -c 'D=$(dirname "{}"); B=$(basename "{}"); mkdir "$D/mp3/"; ffmpeg -i "{}" -ab 320k -map_metadata 0 -id3v2_version 3 -acodec libmp3lame "$D/mp3/${B%.*}.mp3"' \;

flac 또는 wav 파일이있는 폴더 안에 "mp3"이라는 이름의 폴더를 만들고 mp3 폴더 안에는 오래된 파일 확장명을 그대로 유지하면서 320kbps의 비트 전송률로 상대 mp3 파일을 저장합니다.


0

파일 이름은 "wav2mp3"입니다.

#!/bin/sh
# put the script to /usr/local/sbin
EXT_IN=$1
QUALITY=$2

if [ "${EXT_IN}" = "" -o "${QUALITY}" = "" ]; then
    printf "Usage: wav2mp3 \<in_file_ext\> \<quality\> \ne.g. wav2mp3 wav 2\n"
    exit 1
fi

#String delimeter
SAVEIFS=${IFS}
IFS='
'
# List of the files in directory lower than current to array
FILES_LIST=`find . -type f  -name "*.${EXT_IN}"`
for FILE in ${FILES_LIST}; do
    echo $FILE
    PREFIX=`echo $FILE | awk -F \. 'OFS="."{ $NF="" }1' | sed 's/.$//'`
    echo $PREFIX
    ffmpeg -i $FILE -codec:a libmp3lame -qscale:a $QUALITY $PREFIX.mp3
done

shellcheck.net 사용을 고려하십시오. 스크립트에 관한 몇 가지 제안이 있습니다.
구호

-1

in * .flac의 경우

OUTF를 =echo "$a" | sed s/\.flac$/.mp3/g

ffmpeg -i "$ a"-acodec libmp3lame "$ OUTF"

끝난


2
U & L에 오신 것을 환영합니다. 귀하의 답변은 4 년 전에 @Ketan의 답변에 거의 아무것도 추가하지 않습니다.
Archemar

-2

나는 이것이 상당히 늦다는 것을 알고 있지만 메모리에 대해서는 sourceforge의 내 스크립트 "batchaudiocvt"를 참조하십시오. 여러 형식간에 오디오 파일을 효율적으로 대량 변환하도록 설계된 (대형) 셸 스크립트입니다. 특히 일반적인 태그를 변환하는 것이 가장 좋습니다.


이 질문은 쉘에서 루프를 처리하는 방법에 관한 것 입니다. 사용자는 변환에 사용하려는 명령을 이미 알고 있습니다.
G-Man, 'Reinstate

Stack Exchange에 오신 것을 환영합니다 . 당신은 에릭 Dujardin ? 그렇다면 연락처 양식 을 사용하고 ``사용자 프로필을 병합해야합니다 ''를 선택하여 계정을 병합하는 것이 좋습니다.
Scott

죄송합니다. 파일 변환이라는 명시된 목표를 돕기 위해 노력하고있었습니다. 어쨌든 제공된 스크립트는 읽을만한 가치가 있습니다.
Eric Dujardin '11
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.