MP3やWMAのタグをAPIで取得する方法(Windows Media SDK)

最近、プログラミングの記事が無いよねと貴方がいったから、10月29日はプログラミング記念日。
今日は、音楽フォーマットを知らなくても出来る!音楽ファイルのタグ情報の取得方法を紹介します。WMAとMP3で同じ関数が使える代わりに、ID3v2.3タグのこの項目!という指定は出来ません。


利用するのはWindow Media SDKです。
要はメディアプレーヤで取得できる情報をAPIで取得します。何の関数使うの?って事が分かれば簡単、ズバリWMCreateEditorです。
後はMSDNのマニュアルを見た方が早いですが、一応コードを。曲名の取得に“Title”という文字列を利用していますが、ヘルプやヘッダを読めば、他にも取得できる項目がある事が分かります。下のコードに少し埋めておきます。

#include <wmsdk.h>
#include <objbase.h>
#include <comdef.h>
#include <comip.h>
#include <strsafe.h>

#pragma comment(lib, "wmvcore.lib")

_COM_SMARTPTR_TYPEDEF(IWMMetadataEditor, __uuidof(IWMMetadataEditor));
_COM_SMARTPTR_TYPEDEF(IWMMetadataEditor2, __uuidof(IWMMetadataEditor2));
_COM_SMARTPTR_TYPEDEF(IWMReader, __uuidof(IWMReader));
_COM_SMARTPTR_TYPEDEF(IWMHeaderInfo, __uuidof(IWMHeaderInfo));

static const DWORD g_dwWMContentAttributes = 5;
static const WCHAR g_wszWMTitle[] =L"Title";
static const WCHAR g_wszWMAuthor[] =L"Author";
static const WCHAR g_wszWMDescription[] =L"Description";
static const WCHAR g_wszWMRating[] =L"Rating";
static const WCHAR g_wszWMCopyright[] =L"Copyright";

void GetMusicTag(LPCWSTR lpwzFileName)
{
 IWMMetadataEditorPtr pEditor;
 if(SUCCEEDED(WMCreateEditor(&pEditor)))
 {
  IWMMetadataEditor2Ptr pEditor2 = pEditor;
  if(pEditor2)
  {
   if(SUCCEEDED(pEditor2->OpenEx(lpwzFileName, GENERIC_READ, FILE_SHARE_READ)))
   {
    IWMHeaderInfoPtr pHeaderInfo = pEditor2;
    if(pHeaderInfo)
    {
     WORD wStreamNum = 0;
     WMT_ATTR_DATATYPE attrType;
     BYTE  pbValue[1024];
     WORD  cbValue = 1024;
     if(SUCCEEDED(pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMTitle, &attrType, pbValue, &cbValue)))
     {
      _ASSERT(attrType == WMT_TYPE_STRING);
      
      basic_string<WHCAR> strTitle; // For Test
      strTitle.assign(reinterpret_cast<WCHAR*>(pbValue), cbValue);
     }
     pEditor->Close();
    }
   }
  }
 }
}

尚、このサンプルを実行しても何も表示されません。デバッカなどでstrTitleの変数に曲名が入ってる事を確認してください。

Leave a Reply

最初のコメントを頂けますか?

更新通知を受け取る »
avatar
wpDiscuz