MFC学习之路之多媒体 --(1) DirectShow

本文详细介绍了DirectShow在Windows多媒体编程中的核心作用,并通过一段基础代码展示了如何利用DirectShow实现MP3文件的加载、播放、暂停、停止、等待完成以及音量控制等功能。代码简洁明了,易于理解,适合初学者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以说整个Windows的多媒体编程都是以DirectShow为基础,那好,来吧,我们直接看DirectShow的一段基础代码。

bool Mp3::Load(LPCWSTR szFile)
{
	Cleanup();
	ready = false;
	if (SUCCEEDED(CoCreateInstance( CLSID_FilterGraph,
		NULL,
		CLSCTX_INPROC_SERVER,
		IID_IGraphBuilder,
		(void **)&this->pigb)))//----------使用com口去获取directShow指针
	{
		pigb->QueryInterface(IID_IMediaControl, (void **)&pimc);//--------控制player开关暂停
		pigb->QueryInterface(IID_IMediaEventEx, (void **)&pimex);
		pigb->QueryInterface(IID_IBasicAudio, (void**)&piba);//--------控制player音量
		pigb->QueryInterface(IID_IMediaSeeking, (void**)&pims);//--------控制player位置

		HRESULT hr = pigb->RenderFile(szFile, NULL);
		if (SUCCEEDED(hr))
		{
			ready = true;
			if(pims)
			{
				pims->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
				pims->GetDuration(&duration); // returns 10,000,000 for a second.
				duration = duration;
			}
		}
	}
	return ready;
}

bool Mp3::Play()
{
	if (ready&&pimc)
	{
		HRESULT hr = pimc->Run();
		return SUCCEEDED(hr);
	}
	return false;
}

bool Mp3::Pause()
{
	if (ready&&pimc)
	{
		HRESULT hr = pimc->Pause();
		return SUCCEEDED(hr);
	}
	return false;
}

bool Mp3::Stop()
{
	if (ready&&pimc)
	{
		HRESULT hr = pimc->Stop();
		return SUCCEEDED(hr);
	}
	return false;
}

bool Mp3::WaitForCompletion(long msTimeout, long* EvCode)
{
	if (ready&&pimex)
	{
		HRESULT hr = pimex->WaitForCompletion(msTimeout, EvCode);
		return *EvCode > 0;
	}

	return false;
}

bool Mp3::SetVolume(long vol)
{
	if (ready&&piba)
	{
		HRESULT hr = piba->put_Volume(vol);
		return SUCCEEDED(hr);
	}
	return false;
}

long Mp3::GetVolume()
{
	if (ready&&piba)
	{
		long vol = -1;
		HRESULT hr = piba->get_Volume(&vol);

		if(SUCCEEDED(hr))
			return vol;
	}

	return -1;
}

__int64 Mp3::GetDuration()
{
	return duration;
}

__int64 Mp3::GetCurrentPosition()
{
	if (ready&&pims)
	{
		__int64 curpos = -1;
		HRESULT hr = pims->GetCurrentPosition(&curpos);

		if(SUCCEEDED(hr))
			return curpos;
	}

	return -1;
}

bool Mp3::SetPositions(__int64* pCurrent, __int64* pStop, bool bAbsolutePositioning)
{
	if (ready&&pims)
	{
		DWORD flags = 0;
		if(bAbsolutePositioning)
			flags = AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame;
		else
			flags = AM_SEEKING_RelativePositioning | AM_SEEKING_SeekToKeyFrame;

		HRESULT hr = pims->SetPositions(pCurrent, flags, pStop, flags);

		if(SUCCEEDED(hr))
			return true;
	}

	return false;
}

 看完你应该会知道它是用了播放MP3的。这是一个微软网站上下载的DEMO,原理真的很简单,也就几行代码,几乎不用看注释就知道每个函数干什么用的。

DEMO里面用了C#作为界面,你也可以体会一下c#/c++是如何配合开发的。

源码:Here

如果你在源码天空里面找到很漂亮很商业化的MP3播放器,也可以下载来学习。不过,本人对MP3播放器没什么兴趣。

转载于:https://www.cnblogs.com/Forest-zhu/archive/2011/12/13/2285847.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值