视频截图一无编解码截图

       在directshow中,如果视频没有涉及到编码解码,那么实现即使抓图就比较容易了,最简单的方法就是使用Filter Graph Manager 上的IBasicVideo接口,调用这个接口的GetCurrentImage函数就可以将当前帧抓下来。


BOOL CDXGraph::GetCurrentImage(const char * inFile)
{
    //mBasicVideo为Filter Graph Manager上获得IBasicVide接口对象指针
    if (!mBasicVideo)
    {
        return FALSE;
    }

    long bitmapSize = 0;
    if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, 0)))
    {
        BOOL pass = FALSE;
        BYTE * buffer = new BYTE[bitmapSize];
        if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)))
        {
            BITMAPFILEHEADER	hdr;
            LPBITMAPINFOHEADER	lpbi;

            lpbi = (LPBITMAPINFOHEADER)buffer;
            int nColors = 1 << lpbi->biBitCount;
            if (nColors > 256)
                nColors = 0;
            int nColors=0;
            if(lpbi->biBitCount<=8)
            {
                nColors=1<<lpbi->biBitCount;
            }
            hdr.bfType		= ((WORD) ('M' << 8) | 'B'); // always is "BM"
            hdr.bfSize		= bitmapSize + sizeof( hdr );
            hdr.bfReserved1 = 0;
            hdr.bfReserved2 = 0;
            hdr.bfOffBits	 = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
                nColors * sizeof(RGBQUAD));
            CFile bmpFile(inFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
            bmpFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
            bmpFile.Write(buffer, bitmapSize);
            bmpFile.Close();
            pass = TRUE;
        }
        delete [] buffer;
        return pass;
    }
    return TRUE;
}



          然而GetCurrentImage并不稳定(如果使用VMR则没有问题),所以最好还是自己写一个Treansform Filter,接入到采集设备后面的链路中,则Filter Graph中流过每一个Sample都会经过此filter.我们只需要在Filter上自定义一个接口,用于将当前的Sample数据拷贝出来,也就实现了即时抓图。(自己写的filter可以在这儿下载,抓图filter)

        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值