一个MPG文件如何知道它是MPEG1还是MPEG2格式?

hardman 2006-07-12 03:21:55
RT
...全文
747 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
happydeer 2006-07-13
  • 打赏
  • 举报
回复
读取pack后面的那个字节的高四位,如果值为2则是mpeg1文件,如果值为4则是mpeg2文件,如下:

00 00 01 BA 21 .... -> mpeg1
00 00 01 BA 44 .... -> mpeg2
cococut 2006-07-13
  • 打赏
  • 举报
回复
陆老师实务精选的那本书上有个vodDemo的例子,有一个函数:
void CMediaInfo::CheckMpegFile(const char * inFile)
{
CoInitialize(NULL);

mFileType = FT_MPEG1; // Default
IGraphBuilder * pBuilder = NULL;
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pBuilder);
if (pBuilder)
{
// Create a file source filter
IBaseFilter * pSource = NULL;
WCHAR wcFilePath[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, inFile, -1, wcFilePath, MAX_PATH);
pBuilder->AddSourceFilter(wcFilePath, L"Source", &pSource);
pSource->Release();

// Create microsoft MPEG-1 Stream Splitter
IBaseFilter * pSplitter = NULL;
CoCreateInstance(CLSID_MPEG1Splitter , NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void **)&pSplitter);
pBuilder->AddFilter(pSplitter, L"MPEG-1 Splitter");
pSplitter->Release();

// Try to connect them...
IPin * pOut = GetPinByDirection(pSource, PINDIR_OUTPUT);
IPin * pIn = GetPinByDirection(pSplitter, PINDIR_INPUT);
HRESULT hr = pBuilder->ConnectDirect(pOut, pIn, NULL);
if (FAILED(hr))
{
mFileType = FT_MPEG2;
// Attention here! 1M data at the end of the file!
mCheckOffset2 = mFileSize - 1048576;
}

pBuilder->RemoveFilter(pSplitter);
pBuilder->RemoveFilter(pSource);
pBuilder->Release();
}

CoUninitialize();
}

2,554

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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