メモ帳DPA

ぐぐってあまり引っかからないような何かがあったら書いたりする

大量のBMS(48GB,ファイル数60万くらい)のwavをoggへ一括変換した

BMSが増えすぎてさすがに邪魔になってきた

BMS保存ディレクトリのプロパティより

サイズ: 46.6 GB (50,107,123,488 バイト)
ディスク上のサイズ: 48.0 GB (51,612,114,944 バイト)
内容: ファイル数: 603,976、フォルダ数: 2,239

一応取捨選択して保存してはいるもののいつの間にかこんな量に。
ごっそり消せればいいんだけれども、もうコレクション的な物になりつつあるので、今更惜しくてそれも出来ないのです

じゃあ変換しよう

OGGを扱うのにもう十分なスペックになったし、まとめてOGGへ移行しようと前々から思ってはいたものの、ファイル数があまりに多すぎて、対象指定中もしくはエンコード途中で変換ソフトが止まるという問題が発生。
数本試したんだけどどれも無駄でした

仕方ないので全部oggencに直接渡すことに。
以下に超適当ソース。perl

$finddir='D:/Games/bmsdatas/original/';
$oggencpath='D:/datas/programs/pl/bms/oggenc2.exe';
#--------------------------------

use File::Find;
$total=0;	#総処理数
$failed=0;	#総失敗数

find(sub{
	my $curpath = $File::Find::name;	#処理ファイル名
	return unless($curpath =~ /\.wav$/);	#指定拡張子以外無視

	if( system("$oggencpath -q4 \"$curpath\"") ){	#変換
		$failed++;
	}else{
		$total++;
		unlink "$curpath";	#削除
	}
}, "$finddir");

print "$total files converted.\n";
print "failed : $failed\n" if $failed;
<STDIN>;

結果

大雑把に処理対象のディレクトリを二つに分けて、Core2E6300(1.86G*2)でそれぞれ同時に実行。
二つに分けたのは、一つで全部やると片方のCPUが働かないから。

所要時間 16時間くらい
処理ファイル数 409915
失敗ファイル数 26
サイズ 23.7 GB (25,493,153,106 バイト)
ディスク上のサイズ 25.0 GB (26,940,035,072 バイト)

約24.5GB(48%)減少となかなかの結果に。
失敗したファイルは、oggencサポート外のwavフォーマットなためらしい

画像について

png2bmp http://hp.vector.co.jp/authors/VA010446/
あたりに渡せばbmp->pngへ変換は出来ます。
が、LRではwavが無い場合のmp3やらoggの検索はやるようだけど、bmp->pngは検索しないようなので様子見。

もうちょっとファイルまとめられないものか

この異常なまでのファイル数は無駄な気がする。
かといって1曲まるごと1ファイルにまとめてしまうと、差分追加するときや同ディレクトリにスコア保存する場合に扱いづらそうだから、

/dir
bme(bms/bml)ファイル*n個
├音声の無圧縮zip
├画像の無圧縮zip
└ドキュメント

くらいシンプルにならないだろうか。LRあたりが実装してくれないかなぁ