2008年12月21日日曜日

LAMEをマルチスレッドで実行するプログラムを作ってみた

09.07.26 追記
Multi thread Media Encoder Frontend(マルチスレッド対応 マルチフロントエンド)をリリース。
マルチスレッド対応 lameフロントエンド (もどき)より、
高性能で安定性も高い…と思う。
GUIも付いたので、マウスだけでも操作できます。
http://mtmef.g.hachune.net/

ここより下の情報は古いです…(´・ω・`)スマソ



mp3エンコーダーとして物凄く有名なlame。
音質などの面ではかなり良いのだが、マルチスレッド化で音質が低下するなどの問題が発生したらしく、最近主流のPhenomx4やCore2Quadなどのマルチコア・マルチスレッドCPUには対応できておらず、エンコード速度の面でちょっと問題がある。

ということで、
lameのエンコードをマルチスレッド処理するプログラム
を、Rubyで作ってみた。
(大学のレポートとして、4日間の突貫工事で作成したのだったりする)

エンコード処理内でマルチスレッドにするわけではない(コマンドプロンプトを4つ開いて、同時に実行しているのと同じ)ので、音質の問題も発生しない。…ハズ。
(以前、こんな実験をして確認したので、多分問題無い。)

一応、WindowsでもLinux・Unix・MacOSXのどれでも、Rubyが動けば使用できる…と思う。
(Windowsでは少し問題が発生したので、一応別に作り直したが)

あまりに汚いのでコメントアウトしました…(´・ω・`)



ダウンロードはこちらから。

旧バージョンの管理が大変なので、全てMulti thread Media Encoder Frontendに纏めました。
http://mtmef.g.hachune.net/



※WindowsでのRubyバイナリのインストール&スクリプトの実行


※追記: One-Click Ruby Installer for Windowsの方がたぶん楽だが、書いてしまったので一応残す。
  • http://www.garbagecollect.jp/ruby/mswin32/ja/から安定版の最新版をダウンロード。
  • Windows用lameバイナリはこちらからhttp://www.rarewares.org/mp3-lame-bundle.php
  • 適当な解凍ツールを使用し解凍。
  • "bin""doc""lib""man""share"といったディレクトリが生成されるので、ディレクトリ階層を壊さないようにそのまま全て"C:\Program Files\Ruby"などのディレクトリに入れる。
      例:
    • C:\Program Files\Ruby\bin
    • C:\Program Files\Ruby\doc
    • C:\Program Files\Ruby\lib
    • C:\Program Files\Ruby\man
    • C:\Program Files\Ruby\share
    Program Files以外のディレクトリでも、階層構造が壊れていなければおk。
  • mtlamefconf.rbをコマンドプロンプトで実行すると、「このファイルを開けません」と出るので、「一覧からプログラムを選択する」を選択。
  • 「参照」をクリックし、先ほどインストールしたRubyディレクトリの中の、bin/ruby.exeを選択。「この種類のファイルを開くときは、選択したプログラムをいつも使う」のチェックボックスをONにし、OKする。


  • 再度mtlamefconf.rbをコマンドプロンプトで実行。環境を設定する。
  • mtlamef_win.rbを実行。
Windows用Rubyのインストールには、One-Click Ruby Installer for Windowsなんてものも存在するので、試してみると良いかもしれない。 …と書いてから試してみたら、ダブルクリックでスクリプトを起動出来たりと、地味にこっちの方が便利な気がしてきた…

※Linux・Unix・MacOSXでのRubyのインストール・スクリプトの実行

  • ソースコードかパッケージ管理を利用してRubyとlameをインストール。
  • mtlamef.rbのソースの1行目の
    #!/usr/bin/ruby
    を、自分でRubyをインストールしたディレクトリに設定しなおす。
  • 端末でmtlame*.rbを実行。

※既知の問題

  • 同じ名前のmp3ファイルが存在すると、問い合わせなしに上書きしてしまう
  • ".wav"以外の拡張子が付いていた場合、wavファイルでも処理することができない
    (".Wav"、".WAv"、".WAV"、".wAv"、".wAV"、".wav"、".wave"…など)
  • mp3ファイルの再エンコードが出来ない
  • 相対パスで指定することができない("~/mp3"など)
  • "lameが見つからない"、"ファイルのアクセス権が無い"などのエラーが発生した場合でも、
    最後に「エンコードが完了しました」と出てしまう。
ソースに意味不明な#コメントが付いていたり、無駄が大量にするが、 見ないふりしてほしいんだ…(´;ω;`)ウッ…


そのうちCorei7向けに8スレッドまで立てられるのも作ろうかと画策中(30分もかからずに出来そう…だが)
この要領で、他のAACやogg、flacとかのエンコーダやデコーダに対応したのも簡単に作れそうだな… …時間が足りないな('A`)

このプログラムを作成する上で、はつねさんの声を一体何回エンコードしたのだろうか…
そして1週間ほどニコニコ放置してたら新曲増えまくりで涙目w …(´;ω;`)ブワッ

0 件のコメント: