Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1610994
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2011-09-17 16:41:05

VC/MFC 音频/视频Q:如何判断视频媒体文件的格式?

A:
directshow: IGraphBuilder::AddSourceFilter ( LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter **ppFilter)加入文件名得到文件pFilter指针,然后得到pFilter的输出pin,然后大概如下面函数判断类型:

typedef enum
{
TYPE_UNKNOWN,
TYPE_MPEG1,
TYPE_MPEG2,
TYPE_AVI,
......
}MEDIA_TYPE;
HRESULT GetMediaTypeByPin(IPin *pPin, MEDIA_TYPE* pemType)
{
HRESULT hr;
ULONG n;
AM_MEDIA_TYPE mt;
AM_MEDIA_TYPE *pmt = NULL;
CComPtr pEnumMt;


if(FAILED(hr=pPin->EnumMediaTypes(&pEnumMt)))
return hr;

BOOL bGot = FALSE;

pEnumMt->Reset();
while(! bGot && pEnumMt->Next(1, &pmt, &n)==S_OK)
{
if(pmt->majortype != GUID_NULL)
{
memcpy(&mt, pmt, sizeof(mt));
bGot = TRUE;
}
DeleteMediaType(pmt);
}

if(! bGot)
return E_FAIL;

// MPEG1
if(mt.majortype == MEDIATYPE_Stream &&
(mt.subtype == MEDIASUBTYPE_MPEG1System||mt.subtype==MEDIASUBTYPE_MPEG1Video || mt.subtype == MEDIASUBTYPE_MPEG1VideoCD )
)
{
*pemType = TYPE_MPEG1;
}
// MPEG2
else if(mt.majortype == MEDIATYPE_Stream &&
(mt.subtype == MEDIASUBTYPE_MPEG2_PROGRAM || mt.subtype==MEDIASUBTYPE_MPEG2_TRANSPORT)
)
{
*pemType = TYPE_MPEG2;
}

// AVI
else if(mt.majortype == MEDIATYPE_Stream &&
mt.subtype == MEDIASUBTYPE_Avi)
{
*pemType = TYPE_AVI;
}
...... // 加上其他判断类型

else
{
*pemType = TYPE_UNKNOWN;
}

return S_OK;
}
 
阅读(813) | 评论(0) | 转发(0) |
0

上一篇:音频会话

下一篇:Windows API函数大全

给主人留下些什么吧!~~