- ベストアンサー
Linuxでのmp3gainコマンドの使い方
- Linuxでのmp3gainコマンドを使用して、700個のmp3ファイルの音量をノーマライズする方法について教えてください。
- mp3gainコマンドを使って一括でノーマライズする方法について教えてください。
- シェルスクリプトを使用せずに、個々のファイルに対してmp3gainコマンドを実行する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
http://chirijiri.blog17.fc2.com/blog-entry-19.html ほらよ。 ループでない処理のパターン。 findを使ってファイル名検索とパイプを使った方法。 >引数が1ファイルなので 各ファイルの平均値を出すのではなくて上記のサイトを見る限り89dbで自動的に調整するだけみたい。 それとコマンドのオプションがわからなければman使えよ。 dbの値を調整するオプションもあるみたいだな。 最近の奴はmanを知らないのか?それとも自分でmanする気がないのか?
その他の回答 (2)
- okbakasine
- ベストアンサー率27% (67/242)
>DBは相対量(比)なので最初の質問の解答にはなっていませんね だからといってその基準値となる音がどう考えてもmp3gainで一度に複数ファイル指定しても平均値とか取っているようには いろいろなサイトをまわって検索しても出てこないって事は mp3gainそのものに基準値がセットされていると思うのが普通だと思うけど。
お礼
ありがとうございます とにかく一度に引数を設定していればいいわけなので作って見ました 後者でやれば問題ないはずなので疑問は残りますが妥協して解決です same_volume2.sh: #!/bin/sh IFS=" " IN=`pwd`/ OUT=/root/デスクトップ/ cd $OUT if [ -e flv_music ] then for x in `find flv_music -name "*"` do y=$IN`echo $x | sed -e "s/flv_music/music/"` if [ -d $x ] then if [ ! -e $y -o ! -d $y ] then rm -rf $x fi else z=`echo $y | sed -e "s/\.flv$//"` if [ $z = $y ] then rm -f $x else if [ ! -e ${z}.v -o -d ${z}.v ] then rm -f $x fi fi fi done fi cd $IN if [ -e music ] then for x in `find music -name "*"` do if [ -d $x ] then y=$OUT`echo $x | sed -e "s/music/flv_music/"` if [ ! -e $y ] then mkdir -p $y fi fi done for x in `find music -name *.v` do if [ ! -d $x ] then x=`echo $x | sed -e "s/\.v$//"` y=$OUT`echo $x | sed -e "s/music/flv_music/"` if [ ! -e ${y}.flv ] then cp ${x}.v ${y}.v ffmpeg -i ${y}.v ${y}.mp3 fi fi done find ${OUT}flv_music -name *.mp3 -print0|xargs -0 mp3gain -c -r for x in `find music -name *.v` do if [ ! -d $x ] then x=`echo $x | sed -e "s/\.v$//"` y=$OUT`echo $x | sed -e "s/music/flv_music/"` if [ ! -e ${y}.flv ] then ffmpeg -i ${y}.mp3 -i ${y}.v -acodec copy -vcodec copy ${y}.flv rm -f ${y}.v ${y}.mp3 fi fi done else x=${IN}music/ echo ディレクトリ $x を作成しその中に拡張子.vの動画ファイルを配置するか echo 直下または子孫ディレクトリの中に拡張子.vの動画ファイルを echo 少なくとも1つ以上含むディレクトリを配置してください。 fi
- okbakasine
- ベストアンサー率27% (67/242)
シェルスクリプト書くならループさせようよ。
補足
ありがとうございます 前者の場合はループで簡単にできますが すべてのmp3gain -rの引数が1ファイルなので これでノーマライズが出きるかどうか疑問です もしそれでできるならばもうループを使って作っているので問題は解決です 要するにノーマライズのために mp3gain -rの引数の引数として全てのファイルを一度に指定しなければならないかどうか をお聞きしたいのです そうすると最初に IFS=" " をしているのでループでやるにしても大変です よろしくお願いします
お礼
ちなみに動いている前者対応版は以下のとおりです same-volume.sh: #!/bin/sh IFS=" " IN=`pwd`/ OUT=/root/デスクトップ/ cd $OUT if [ -e flv_music ] then for x in `find flv_music -name "*"` do y=$IN`echo $x | sed -e "s/flv_music/music/"` if [ -d $x ] then if [ ! -e $y -o ! -d $y ] then rm -rf $x fi else z=`echo $y | sed -e "s/\.flv$//"` if [ $z = $y ] then rm -f $x else if [ ! -e ${z}.v -o -d ${z}.v ] then rm -f $x fi fi fi done fi cd $IN if [ -e music ] then for x in `find music -name "*"` do if [ -d $x ] then y=$OUT`echo $x | sed -e "s/music/flv_music/"` if [ ! -e $y ] then mkdir -p $y fi fi done for x in `find music -name *.v` do if [ ! -d $x ] then x=`echo $x | sed -e "s/\.v$//"` y=$OUT`echo $x | sed -e "s/music/flv_music/"` if [ ! -e ${y}.flv ] then cp ${x}.v ${y}.v ffmpeg -i ${y}.v ${y}.mp3 mp3gain -c -r ${y}.mp3 ffmpeg -i ${y}.mp3 -i ${y}.v -acodec copy -vcodec copy ${y}.flv rm -f ${y}.v ${y}.mp3 fi fi done else x=${IN}music/ echo ディレクトリ $x を作成しその中に拡張子.vの動画ファイルを配置するか echo 直下または子孫ディレクトリの中に拡張子.vの動画ファイルを echo 少なくとも1つ以上含むディレクトリを配置してください。 fi
補足
ありがとうございます manはよく使っています -rオプションはそれで選択しました 問題は1ファイル指定だと音量が他との関係がないのでノーマライズはできるわけないと思ったのです 従ってmp3gain -rの引数として全ファイルを一度に設定しなければ鳴らないのでは と思ったのです この辺のことろまではman mp3gainには書いていません もし全ファイル指定だと ループを使って files="file1 file2 file3 … file700" として #mp3gain $files は IFS=" " をしているので機能しません ($filesの内容が1つのファイル名とみなされるため) 勿論 #file=file1 #mp3gain $file は機能します 従って前者ならば問題は解決されて動いています しかし後者(全ファイル指定が必要)だとまだ作っていませんが作成が大変です よろしくお願いします