web-dev-qa-db-ja.com

Lame-すべての320kbps mp3を192kbps mp3に再エンコードする方法

タイトル通り。 192kbpsに変換する必要がある320kbps形式のMP3がたくさんあります。現在、lame --mp3input -b 192を使用しています。これは、同じ名前で、拡張子が.mp3のファイルを作成します。だから私はfoo.mp3.mp3になります。

ディレクトリを入力し、320kbpsのサブディレクトリをスキャンし、192kbpsに変換して、存在する場合は上書きできるようにする必要があります。 Lameはこれに最適なツールですか?

ありがとう

6
Moif Murphy

lameはこのタスクに完全に適していますが、この答えにはffmpegffprobeを使用します。これらは私の手の甲のようで、一般化できるためです。 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 {}' 
9
evilsoup

Lameは、このタスクを実行するのに最適なものの1つです。

コマンドlame -b 192 input.mp3 output.mp3を使用できます

パイプコマンドには向いていませんが、exiftoolを使用してmp3ファイルのビットレートを取得できます

exiftool -AudioBitrate File.mp3 

しかし、あなたはまだmp3ファイルを見つけ、ビットレートをチェックして変換するコマンドをパイプする方法が必要です...

2
AdigaJo