アプリ版:「スタンプのみでお礼する」機能のリリースについて

を教えてください

700個のmp3ファイルfile1,file2,file3,…,file700の音量をノーマライズするときに

#mp3gain -r file1
#mp3gain -r file2
#mp3gain -r file3
・・・・・・・・・
#mp3gain -r file700

でOKでしょうか?それとも

#mp3gain -r file1 file2 file3 … file700

としなければならないでしょうか?
後者だとファイル数が700個あるのでシェルスクリプトを作るのが大変です
(IFSをセットしているため)
前者でよいのならば簡単なのですが

よろしくお願いします

A 回答 (3件)

http://chirijiri.blog17.fc2.com/blog-entry-19.html
ほらよ。
ループでない処理のパターン。
findを使ってファイル名検索とパイプを使った方法。

>引数が1ファイルなので
各ファイルの平均値を出すのではなくて上記のサイトを見る限り89dbで自動的に調整するだけみたい。

それとコマンドのオプションがわからなければman使えよ。
dbの値を調整するオプションもあるみたいだな。
最近の奴はmanを知らないのか?それとも自分でmanする気がないのか?

この回答への補足

ありがとうございます

manはよく使っています
-rオプションはそれで選択しました
問題は1ファイル指定だと音量が他との関係がないのでノーマライズはできるわけないと思ったのです
従ってmp3gain -rの引数として全ファイルを一度に設定しなければ鳴らないのでは
と思ったのです
この辺のことろまではman mp3gainには書いていません
もし全ファイル指定だと
ループを使って
files="file1 file2 file3 … file700"
として
#mp3gain $files

IFS="
"
をしているので機能しません
($filesの内容が1つのファイル名とみなされるため)
勿論
#file=file1
#mp3gain $file
は機能します

従って前者ならば問題は解決されて動いています
しかし後者(全ファイル指定が必要)だとまだ作っていませんが作成が大変です

よろしくお願いします

補足日時:2011/12/18 17:15
    • good
    • 0
この回答へのお礼

ちなみに動いている前者対応版は以下のとおりです

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

お礼日時:2011/12/18 17:32

>DBは相対量(比)なので最初の質問の解答にはなっていませんね


だからといってその基準値となる音がどう考えてもmp3gainで一度に複数ファイル指定しても平均値とか取っているようには
いろいろなサイトをまわって検索しても出てこないって事は
mp3gainそのものに基準値がセットされていると思うのが普通だと思うけど。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/12/18 19:28

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

この回答への補足

ありがとうございます

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

よろしくお願いします

補足日時:2011/12/18 16:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!