什么都不说了,看代码吧。(说明一下,这样得到的码率比文件属性中的码率是要小一点的,因为文件属性里标的码率包括了视频和音频,而这样得到的码率只包括视频,可是我又不知道怎么把音频的码率也得到,小就小一点吧^_^)
BOOL CDxGraph::GetBitRate(long *outBitRate)
...{
if (NULL != outBitRate)
*outBitRate = 0;
if (NULL == m_pGraph)
return FALSE;
long lbitRate = 0;
IEnumFilters* pEF = NULL;
if (SUCCEEDED(m_pGraph->EnumFilters(&pEF)))
...{
IBaseFilter* pBF = NULL;
while(S_OK == pEF->Next(1, &pBF, 0))
...{
IEnumPins* pEnumPins = NULL;
IPin * pPin = NULL;
if (SUCCEEDED(pBF->EnumPins(&pEnumPins)))
...{
while(S_OK == pEnumPins->Next(1, &pPin, 0))
...{
PIN_DIRECTION pinDirThis;
if (FAILED(pPin->QueryDirection(&pinDirThis)))
...{
pPin->Release();
continue;
}
if (PINDIR_OUTPUT == pinDirThis)
...{
pPin->Release();
break;
}
AM_MEDIA_TYPE mt;
if (FAILED(pPin->ConnectionMediaType(&mt)))
...{
pPin->Release();
continue;
}
if(mt.majortype == MEDIATYPE_Video)
...{
if(mt.formattype == FORMAT_VideoInfo || mt.formattype == FORMAT_MPEGVideo)
...{
VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)mt.pbFormat;
if(vih->dwBitRate)
...{
if (lbitRate < vih->dwBitRate/1000)
lbitRate = vih->dwBitRate/1000;
}
}
else if(mt.formattype == FORMAT_VideoInfo2)
...{
VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)mt.pbFormat;
if(vih->dwBitRate)
...{
if (lbitRate < vih->dwBitRate/1000)
lbitRate = vih->dwBitRate/1000;
}
}
}
pPin->Release();
}
pEnumPins->Release();
}
pBF->Release();
}
pEF->Release();
}
if (NULL != outBitRate)
*outBitRate = lbitRate;
return TRUE;
}
本文介绍了一种通过遍历DirectShow过滤器来获取视频流码率的方法,并提供了详细的C++代码实现。
752

被折叠的 条评论
为什么被折叠?



