Rubyでmp3のid3v2tagの書き換えを行いたいです。どうするのがいいでしょう。ちなみに、Rubyのバージョンはruby 1.8.1 (2003-12-25) [i386-mswin32]です。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:k_ahiru No.1

回答回数23ベストアンサー獲得回数0

ポイント20pt

http://rubyforge.org/projects/mp3taglib/

RubyForge: mp3taglib: Project Info

http://ruby-mp3info.rubyforge.org/

ruby-mp3info-0.6.13 Documentation

id:TG-IF

既に二つともチェックしてました。

前者はコンパイルできませんでした。

フリーのbcc32しかコンパイラがないのですが、コンパイルできますか?

後者はid3v2tagは読めますが、書けません。

2004/01/30 01:59:48
id:mi-si No.2

回答回数207ベストアンサー獲得回数0

ポイント30pt

id3v2tagは、mp3infpのヘッダが編集可能なライブラリが既にありますので、Win32+Rubyにこだわるには何かしら理由があると思うのですが、タグの仕様書を見ながら、ヘッダ解析プログラムを作るのが良いかと思うのですけども。

http://win32lab.com/fsw/mp3infp/

Win32工作小屋 - mp3infp

Windows上での限定利用であれば前述のmp3infpのLibrary(Win32API)が利用出来ます。

id:TG-IF

mp3infpからAPI呼んで処理させてみたのですが、あんまりうまく動いてくれませんでした。

require ’Win32API’

class Mp3infp

def Mp3infp.Load(hWnd, szFileName)

win = Win32API.new(”mp3infp”, ”mp3infp_Load”, ’lp’, ’i’)

win.call(hWnd, szFileName)

end

def Mp3infp.GetValue(szValueName, buf)

win = Win32API.new(”mp3infp”, ”mp3infp_GetValue”, ’pp’, ’i’)

win.call(szValueName, buf)

end

end

p Mp3infp.Load(0, ’E:¥a.mp3’) # => 0

p buf = [nil].pack(’p’) # => ”¥000¥000¥000¥000”

p Mp3infp.GetValue(’TIME’, buf) # => 1

p buf # => ”h¥244¥020¥003”

多分読込には成功していると思うのですが

bufがchar**型で実体に戻せなくてちょっと困ってしまってます。

コマンドラインでid3tagv2を書き換えられるツールがあれば、

``でコマンドを実行させるって言う方法でもいいのですけど。

何かよい方法があれば引き続きお願いします。

2004/01/30 20:29:47
  • id:tsyk
    Rubyのpack/unpackは…

    半年以上も前の質問にコメントを書いても、もう質問者さんは見ていないでしょうけど、ググってココに辿り着いた私の問題解決にヒントを与えてくれたので、感謝を込めてアドバイスを置いておきます。

    「unpack(”p”), unpack(”P”) は、pack の結果からしか unpack できません。」という制約があります。(自分でpackしたものしかunpackできない)

    このAPI(mp3infp_GetValue)の場合はRuby側で確保したバッファをpackして渡したポインタではなく、DLL側で確保されたバッファへのポインタが返ってくるので、それを文字列に戻すときにunpackは使えないのです。

    したがって、「char**型を実体に戻す」には、以下のようにRuby側に用意した別のバッファに自分でコピーして取り出すしかないようです。

    lstrlen = Win32API.new(’kernel32’, ’lstrlen’, ’P’, ’L’)
    lstrcpyn = Win32API.new(’kernel32’, ’lstrcpyn’, ’PPL’, ’P’)

    p buf # => ”h¥244¥020¥003”
    pstr = buf.unpack(’L’)[0] #=> 51422312
    len = lstrlen.call(pstr) #=> 14
    time = ’ ’ * (len+1)
    lstrcpyn.call(time, pstr, len+1)
    time.chop!
    p time #=> ”4:37 (277sec)”

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません