特定のフォルダ内のすべての* .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
私の目標をどのように得るか?
これを試して:
for i in *.flac ; do
ffmpeg -i "$i" -acodec libmp3lame "$(basename "${i/.flac}")".mp3
sleep 60
done
シンプルな1ライナーソリューション:find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;
http://lewisdiamond.blogspot.ca/2012/01/converting-flac-to-mp3.html
これは指定されたディレクトリで再帰的に適用されることに注意してください。つまりこれをミュージックフォルダーから実行すると、サブフォルダーからすべてのフラックが変換され、その隣に.mp3が生成されます。リンクに示すように、fmpegを使用せずにflacとlameを直接使用して実行することもできます(つまり、flacを使用して読み取り、lameにパイプし、.mp3ファイルに出力します)。
ファイル名に空白がある場合:
for a in *.flac; do
f="${a[@]/%flac/mp3}"
ffmpeg -i "$a" -qscale:a 0 "$f"
done
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
私はここで(そしておそらく他のいくつかのサイトで)見つけたものすべてを取り、flacのmp3を再帰的に作成するだけでなく、マルチスレッドをサポートする他の場所にそれらを作成するために相対パスを保持する小さなツールを作成しました。
ああ、そうです。その場合、私はffmpeg
を使用しませんでした。私のOSMCがffmpeg
のパッケージを提供しなかったためです。avconv
だけですが、すでにここにありますが、少なくとも基本的には同じです。少なくとも最も重要な部分は同じです。コマンドavconv
をffmpeg
に置き換えるだけです。私の最初の実行はffmpeg bin
とまったく同じオプション。
私は決してbashハッカーではありませんが、与えられた要求を持つ最初のbashスクリプトとして管理しました。おそらく誰かが利益を得るでしょう。私はあなたの側からの提案をお待ちしていますが、これまでのところそれは私にとってはうまくいきます。
各コアに1つずつ、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
Ffmpegはここではうまく機能しないため、avconvを使用して@Ketanの回答に取り組みました。
for i in *.flac ; do
avconv -i "$i" "./mp3/$i".mp3
done
これにより、フォルダー内のflac
ファイルがmp3
ファイルに変換され、既存の「mp3」フォルダーに移動します。ファイルはモデル「original_name.flac.mp3」で名前が付けられます
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
ファイル名は「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
たとえば、複数のaviファイルがある場合:
ls *.avi | xargs -I {} ffmpeg -i {} {}.mp3
入れ子になったフォルダー内のすべての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ファイルを保存します。
パラレルFTW(間違いなく複数のコアがある-なぜそれらを使用しないのですか?):
ls *flac | while read f; do ffmpeg -i "$f" -acodec libmp3lame $f.mp3 & done
次のシェルコマンドは、現在のフォルダーから始まるすべてのサブフォルダーを再帰的に調べ、すべての.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ファイルを1行のスクリプトで一度に削除できますが、ソースファイルが削除されるため、注意して使用してください。
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」など)に置き換えます。 )
それが役立つ場合....これを行うための小さなbashスクリプトを作成しました.... ffmpeg
/flac
をインストールする必要があります。
仕組み:
それは2つの引数を取ります:
それは:を生成します
run.sh
ファイル(flacファイルを変換するコマンドを含む)(このスクリプトは自動的に実行されます)。
#!/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
in * .flac
oUTF = echo "$a" | sed s/\.flac$/.mp3/g
ffmpeg -i "$ a" -acodec libmp3lame "$ OUTF"
終わった