关于如何从文件内容识别多媒体文件类型?

liyi_cumtb 2002-03-27 10:34:57
对一个给定的文件,不从其后缀名(如AVI MPG DAT等)去判断它是何种多媒体文件,因为后缀是很容易被修改的。
我想请教的是,如何从文件内容本身去判断文件类型,也就是说对诸如AVI MPG 等的多媒体文件,其文件有什么特征?如何读取?
...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
DivXExtend 2002-03-29
  • 打赏
  • 举报
回复

//我写的函数,输入文件路径名。DirectShow
//输入的是文件路径名,后缀即使被改掉,它也认识流的类型。
bool RenderStream::JudgeMediatype(char *strFileName, CMediaType *mtiOutput)
{
HRESULT hr;

//初始化COM库
LPVOID pvReserved = NULL;
::CoInitialize(pvReserved);
CoInitialize(NULL);

//创建过滤器图
REFCLSID rclsid = CLSID_FilterGraph;
LPUNKNOWN pUnkOuter = NULL;
DWORD dwClsContext = CLSCTX_INPROC_SERVER;
REFIID riid = IID_IGraphBuilder;
IGraphBuilder *pGraph;
CoCreateInstance(rclsid, pUnkOuter, dwClsContext,
riid, (void **)&pGraph);

//字类型转化
USES_CONVERSION;
LPCWSTR lpcwstrFileName;
lpcwstrFileName = A2W(strFileName);

//增加源过滤器
LPCWSTR lpwstrFilterName = L"Source";
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(lpcwstrFileName, lpwstrFilterName,
&pFileSource);
if (FAILED(hr))
{
OutputDebugString("增加源过滤器出错!");
return 1;
};

//查询得到文件源过滤器接口
REFIID iid = IID_IFileSourceFilter;
IFileSourceFilter *pFileSourceFilter = NULL;
hr = pFileSource->QueryInterface(iid, (void **)&pFileSourceFilter);
if (hr != S_OK)
{
OutputDebugString("查询文件源过器出错\n");
return 1;
}

//得到媒体类型
LPOLESTR FileName;
AM_MEDIA_TYPE mti;
hr = pFileSourceFilter->GetCurFile(&FileName, &mti);
if (hr != S_OK)
{
OutputDebugString("取媒体流类型出错!\n");
return 1;
}

//释放接口
pFileSource->Release();
pFileSourceFilter->Release();
pGraph->Release();
CoUninitialize();

if (mti.majortype != MEDIATYPE_Stream)
{
return false;
}
else
{
mtiOutput->majortype = MEDIATYPE_Stream;
}

//mpeg1
if (mti.subtype == MEDIASUBTYPE_MPEG1System)
{
mtiOutput->subtype = MEDIASUBTYPE_MPEG1System;
return true;
}
//mpeg1
else if (mti.subtype == MEDIASUBTYPE_MPEG1VideoCD)
{
mtiOutput->subtype = MEDIASUBTYPE_MPEG1VideoCD;
return true;
}
//mpeg1
else if (mti.subtype == MEDIASUBTYPE_MPEG1Video)
{
mtiOutput->subtype = MEDIASUBTYPE_MPEG1Video;
return true;
}
//mpeg1
else if (mti.subtype == MEDIASUBTYPE_MPEG1Audio)
{
mtiOutput->subtype = MEDIASUBTYPE_MPEG1Audio;
return true;
}
//mpeg4
else if (mti.subtype == MEDIASUBTYPE_Avi)
{
mtiOutput->subtype = MEDIASUBTYPE_Avi;
return true;
}
//mpeg2
else if (mti.subtype == MEDIASUBTYPE_MPEG2_PROGRAM)
{
mtiOutput->subtype = MEDIASUBTYPE_MPEG2_PROGRAM;
return true;
}
//mpeg2
else if (mti.subtype == MEDIASUBTYPE_MPEG2_TRANSPORT)
{
mtiOutput->subtype = MEDIASUBTYPE_MPEG2_TRANSPORT;
return true;
}
else
{
return false;
}
return false;
}
DivXExtend 2002-03-29
  • 打赏
  • 举报
回复
30 分给我吧。
huqiming 2002-03-28
  • 打赏
  • 举报
回复
每个文件都有一个特征,即文件信息头。读取文件信息头到内存中再判断就可以了。
相关的特征字节自己多看几个就知道了。

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧