ラベル Media Player の投稿を表示しています。 すべての投稿を表示
ラベル Media Player の投稿を表示しています。 すべての投稿を表示

2013年6月24日月曜日

ファイルの属性を取得する:GetAttributeByIndexEx

GetAttributeByIndexEx を使用してAttributeの数を取得

参考:To Retrieve All Metadata in a File
IWMHeaderInfo3::GetAttributeByIndexEx method
ID3 Tag Support

#include <stdio.h>  //printf とかで必要
#include <wmsdk.h>  //HRESULT とかで必要

using namespace System;//Console::ReadLine()で必要

#pragma comment(lib, "wmvcore.lib")   //IWMMetadataEditor とかで必要

#ifndef GOTO_EXIT_IF_FAILED
#define GOTO_EXIT_IF_FAILED(hr) if(FAILED(hr)) goto Exit;
#endif

#ifndef SAFE_ARRAY_DELETE
#define SAFE_ARRAY_DELETE(x) \
 if(x != NULL) \
{ \
 delete[] x; \
 x = NULL; \
}
#endif

void main(){

 HRESULT hr          = S_OK;

 IWMMetadataEditor * pEditor = NULL;
 IWMHeaderInfo3 * pHeaderInfo = NULL;

 hr = WMCreateEditor(&pEditor);
 hr = pEditor->Open(L"G:\\sampleMovie\\Amanda.wma");
 hr = pEditor->QueryInterface(IID_IWMHeaderInfo, (void**) &pHeaderInfo);

 WORD    cAttributes = 0;
 WCHAR*  pwszName    = NULL;
 WORD    cchName     = 0;
 BYTE*   pbValue     = NULL;
 DWORD   cbValue     = 0;
 WORD    langIndex   = 0;
 WORD    attIndex    = 0;

 WMT_ATTR_DATATYPE attType;

 // Get the total number of attributes in the file.
 //ファイルの属性の総数を取得します。
 hr = pHeaderInfo->GetAttributeCountEx(0xFFFF, &cAttributes);
 GOTO_EXIT_IF_FAILED(hr);

 // Loop through all the attributes, retrieving and displaying each.
 //すべての属性をループし取得表示
 for(attIndex = 0; attIndex < cAttributes; attIndex++)
 {
  //printf("%d 回目\r\n ", attIndex);

  // Get the required buffer lengths for the name and value.
  //名前と値のために必要なバッファ長を取得します。

  hr = pHeaderInfo->GetAttributeByIndexEx(0xFFFF,
   attIndex,
   NULL,
   &cchName,
   NULL,
   NULL,
   NULL,
   &cbValue);

  GOTO_EXIT_IF_FAILED(hr);

  // Allocate the buffers.
  //バッファを割り当てる。属性名
  pwszName = new WCHAR[cchName];

  //WCHAR *pbValue = (WCHAR *) new BYTE[ cbValue ]; 
  //pwszName = (WCHAR *) new BYTE[ cchName ];
  if(pwszName == NULL)
  {
   printf("割り当て失敗\r\n");
   hr = E_OUTOFMEMORY;
   goto Exit;
  }

  ////属性の値
  pbValue = new BYTE[cbValue];
  if(pbValue == NULL)
  {
   printf("割り当て失敗\r\n");
   hr = E_OUTOFMEMORY;
   goto Exit;
  }

  ////属性を取得します。
  hr = pHeaderInfo->GetAttributeByIndexEx(0xFFFF,
   attIndex,
   pwszName,
   &cchName,
   &attType,
   &langIndex,
   pbValue,
   &cbValue);

  GOTO_EXIT_IF_FAILED(hr);

  // Display the attribute global index and name.
  //表示 属性のグローバルインデックスと名前
  printf("%3d - %S (Language %d):\n\t ", attIndex, pwszName, langIndex);

  // Display the attribute depending upon type.
  // 属性のタイプ別に表示
  switch(attType)
  {
  case WMT_TYPE_DWORD:
  case WMT_TYPE_QWORD:
  case WMT_TYPE_WORD:
   printf("%d\n\n", (DWORD) *pbValue);
   break;
  case WMT_TYPE_STRING:
   printf("%S\n\n", (WCHAR*) pbValue);
   break;
  case WMT_TYPE_BINARY:
   printf("<binary value>\n\n");
   break;
  case WMT_TYPE_BOOL:
   printf("%s\n\n", ((BOOL) *pbValue == TRUE) ? "True" : "False");
   break;
  case WMT_TYPE_GUID:
   printf("<GUID value>\n\n", (DWORD) *pbValue);
   break;
  }

  // Release allocated memory for the next pass.
  //次のために、割り当てられたメモリを解放
  SAFE_ARRAY_DELETE(pwszName);
  SAFE_ARRAY_DELETE(pbValue);
  cchName = 0;
  cbValue = 0;

 }// for ループ終了

Exit:
 SAFE_ARRAY_DELETE(pwszName);
 SAFE_ARRAY_DELETE(pbValue);
 Console::ReadLine();//入力待-ウインドウ維持
 return ;
}


2013年6月22日土曜日

ジャケット写真取得に挑戦:IWMHeaderInfo::GetAttributeByName


#include <stdio.h>//printf とかで必要
#include<windows.h>//MessageBox とかで必要

#include <wmsdk.h>
#pragma comment(lib, "wmvcore.lib")

#include "wmp.h"

void main(void)
{

 IWMMetadataEditor * pEditor = NULL;
 IWMHeaderInfo3 * pHeaderInfo = NULL;
 IWMPMedia3 * spCurrMedia3 = NULL;
 //IWMPMedia3* Media;
 //IWMHeaderInfo3

 HRESULT hr = S_FALSE;

 hr = WMCreateEditor(&pEditor);

 hr = pEditor->Open(L"G:\\sampleMovie\\sample.mp3");

 pEditor->QueryInterface(IID_IWMHeaderInfo, (void**) &pHeaderInfo);

 WM_PICTURE* pPicture = NULL;;
 WORD wStreamNum = 0;
 WORD wLength = 0;
 WMT_ATTR_DATATYPE wmtDataType = WMT_TYPE_BINARY;

 hr = pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMPicture, &wmtDataType, NULL, &wLength);
 if(SUCCEEDED(hr))
 {
  printf("成功\n");
 }

 pPicture = (WM_PICTURE*)new BYTE[wLength];

 hr = pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMPicture, &wmtDataType, (BYTE*)pPicture, &wLength);
 if(SUCCEEDED(hr))
 {
  printf("成功\n");
 }

 MessageBox(0,0,TEXT("OK"),0);
}


WM_PICTURE structure で調べたら
pwszMIMETypeは image/jpeg
bPictureType が3なので 、前面の写真のようです。

バイナリエディッタでファイルを開いてみた。

jpeg 形式で保存してみる。
// WMPConsoleApplication1.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"

#include <stdio.h>
#include <wmsdk.h>

#include "wmp.h"


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

using namespace System;
using namespace System::IO;
//using namespace System::IO::MemoryStream;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"プログラムスタート");

 IWMMetadataEditor * pEditor = NULL;
 IWMHeaderInfo3 * pHeaderInfo = NULL;
 IWMPMedia3 * spCurrMedia3 = NULL;

 HRESULT hr = S_FALSE;

 hr = WMCreateEditor(&pEditor);

 hr = pEditor->Open(L"G:\\sampleMovie\\Amanda.wma");

 hr = pEditor->QueryInterface(IID_IWMHeaderInfo, (void**) &pHeaderInfo);

 WM_PICTURE* pPicture = NULL;;
 WORD wStreamNum = 0;
 WORD wLength = 0;
 WMT_ATTR_DATATYPE wmtDataType = WMT_TYPE_BINARY;
 
 hr = pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMPicture, &wmtDataType, NULL, &wLength);
 if(SUCCEEDED(hr))
 {
  printf("成功\n");
 }

 pPicture = (WM_PICTURE*)new BYTE[wLength];

 hr = pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMPicture, &wmtDataType, (BYTE*)pPicture, &wLength);
 if(SUCCEEDED(hr))
 {
  printf("成功\n");
 }

 //画像の大きさ
 printf("画像の大きさ:%d \n",pPicture->dwDataLen);

 FILE *fp;        /* ファイル操作で使用する変数 */ 
 fp = fopen( "D:\\sample.jpg"  , "wb" );

 fwrite( pPicture->pbData , pPicture->dwDataLen , 1 , fp ); 

 fclose( fp );

 Console::WriteLine(L"プログラム終了");
 Console::ReadLine();

 return 0;
}

保存に成功しました。

mp3 wma の形式で確認しました。

画像データがないmp3,wmaでは当然画像は取得できません。

ファイルエクスプローラの詳細で画像データが在るか確認できます。

ヘッダー部の属性取得;GetAttributeByName

とりあえずメモ

#include <stdio.h>//printf とかで必要
#include<windows.h>//MessageBox とかで必要

#include <wmsdk.h>
#pragma comment(lib, "wmvcore.lib")

void main(void)
{

 IWMMetadataEditor * pEditor = NULL;
 IWMHeaderInfo * pHeaderInfo = NULL;

 HRESULT hr = S_FALSE;

 hr = WMCreateEditor(&pEditor);

 hr = pEditor->Open(L"G:\\sampleMovie\\sample.wmv");

 pEditor->QueryInterface(IID_IWMHeaderInfo, (void**) &pHeaderInfo);

 WMT_ATTR_DATATYPE attType;
 WORD streamNum = 1;
 WORD cbValue = 0;

 //文字列の適切なサイズを取得
 hr = pHeaderInfo->GetAttributeByName(&streamNum, 
  g_wszDeviceConformanceTemplate, &attType, NULL, &cbValue);

 WCHAR *pbValue = (WCHAR *) new BYTE[ cbValue ];   
 if( ! pbValue )   
 {   
  printf("割り当て失敗\n");
 }   

 hr = pHeaderInfo->GetAttributeByName(&streamNum, 
  g_wszDeviceConformanceTemplate, &attType, (BYTE *) pbValue, &cbValue);

 printf("%S\n",pbValue);//L1と出力

 MessageBox(0,0,TEXT("OK"),0);
}

コーデックプロパティーの取得:Window Media SDK

いまいち良く分からないがとりあえずメモ
#include <stdio.h>//printf とかで必要
#include<windows.h>//MessageBox とかで必要

#include <wmsdk.h>
#pragma comment(lib, "wmvcore.lib")

void main(void)
{
 HRESULT GetCodecNames(IWMCodecInfo3* pCodecInfo);

 IWMCodecInfo3* pCodecInfo = NULL;
 IWMProfileManager* pProfileManager = NULL;
 HRESULT hr = S_FALSE;

 hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

 hr = WMCreateProfileManager(&pProfileManager);

 hr = pProfileManager->QueryInterface(IID_IWMCodecInfo3, (void**)&pCodecInfo);

 WMT_ATTR_DATATYPE dataType;
 DWORD dwValue = 0;
 DWORD dSize = sizeof(DWORD);

 DWORD codecIndex =0;

 //コーデックプロパティーの取得
 hr = pCodecInfo->GetCodecProp(WMMEDIATYPE_Video, codecIndex, 
  g_wszComplexityMax, &dataType, (BYTE*) &dwValue, &dSize);
 
 printf("%d\n", dataType);
 printf("%d\n", dwValue);
 printf("%d\n", dSize);

 MessageBox(0,0,TEXT("OK"),0);
}



2013年6月19日水曜日

Media Player の設定値を取得:Settings



     //現在のメディア項目が自動的に再生を開始するかどうか player.settings.autoStart
     textBox1->AppendText("自動再生:" + axWindowsMediaPlayer1->settings->autoStart + "\r\n");

     //現在のステレオのバランス
     textBox1->AppendText("バランス:" + axWindowsMediaPlayer1->settings->balance + "\r\n");

     //相対パスの解釈に使われるベース URL
     textBox1->AppendText("ベース URL:" + axWindowsMediaPlayer1->settings->baseURL + "\r\n");

     //scriptCommand で受け取った URL を表示するために使われるフレームの名前
     textBox1->AppendText("フレームの名前:" + axWindowsMediaPlayer1->settings->defaultFrame + "\r\n");

     //エラー ダイアログが自動的に表示されるかどうか
     textBox1->AppendText("エラー ダイアログの表示:" + axWindowsMediaPlayer1->settings->enableErrorDialogs  + "\r\n");

     //URL イベントで Web ブラウザを起動するかどうか
     textBox1->AppendText("ブラウザの起動:" + axWindowsMediaPlayer1->settings->invokeURLs  + "\r\n");
    
     //オーディオがミュートに設定されるかどうか
     textBox1->AppendText("ミュート:" + axWindowsMediaPlayer1->settings->mute + "\r\n");

     //メディア項目が再生される回数
     textBox1->AppendText("再生される回数:" + axWindowsMediaPlayer1->settings->playCount + "\r\n");

     //現在の再生速度
     textBox1->AppendText("再生速度:" + axWindowsMediaPlayer1->settings->rate + "\r\n");

     //現在の再生速度
     textBox1->AppendText("音量:" + axWindowsMediaPlayer1->settings->volume + "\r\n");

     //ループ モードまたはシャッフル モードが
     textBox1->AppendText("ループ モード:" + axWindowsMediaPlayer1->settings->getMode("loop") + "\r\n");

     //指定した種類の情報が利用可能か、または指定した動作が実行可能か
     textBox1->AppendText("再生速度の変更:" + axWindowsMediaPlayer1->settings->isAvailable["Rate"] + "\r\n");