OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

VBからID3タグをいじる方法

  • 暇なときにでも
  • 質問No.154509
  • 閲覧数702
  • ありがとう数6
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 47% (9/19)

VBからID3タグをいじる方法を教えてください。
ワードパッドでひらいてもどこがタグだか分かりません
できればサンプル(ソースでも)お願いします
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

サンプル作ってみました。

ID3=MP3のタグ情報と勝手に思って作ってます。
やはり、MP3のファイル末尾の128バイトに情報が入っているようです。

そのタグの中身は
TAG [文字列 3BYTE "TAG"で固定] 
TRACK NAME トラック名 [文字列 30BYTE]
AIRTIST NAME アーティスト名 [文字列 30BYTE]
ALUBM NAME アルバム名 [文字列 30BYTE]
YEAR リリース年号 [文字列 4BYTE]
COMMENT コメント [文字列 30BYTE]  (ID3 Tag v1.1 では 28BYTE)
GENRE ジャンル番号 [数値 0~255]
です。

サンプルのソースはエラーチェックを入れてませんので、ジャンル番号に文字列や大きな数字を入れたらバグると思います。それと、直接そのファイルを操作するのではなく、タグを読み取り、新たなタグ情報をもったファイルを作成する仕組みになってます。擬似的に作成して、ファイルをコピーしたら、元のファイルを操作したように見えるので、そこら辺は適当に扱ってください。


サンプルに必要なもの
フォーム
コマンドボタン1と2
ラベル1~6
テキストボックス1~6




Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
  Destination As Any, _
  Source As Any, _
  ByVal Length As Long _
)

Private Const testFile1 As String = "C:\1.mp3" '元となるファイル
Private Const testFile2 As String = "C:\2.mp3" '作成されるファイル

Private Const AREA_TAG As Long = 128      'タグの領域は128バイト

Private lngFileSize   As Long   'ファイルサイズ
Private fileBuf()    As Byte   '読み込みバッファ

Private Sub Command1_Click()
  Dim lngFile   As Long   'ファイルナンバ
  Dim tagBuf()  As Byte   'タグ情報

  'ファイル操作の初期化
  Reset
  
  'ファイルサイズを取得
  lngFileSize = FileLen(testFile1)
  
  '読み込みバッファの領域確保
  ReDim fileBuf(lngFileSize - 1) As Byte
  
  'バッファを取得
  lngFile = FreeFile
  Open testFile1 For Binary As #lngFile
    Get #lngFile, , fileBuf
  Close #lngFile

  'タグエリアの領域確保
  ReDim tagBuf(AREA_TAG - 1) As Byte
  'バッファからタグ情報のみ取得
  Call copyAry(tagBuf(0), fileBuf(lngFileSize - AREA_TAG), AREA_TAG)

  With Me
    'TRACK NAME を取得(3バイト目から30バイト)
    .Text1.Text = getStringforUniByte(tagBuf, 4, 30)
    'AIRTIST NAME を取得(34バイト目から30バイト)
    .Text2.Text = getStringforUniByte(tagBuf, 34, 30)
    'ALUBM NAME を取得(64バイト目から30バイト)
    .Text3.Text = getStringforUniByte(tagBuf, 64, 30)
    'YEAR を取得(94バイト目から4バイト)
    .Text4.Text = getStringforUniByte(tagBuf, 94, 4)
    'COMMENT を取得(98バイト目から30バイト)
    .Text5.Text = getStringforUniByte(tagBuf, 98, 30)
    'GENRE を取得(128バイト目の値)
    .Text6.Text = tagBuf(128 - 1)
  End With

End Sub

Private Sub Command2_Click()
  Dim lngFile   As Long   'ファイルナンバ
  Dim tagBuf()  As Byte   'タグ情報
  Dim wkStr    As String  'ワークの文字列
  Dim setStr   As String  '実際に収納する文字列

  'ファイル操作の初期化
  Reset
  
  With Me
    'お決まりの部分です
    setStr = "TAG"
    
    'TRACK NAME を取得
    wkStr = fixStr_setNullChar(.Text1.Text, 30)
    setStr = setStr & wkStr
    
    'AIRTIST NAME を取得
    wkStr = fixStr_setNullChar(.Text2.Text, 30)
    setStr = setStr & wkStr
    
    'ALUBM NAME を取得
    wkStr = fixStr_setNullChar(.Text3.Text, 30)
    setStr = setStr & wkStr
    
    'YEAR を取得
    wkStr = fixStr_setNullChar(.Text4.Text, 4)
    setStr = setStr & wkStr
    
    'COMMENT を取得
    wkStr = fixStr_setNullChar(.Text5.Text, 30)
    setStr = setStr & wkStr
    
    'ここまでの文字列をFormUnicodeに変換
    setStr = StrConv(setStr, vbFromUnicode)
    'バッファにセット(この情報をセットすると、tagBufは127バイトの領域を持つ)
    tagBuf = setStr
    
    'GENRE を取得
    wkStr = .Text6.Text
    'GENRE の情報は末尾のバイト目にそのまま値をセット
    ReDim Preserve tagBuf(AREA_TAG - 1) As Byte
    tagBuf(AREA_TAG - 1) = wkStr
  End With
  
  'バッファにタグ情報をセット
  Call copyAry(fileBuf(lngFileSize - AREA_TAG), tagBuf(0), AREA_TAG)
  
  '新たなタグ情報をもったファイルを作成する
  lngFile = FreeFile
  Open testFile2 For Binary As #lngFile
    'バッファ取得
    Put #lngFile, , fileBuf
  Close #lngFile
End Sub

Private Sub Form_Load()
  With Me
    '各コントロールの初期化
    .Command1.Caption = "取得"
    .Command2.Caption = "更新"
    
    .Label1.Caption = "TRACK NAME"
    .Label2.Caption = "AIRTIST NAME"
    .Label3.Caption = "ALUBM NAME"
    .Label4.Caption = "YEAR"
    .Label5.Caption = "COMMENT"
    .Label6.Caption = "GENRE"
    
    .Text1.Text = ""
    .Text2.Text = ""
    .Text3.Text = ""
    .Text4.Text = ""
    .Text5.Text = ""
    .Text6.Text = ""
  
    '一応最長文字数を指定しておきますが、あくまで半角での文字数です。全角文字は無理です。
    .Text1.MaxLength = 30
    .Text2.MaxLength = 30
    .Text3.MaxLength = 30
    .Text4.MaxLength = 4
    .Text5.MaxLength = 30
    .Text6.MaxLength = 3  'ここは0~255です
  End With
End Sub

'配列の中身をエリアの分だけコピーする関数
Private Sub copyAry(inDest As Byte, inSrc As Byte, inArea As Long)
  Call CopyMemory(inDest, ByVal VarPtr(inSrc), ByVal LenB(inSrc) * inArea)
End Sub


'バイトで納められたUNICODE文字列を指定位置から、指定の長さを取得する関数
Private Function getStringforUniByte(inByte() As Byte, inStartPos As Long, inLength As Long) As String
  Dim wkBuf() As Byte   'ワークのバッファ
  Dim wkStr  As String  'ワークの文字列
  Dim lngFindNull As Long 'vbNullChar を見つけるときのワーク
  
  ReDim wkBuf(inLength - 1) As Byte
  
  '指定範囲の文字列を得る
  Call copyAry(wkBuf(0), inByte(inStartPos - 1), inLength)
  wkStr = StrConv(wkBuf, vbUnicode)
  
  '文字列にvbNullCharが含まれている時、それをはずす
  lngFindNull = InStr(1, wkStr, vbNullChar)
  If lngFindNull > 0 Then
     wkStr = Mid(wkStr, 1, lngFindNull - 1)
  End If
  
  '戻りの文字列セット
  getStringforUniByte = wkStr
End Function


'文字数をvbNullCharで調整して返す関数
Private Function fixStr_setNullChar(inStrings As String, inLength As Long) As String
  Dim wkStr  As String  'ワークの文字列
  
  '引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
  wkStr = inStrings & String(30, vbNullChar)
  
  'FromUnicodeに変換
  wkStr = StrConv(wkStr, vbFromUnicode)
  
  '左からinLength分の文字を取得
  wkStr = LeftB(wkStr, inLength)
  
  'Unicodeに変換して返す
  fixStr_setNullChar = StrConv(wkStr, vbUnicode)
End Function
お礼コメント
carubi

お礼率 47% (9/19)

こんな立派なサンプルを作っていただき,ありがとうございます。
之でID3をいじる部分は完成しました。
多分完成したら,ベクターに飾るので,よかったら,見にきてください(11月終わりごろだと思います)
MP3スタジオという名前です
投稿日時 - 2001-10-23 21:44:30
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル12

ベストアンサー率 65% (276/422)

ID3ってなんなの? 聞いたことないです。 それがわからない人が多いと思いますよ。 ID3の参考アドレスを教えてもらえたら、何とかわかるかも?
ID3ってなんなの?
聞いたことないです。

それがわからない人が多いと思いますよ。

ID3の参考アドレスを教えてもらえたら、何とかわかるかも?
  • 回答No.2
レベル12

ベストアンサー率 65% (276/422)

ID3タグっていうのはMPEGとかの情報ですか? もしそうなら、ファイル末尾の128バイトという情報がありました。 もうちょっと調査が必要です。 もう少し調べてみますが、ほかに詳しい人がいたらお願いします。
ID3タグっていうのはMPEGとかの情報ですか?

もしそうなら、ファイル末尾の128バイトという情報がありました。
もうちょっと調査が必要です。

もう少し調べてみますが、ほかに詳しい人がいたらお願いします。
  • 回答No.4
レベル12

ベストアンサー率 65% (276/422)

何度もすいません。自己レスです。。。   '引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶   wkStr = inStrings & String(30, vbNullChar) っていうのが最後の方にあるんですが、   '引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶   wkStr = i ...続きを読む
何度もすいません。自己レスです。。。

  '引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
  wkStr = inStrings & String(30, vbNullChar)

っていうのが最後の方にあるんですが、

  '引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
  wkStr = inStrings & String(inLength, vbNullChar)

に修正してください。
30→inLength です。
お礼コメント
carubi

お礼率 47% (9/19)

ありがとうございます。
これで今作っているMP3プレイヤーも少し完成に近づきました
投稿日時 - 2001-10-23 21:37:13
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ