it-gundan.com

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

특정 폴더에서 모든 * .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

내 목표를 얻는 방법?

31
Kevin Dong

이 시도:

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

간단한 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 and lame (즉, flac 및 lame 읽기, 파이프에서 lame, 파일 .mp3로 출력)를 직접 사용하여 ffmpeg없이 수행 할 수도 있습니다.

52
Lewis Diamond

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

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

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 코어 당 하나의 작업) 터미널의 출력이 혼합되지 않도록합니다.

1 장 +2 장을 읽는 데 15 분을 더 배우려면 https://zenodo.org/record/1146014

2
Ole Tange

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

오, 그래요. OSMC가 ffmpeg에 대한 패키지를 제공하지 않았기 때문에 ffmpeg 만 사용했기 때문에 avconv를 사용하지 않았습니다. 이미 여기에 있습니다. 적어도 가장 중요한 부분은 "기본적으로"동일합니다. avconv 명령을 ffmpeg로 바꾸십시오. 내 첫 경기는 ffmpeg bin와 정확히 같은 옵션입니다.

나는 결코 bash 해커가 아니지만 주어진 요구 사항이있는 첫 번째 bash 스크립트로 관리했으며 누군가가 도움이 될 것입니다. 나는 당신의 의견에 대해 열려 있지만 지금까지는 효과적입니다.

각 코어마다 하나씩 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-mp 에서 찾을 수 있습니다.

2
Kay Urbach

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

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

폴더의 flac 파일을 mp3 파일을 찾은 다음 기존 "mp3"폴더로 이동합니다. 파일 이름은 "original_name.flac.mp3"

1
DanBC
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
X Tian

파일 이름은 "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
0
DenisVS

예를 들어, avi 파일이 여러 개인 경우 :

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

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
Riccardo Volpe

병렬 FTW

ls *flac | while read f; do ffmpeg -i "$f" -acodec libmp3lame $f.mp3 & done
0
hoffmanc

다음 셸 명령은 현재 폴더에서 시작하는 모든 하위 폴더를 재귀 적으로 살펴보고 모든 .flac 파일을 .mp3 형식으로 변환하여 파일 이름과 원래 디렉토리 구조를 유지합니다.

모든 .flac 파일을 .mp3로 변환하고 원본 .flac 소스 파일은 유지하려면 다음을 사용하십시오.

find . -type f -name "*.flac" -exec bash -c 'FILE="$1"; ffmpeg -i "${FILE}" -vn -c:a libmp3lame -ab 320k -y "${FILE%.flac}.mp3";' _ '{}' \;

-ab는 출력 mp3 파일에 대해 원하는 오디오 비트 전송률입니다 (보통 128k-320k 범위에서 품질은 높지만 파일 크기는 더 큼).

문제가 있거나 더 높은 비트 전송률로 .flac 파일의 변환을 다시 실행하려는 경우 원본 소스 .flac 파일이 유지되며 위 명령을 반복하면 이전에 생성 된 .mp3 파일을 새 파일로 덮어 씁니다 ( -y 플래그는 ffmpeg에게 확인을 요구하지 않고 동일한 이름으로 이전 출력 파일을 겹쳐 쓰도록 지시합니다.

모든 파일이 성공적으로 변환되면 다음 스크립트를 사용하여 원본 .flac 파일을 제거 할 수 있습니다.

find . -type f -name "*.flac" -exec bash -c 'FILE="$1"; rm "${FILE}";' _ '{}' \;

또는 모든 .flac 파일을 .mp3로 재귀 적으로 변환하고 한 줄의 스크립트로 원본 .flac 파일을 한 번에 제거 할 수 있지만 소스 파일이 삭제되므로주의해서 사용해야합니다.

find . -type f -name "*.flac" -exec bash -c 'FILE="$1"; ffmpeg -i "${FILE}" -vn -c:a libmp3lame -ab 320k -y "${FILE%.flac}.mp3" && rm "${FILE}";' _ '{}' \;

.flac 이외의 형식의 오디오 파일을 .mp3로 재귀 적으로 변환하려면 '.flac'를 적절한 입력 파일 확장자 (예 : '.wav', '.wma'등)로 바꾸도록 위 스크립트를 편집하십시오. )

0
Dave

도움이된다면 ....이 작업을 수행하기 위해 작은 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
Laurent

in * .flac의 경우

oUTF = echo "$a" | sed s/\.flac$/.mp3/g를하십시오

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

끝난

0
Peter McConnell