• VC++读取AVi视频文件


    头文件 #include <Vfw.h>

    成员变量:

    // for avi;
    PGETFRAME Frame;
    BITMAPFILEHEADER BMPFileHeader;
    PAVIFILE aviFile;
    PAVISTREAM aviStream;
    AVISTREAMINFO aviStreamInfo;
    int m_nFrameNumber;
    BITMAPINFO* m_pBitMapInfo;
    BYTE* pData;
    int cy;
    int cx;
    HANDLE handle;
    //

    读取代码:

        AVIFileInit();
        AVIFileOpen(&aviFile, "E:\\Alizee.avi", OF_READ, NULL);
        AVIFileGetStream(aviFile, &aviStream, streamtypeVIDEO, 0);
        AVIStreamInfo(aviStream, &aviStreamInfo, sizeof(aviStreamInfo));
    
        AVIFILEINFO fileInfo;
        AVIFileInfo(aviFile, &fileInfo, sizeof(AVIFILEINFO));
        cx = fileInfo.dwWidth;
        cy = fileInfo.dwHeight;
        AVIFileGetStream(aviFile, &aviStream, streamtypeVIDEO, 0);
        m_pBitMapInfo = new BITMAPINFO;
    
        m_pBitMapInfo->bmiHeader.biBitCount = 32;
        m_pBitMapInfo->bmiHeader.biClrImportant=0; 
        m_pBitMapInfo->bmiHeader.biClrUsed=0; 
        m_pBitMapInfo->bmiHeader.biCompression=0; 
        m_pBitMapInfo->bmiHeader.biHeight=cy; 
        m_pBitMapInfo->bmiHeader.biWidth=cx; 
        m_pBitMapInfo->bmiHeader.biPlanes=1; 
        m_pBitMapInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
        //m_pBitMapInfo->bmiHeader.biSizeImage = (cx * 24 + 31) / 32 * 4 * cy; //图像数据的大小;
        m_pBitMapInfo->bmiHeader.biSizeImage = 0;
        m_pBitMapInfo->bmiHeader.biXPelsPerMeter=0;
        m_pBitMapInfo->bmiHeader.biYPelsPerMeter=0; 
        handle=GlobalAlloc(GHND,((long)((cx*24+31)/32*4)*cy)); 
        pData=(BYTE*)GlobalLock(handle);
    
        BMPFileHeader.bfType = 0x4D42;
        BMPFileHeader.bfSize = (cx * 24 + 31) / 32 * 4 * cy + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //图像的总大小;
        BMPFileHeader.bfReserved1=0;
        BMPFileHeader.bfReserved2=0;
        BMPFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //24位真彩色位图恒为54;
    
        //////
        static CEngine* pEngine = ((CHKEditorApp*)AfxGetApp())->m_pEngine;
        assert(pEngine != NULL);
    
        m_nFrameNumber = 0;
    
           SetTimer(ID_AVI_TIMER, 1, 0);
        

    定时器里面:

        case ID_AVI_TIMER:
            {
                if (m_nFrameNumber == aviStreamInfo.dwLength)
                {
                    KillTimer(ID_AVI_TIMER);
                    return;
                }
     
                PGETFRAME   pg = AVIStreamGetFrameOpen(aviStream, &(m_pBitMapInfo-> bmiHeader)); 
                pData = (BYTE*)AVIStreamGetFrame(pg, m_nFrameNumber++); 
                
    //            CClientDC   dc(this); 
    //            CRect   rect; 
    //            GetClientRect(&rect); 
    //            StretchDIBits(HDC(dc),0,0,rect.right,rect.bottom,0,0,cx,cy,pData,(BITMAPINFO*)m_pBitMapInfo,DIB_RGB_COLORS,SRCCOPY); 
    
                Engine->m_pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
    
                memcpy(Engine->m_pixelBuffer->getCurrentLock().data, &BMPFileHeader, sizeof(BITMAPFILEHEADER));
                memcpy((BYTE*)Engine->m_pixelBuffer->getCurrentLock().data + sizeof(BITMAPFILEHEADER), m_pBitMapInfo,sizeof(BITMAPINFO));
                memcpy((BYTE*)Engine->m_pixelBuffer->getCurrentLock().data + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO), pData, cx*cy*3);
    
                //memcpy((BYTE*)Engine->m_pixelBuffer->getCurrentLock().data, pData,  cx * cy * 3/* + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO)*/);
    
                Engine->m_pixelBuffer->unlock();
    
                if (m_nFrameNumber == 5)
                {
                    CFile   myfile;
                    myfile.Open( "e:\\hkx.bmp",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
                    myfile.Write(&BMPFileHeader, sizeof(BITMAPFILEHEADER));
                    myfile.Write(m_pBitMapInfo,sizeof(BITMAPINFO));
                    myfile.Write(pData, cx * cy * 3);
                    myfile.Close();
                }
    
                AVIStreamGetFrameClose(pg);
    
                Engine->m_Root->renderOneFrame();
            }
            break;
  • 相关阅读:
    php stdClass转数组
    PHP 获取1970年前的时间戳,且为负
    springboot响应格式Resullt封装
    php使用elasticsearch
    day0620211207
    day0820211209
    day022021121
    day0520211206
    day0720211208
    day0320211202
  • 原文地址:https://www.cnblogs.com/kex1n/p/2701369.html
Copyright © 2020-2023  润新知