回答:
lame
完全にこのタスクに適していますが、私は使用するつもりだffmpeg
とffprobe
彼らはただMP3ファイル以上に一般化することができるので、私は私の手の背中のようにそれらを知っているので、この答えのためにと。まず第一に:
sudo apt-get install ffmpeg
メディアファイルを読み取ってすぐに入力を上書きできるツールはありません。中間ファイルを使用する必要があります。単一のファイルの場合、次のことができます。
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3
これらを1行に組み合わせることができます。
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3
&&
ことが意味mv
のコマンドがない限り実行されませんffmpeg
(成功を意味する)0のステータスで終了します。
ファイルのビットレートを確認するには、次のコマンドを使用できますffprobe
。
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'
-show_streams
ffprobe
個々のストリームに関する情報を表示するように指示します。どちらを選択する-select_streams
かを指示し、a:0
「最初のオーディオストリームを意味します(これは、ビデオストリームとして保存されるカバーアートの場合、MP3ファイルにとって重要です)。パイプ(|
)はの標準出力を受け取り、ffprobe
それをに送りますgrep
。grep
指定したパターンに一致する行のみを印刷しますbit_rate=320000
。この場合、文字列を含む行です。これを320k kbps MP3で実行すると、次のような行が表示されます。
bit_rate=32000
別のビットレートで実行すると、出力はまったく得られません。grepは一致に失敗し、ステータス1で終了します。これは、ffmpegコマンドでそのコマンドをチェーンできることを意味します。
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' && ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3
または、もう少し読みやすくします。
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' &&
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 &&
mv temp.mp3 file.mp3
これは320 kbps MP3でのみ機能します。いくつかのテストファイルで試してください。
次のステップは、これを複数のファイルで機能させることです。これを行うには、for
ループとfind
コマンドという2つの標準的な方法があります。以下は、ディレクトリ内のすべてのMP3に作用します。
for f in *.mp3; do
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done
これはサブディレクトリに入りません。そのためには、globstar
シェルオプションを設定する必要があります。
shopt -s globstar
for f in **/*.mp3; do
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done
とfind
:
find . -name '*.mp3' -exec sh -c 'ffprobe -show_streams -select_streams a:0 "$0" | grep -F "bit_rate=320000" &&
ffmpeg -y -i "$0" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$0"' '{}' \;
これらはすべて厳密に順次実行されます。一度に変換されるファイルは1つだけです。ただし、プロセッサーはそれ以上の能力を備えています。速度を上げるには、GNUを使用できますparallel
。
sudo apt-get install parallel
shopt -s globstar
parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' ::: **/*.mp3
または:
find . -name '*.mp3' | parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}'
Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}