• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:linuxでのmp3gainコマンドの使い方)

Linuxでのmp3gainコマンドの使い方

このQ&Aのポイント
  • Linuxでのmp3gainコマンドを使用して、700個のmp3ファイルの音量をノーマライズする方法について教えてください。
  • mp3gainコマンドを使って一括でノーマライズする方法について教えてください。
  • シェルスクリプトを使用せずに、個々のファイルに対してmp3gainコマンドを実行する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

http://chirijiri.blog17.fc2.com/blog-entry-19.html ほらよ。 ループでない処理のパターン。 findを使ってファイル名検索とパイプを使った方法。 >引数が1ファイルなので 各ファイルの平均値を出すのではなくて上記のサイトを見る限り89dbで自動的に調整するだけみたい。 それとコマンドのオプションがわからなければman使えよ。 dbの値を調整するオプションもあるみたいだな。 最近の奴はmanを知らないのか?それとも自分でmanする気がないのか?

reiman
質問者

お礼

ちなみに動いている前者対応版は以下のとおりです 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

reiman
質問者

補足

ありがとうございます manはよく使っています -rオプションはそれで選択しました 問題は1ファイル指定だと音量が他との関係がないのでノーマライズはできるわけないと思ったのです 従ってmp3gain -rの引数として全ファイルを一度に設定しなければ鳴らないのでは と思ったのです この辺のことろまではman mp3gainには書いていません もし全ファイル指定だと ループを使って files="file1 file2 file3 … file700" として #mp3gain $files は IFS=" " をしているので機能しません ($filesの内容が1つのファイル名とみなされるため) 勿論 #file=file1 #mp3gain $file は機能します 従って前者ならば問題は解決されて動いています しかし後者(全ファイル指定が必要)だとまだ作っていませんが作成が大変です よろしくお願いします

その他の回答 (2)

回答No.4

>DBは相対量(比)なので最初の質問の解答にはなっていませんね だからといってその基準値となる音がどう考えてもmp3gainで一度に複数ファイル指定しても平均値とか取っているようには いろいろなサイトをまわって検索しても出てこないって事は mp3gainそのものに基準値がセットされていると思うのが普通だと思うけど。

reiman
質問者

お礼

ありがとうございます とにかく一度に引数を設定していればいいわけなので作って見ました 後者でやれば問題ないはずなので疑問は残りますが妥協して解決です 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

回答No.1

シェルスクリプト書くならループさせようよ。

reiman
質問者

補足

ありがとうございます 前者の場合はループで簡単にできますが すべてのmp3gain -rの引数が1ファイルなので これでノーマライズが出きるかどうか疑問です もしそれでできるならばもうループを使って作っているので問題は解決です 要するにノーマライズのために mp3gain -rの引数の引数として全てのファイルを一度に指定しなければならないかどうか をお聞きしたいのです そうすると最初に IFS=" " をしているのでループでやるにしても大変です よろしくお願いします

関連するQ&A

専門家に質問してみよう