directshow中获取码率

本文介绍了一种通过遍历DirectShow过滤器来获取视频流码率的方法,并提供了详细的C++代码实现。

什么都不说了,看代码吧。(说明一下,这样得到的码率比文件属性中的码率是要小一点的,因为文件属性里标的码率包括了视频和音频,而这样得到的码率只包括视频,可是我又不知道怎么把音频的码率也得到,小就小一点吧^_^)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值