タイトル通り。 192kbpsに変換する必要がある320kbps形式のMP3がたくさんあります。現在、lame --mp3input -b 192
を使用しています。これは、同じ名前で、拡張子が.mp3のファイルを作成します。だから私はfoo.mp3.mp3
になります。
ディレクトリを入力し、320kbpsのサブディレクトリをスキャンし、192kbpsに変換して、存在する場合は上書きできるようにする必要があります。 Lameはこれに最適なツールですか?
ありがとう
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
がステータス0(成功を意味する)で終了しない限り、ffmpeg
コマンドが実行されないことを意味します。
ファイルのビットレートを確認するには、ffprobe
を使用できます。
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'
-show_streams
は、ffprobe
に個々のストリームに関する情報を表示するように指示します。 -select_streams
はそれを指示しますwhich選択するもの、および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
Shellオプションを設定する必要があります。
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 {}'
Lame
は、このタスクを実行するのに最適なものの1つです。
コマンドlame -b 192 input.mp3 output.mp3
を使用できます
パイプコマンドには向いていませんが、exiftool
を使用してmp3ファイルのビットレートを取得できます
exiftool -AudioBitrate File.mp3
しかし、あなたはまだmp3ファイルを見つけ、ビットレートをチェックして変換するコマンドをパイプする方法が必要です...