わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

DirectShowで音声を再生する

DirectShowで音声を再生するには、IMediaControlを取得して、メソッドのRenderFileを呼び出して、フィルタグラフを生成します。 フィルタグラフが生成できれば、IMediaControlのRunを呼び出せば音声を再生することができます。

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <string>
#include <windows.h>
#include <dshow.h>



// lib
#pragma comment( lib, "strmiids.lib" )



/*
	DirectShowで音声を再生する
*/
int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	// std::wcoutのロケールを設定
	std::wcout.imbue( std::locale( "", std::locale::ctype ) );

	// エラーコード
	HRESULT hResult = S_OK;

	// COMを初期化
	::CoInitialize( NULL );

	// 再生する音声ファイル
	std::wstring strFilePath = L".¥¥TestData¥¥Kalimba.mp3";

	// IGraphBuilder
	IGraphBuilder* pGraphBuilder = NULL;

	// IMediaControl
	IMediaControl *pMediaControl = NULL;

	// FilterGraphを生成
	hResult = ::CoCreateInstance(
			  CLSID_FilterGraph
			, NULL
			, CLSCTX_INPROC
			, IID_IGraphBuilder
			, (LPVOID *)&pGraphBuilder
		);
	if ( !SUCCEEDED( hResult ) ) {

		// エラー
		goto err;
	}

	// IMediaControlの取得
	hResult = pGraphBuilder->QueryInterface(
			  IID_IMediaControl
			, (void**)&pMediaControl
		);
	if ( !SUCCEEDED( hResult ) ) {

		// エラー
		goto err;
	}

	// FilterGraphの生成
	hResult = pMediaControl->RenderFile( (BSTR)strFilePath.c_str() );
	if ( !SUCCEEDED( hResult ) ) {

		// エラー
		goto err;
	}

	// 動画の再生
	hResult = pMediaControl->Run();
	if ( !SUCCEEDED( hResult ) ) {

		// エラー
		goto err;
	}

	// 音声再生待ち
	::MessageBox( NULL, L"音声を再生しています。¥r¥nOKを押すと終了します。", L"お知らせ", MB_OK );


err:
	// IMediaControlの破棄
	if ( NULL != pMediaControl ) {
		pMediaControl->Release();
	}

	// IGraphBuilderの破棄
	if ( NULL != pGraphBuilder ) {
		pGraphBuilder->Release();
	}

	// COMの終了
	::CoUninitialize();

	// 処理結果を返す
	return( 0 );
}



実行結果







わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。