モノラルに変換したいステレオMP3がたくさんあります。これを行うための最良の方法は何ですか?私はそれらをバッチ処理できるものが好きです。できるだけオリジナルに近い品質を保ちたいです。私のファイルも異なるビットレートであるため、一部のファイルが128しかない場合、すべてのファイルを320kpbsにしたくありません。
また、ライブラリ全体からどのファイルがステレオであるかをすばやく確認する方法はありますか?
ステレオからモノラルに変換することは再エンコードを意味するので、同じビットレートを維持することは無意味です。実際、128 kbit/sMP3->新しい128kbit/s MP3を変換すると、2番目のMP3がモノラルであっても、ひどい品質になります(したがって、同じ主観的な品質には低いビットレートが必要になります)。
一般に、MP3には可変ビットレート(VBR)設定を使用します。これは、特定の品質を対象とし、エンコーダーが必要なビットレートを設定できるようにします(完全にサイレントなオーディオには、ホエールソングよりも低いビットレートが必要です。ダブステップ)。コマンドラインから、ffmpegはオプション-ac 1
を使用してオーディオをモノラルに変換できます。
ffmpeg -i input.mp3 -c:a libmp3lame -q:a 2 -ac 1 output.mp3
-q:a
の使用ガイドについては、 このページ を参照してください。そのページの表はステレオオーディオを対象としていることに注意してください。表示される実際のビットレートはやや低くなります。通常は3〜4をお勧めしますが、元のCDではなくMP3からエンコードしているため、少し高い値を目指す必要があります。
もちろん、これは非常に簡単に自動化できます。 Linux/OSX /その他のUNIXライクでは、MP3のディレクトリを変換するには:
for f in *.mp3; do ffmpeg -i "$f" -c:a libmp3lame -q:a 2 -ac 1 mono-"$f"; done
再帰的に行うには:
find . -type f -name "*.mp3" -exec ffmpeg -i '{}' -c:a libmp3lame -q:a 2 -ac 1 mono-'{}' \;
GNUパラレルおよびマルチコアマシンを使用している場合、これが役立つ場合があります。
find . -type f -name "*.mp3" | parallel ffmpeg -i {} -c:a libmp3lame -q:a 2 -ac 1 mono-{}
Lameは-mスイッチを使用してファイルをモノラルに変換できます。メタタグを保持できるという利点があります(ffmpegでもそれができるかどうかはわかりません)。
これは、可変ビットレート品質オプションの1つでトランスコードする前に、mp3のビットレートを決定するやや複雑な例です。
cat s2mono.sh #!/ bin/bash mp3file = $ @ mp3size(){ du -sk "$ 1" | awk '{print $ 1 * 8}' } mp3length(){ id3info "$ 1" |\ awk '/ === TLEN/{if($ NF> 0){len = int($ NF/1000)}} END {print len}' } mp3rate(){ echo $(( `mp3size" $ 1 "`/`mp3length" $ 1 "`)) } bitrate = `mp3rate" $ mp3file "` if [$ bitrate -gt 155];次にVBR = '-V4'; fi if [$ bitrate -gt 190];次にVBR = '-V2'; fi if [$ bitrate -gt 249];次にVBR = '-V0'; fi echo downsampling $ mp3file lame --silent $ VBR -mm --mp3input "$ mp3file"\ "$(basename" $ mp3file "。 mp3)-mono.mp3 "
これを、すべてのmp3の合計サイズがステレオ形式で80MBのフォルダーで実行しました。結果として得られたモノラルmp3はわずか32MBを消費しました。
find . -iname \*mp3 -print0 |xargs -0 -L1 sh s2mono.sh
(...)
du -skc *-mono.mp3| tail -n1
32376 total
find . -iname \*mp3 |grep -ve '-mono' |\
while read f; do du -sk "$f" ;done |\
awk '{ tot+=$1} END{print tot}'
80112
質問の最後の部分については、file
が行います。
find /R/audio/muzica/_ripped/wav -exec file {} \+ |grep Monaural
この回答 に基づいて、file
とsed
を使用するだけで、より移植性の高いソリューション(追加の依存関係、ID3v1タグとID3v2タグの問題なし)を取得できます。また、ビットレート設定をもう少し入力しました。
このスクリプトでは、コマンドラインで入力ファイルと出力ファイルを指定する必要があります。
#!/bin/bash
#
# Usage: (this script) stereo-input.mp3 mono-output.mp3
#
# concept via https://superuser.com/a/566023/253931
#
# gnu/linux
bitrate=`file "$1" | sed 's/.*, \(.*\)kbps.*/\1/'`
# osx
# bitrate=`afinfo "$1" | grep "bits per second" | sed 's/.*: \(.*\)000 bits per second.*/\1/'`
BR='-V9'
if [ $bitrate -gt 75 ]; then BR='-V8'; fi
if [ $bitrate -gt 90 ]; then BR='-V7'; fi
if [ $bitrate -gt 105 ]; then BR='-V6'; fi
if [ $bitrate -gt 120 ]; then BR='-V5'; fi
if [ $bitrate -gt 145 ]; then BR='-V4'; fi
if [ $bitrate -gt 170 ]; then BR='-V3'; fi
if [ $bitrate -gt 180 ]; then BR='-V2'; fi
if [ $bitrate -gt 215 ]; then BR='-V1'; fi
if [ $bitrate -gt 230 ]; then BR='-V0'; fi
if [ $bitrate -gt 280 ]; then BR='-b320'; fi
echo "mono-izing file with detected bitrate '$bitrate': $1"
lame --silent $BR -m m --mp3input "$1" "$2"