シェルスクリプトをいじるのはほぼ初めてなので、今後のために気づいたことをメモしておく。多分忘れるから。
シェルスクリプトからlameコマンドを呼び出すとき、ターミナルにタイピング入力する感覚で必要なオプションを書き並べていけばいいと思っていたら、Unixのシェルはすごく賢くてそんな単純なものではなかった。
Macを使っている気安さから(ファイルやフォルダが内部的なID番号で識別されていた時代が懐かしい=Mac OS 9以前)、ファイル名に空白文字が入ることがしょっちゅうある。今回lameに渡したいファイル名にも空白文字が入ることがある。Windowsのコマンドプロンプトの感覚で、空白文字は引数のセパレータだからファイルパスをダブルクォーテーションで囲わないといけないかな、と思って自分でダブルクオーテーションで囲ったパスの文字列を含んだlameを呼び出すコマンド行を色々作ってみるが全然動かない。どうやら、パスを変数に入れておいて変数をダブルクォーテーションで囲って与えてやれば、正しく動くらしい。
いつも使っているポータブルオーディオプレーヤーが安物なので、サンプリング周波数が44.1 kHz以外ではピーとかギャーとかいうノイズが混入する。ところが、最近使っているFMチューナーは48 kHzで出力してくる(他にはその倍数で)。そこで、lameのリサンプルオプションでサンプリング周波数の変換を行っている。ポータブルオーディオプレーヤー用には別途定位改善のための処理も行っている。このとき、AIFFで保存した元ファイルを処理後に原則的にWAVファイルで保存しているが、たまに間違ってAIFFで保存してしまうことがある。AIFFで保存するときはたいてい" HPL"という識別用の文字列を付加する。つまりポータブルオーディオプレーヤー用にリサンプルが必要なファイルは、ファイル名の末尾が" HPL"か拡張子が"WAV"ということになる。
そこで、ファイル名の末尾が"HPL"か"WAV"の場合はリサンプルオプションを設定することにした。具体的には"--resample 44.1"なのだが、これをひとつの変数にいれておくと動作せず、"--resample"と"44.1"を別々の引数に入れて渡す必要があった。
Automatorでフォルダーアクションに設定したシェルスクリプトを実行すると、どういうエラーなのかさっぱりわからないので、確認用のシェルスクリプトをターミナルで実行していたのだけど、echoで処理した文字列を表示させるだけだと、今回メモしたような内容は見た目は問題ないため確認できない。
結局作ったのは以下のスクリプト。面倒なので出力フォルダは固定で直打ち (^_^;)
for f in "${@}"
do
qo="-V4"
ffn="${f##*/}"
extstr="${ffn##*.}"
bfn="${ffn%.*}"
hpl="${bfn: -3}"
rso=
rsf=
addhpl=
if [ "${hpl}" = "HPL" ]; then
rso="--resample"
rsf="44.1"
elif [[ "${extstr}" = "WAV" || "${extstr}" = "wav" ]]; then
rso="--resample"
rsf="44.1"
addhpl=" HPL"
fi
ofn="出力ディレクトリのフルパス/${bfn}${addhpl}.mp3"
コマンドのインストールディレクトリ/lame "${qo}" "${rso}" "${rsf}" "${f}" "${ofn}"
done
最近のコメント