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」を試しましたか?
ダニラ・ラドナー14

@DanilaLadnerまだです。手がかりをありがとう。
ケビン・ドン

これを並行して行い、タグをコピーするスクリプトを作成しました:http

すみません、忘れてしまいました。ファイル名をfile.avi.mp3に変換すると、次を使用できます。「s / .avi // g」の名前を変更します。

1
ハードワークの後にコンピューターを休ませます。
MeowMeow

回答:


37

これを試して:

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

1
スペースを含むファイルでは機能しません。$(basename "${i/.flac}")スペースを処理するように変更するにはどうすればよいですか?
16年

1
@ppr forループの直前に次の行を入れてみてください。IFS = $ '\ 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フォルダからこれを実行すると、サブフォルダのすべてのflacが変換され、その横に.mp3が生成されます。リンクに示されているように、flacとlameを直接使用して(つまり、wlacを読み取り、lameにパイプし、ファイル.mp3に出力する)ffmpegを使用せずに実行することもできます。


-maxdepth 1X Tianの答えのように、再帰性を制限するために使用できます。

2
はい、できます。xargsまたはforループにパイプされたlsを使用することもできます。私は、OPが必要とするものに沿って再帰的検索がより重要である(つまり、音楽ライブラリのすべての.flacを変更する)という(おそらく間違った)仮定をしています。
ルイスダイアモンド14年

16
このコマンドは素晴らしいですが、しかし; * .flac.mp3という名前のファイルになります。あなたのコマンドを使用して、私はこれを思いついたfind -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
シェーン

2
はい。ブログで説明したように、.mp3を追加するこの側面が気に入っています。なぜなら、このファイルはロスレスソースからのものであり、ハードドライブのどこかにあるはずだからです。
ルイスダイヤモンド

@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のmp3を再帰的に作成するだけでなく、マルチパスをサポートして他の場所にそれらを作成する相対パスを保持する小さなツールを作成しました。

ああ、はい、その場合、私はffmpegを使用しませんでした。私のOSMCはffmpegのパッケージを提供せず、avconvだけを提供したからです。同じ-少なくとも最も重要な部分。コマンド「avconv」を「ffmpeg」に置き換えるだけです。私の最初の実行は、ffmpeg binとまったく同じオプションでした。

私は決してbashハッカーではありませんが、指定された要求を持つ最初のbashscriptとして管理しました。私はあなたの側からの提案を歓迎しますが、今のところ私にとってはうまくいきます。

4つのインスタンス(コアごとに1つ)を起動するスクリプトは次のようになります。

#!/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
アレックスストラージ

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式には末尾が必要です '
ハイメ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コアごとに1つのジョブ)、ターミナルの出力が混ざらないようにします。

詳細については、第1章と第2章を読むのに15分かかりますhttps : //zenodo.org/record/1146014


これは面白そうです。{.}.mp3 :::コンストラクトの機能を説明していただけますか?または、それを説明するマニュアルのセクションを参照してください。
jottr


0

たとえば、複数のaviファイルがある場合:

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

0

それが役立つ場合....これを行うための小さなbashスクリプトを書きました.... ffmpeg / flacをインストールする必要があります。

使い方:

2つの引数が必要です。

  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

ネストされたフォルダー内のすべてのflacまたはwavファイルをmp3で再帰的に変換するには、次のコマンドを使用しました。

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の使用を検討してください。スクリプトに関する多くの提案があります。
llogan

-1

a 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 Monica」と言う

Stack Exchangeへようこそ。あなたはエリック・デュジャルダンですか?その場合、連絡先フォームを使用し、「ユーザープロファイルをマージする必要があります」を選択してアカウントをマージするとよいでしょう。
スコット

申し訳ありませんが、ファイルを変換するという目標を支援しようとしていました。とにかく、提供されたスクリプトは読む価値があります。
エリックDujardin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.