OpenCV讀取MP4,mpeg, wmv, flv, mov, 3gp etc. on Win32

來源:互聯網
上載者:User

來源:http://wsyjwps1983.blog.163.com/blog/static/6800900120123181500785/  
fily的日誌 - 網易部落格

2012-04-18 13:50:00|  分類: 映像與視頻編解碼|字型大小 訂閱

2011-09-25 14:41:56|  分類: 模式識別 |  標籤:

1、方法1

CFileDialog dlg(TRUE, _T("*.mp4"), NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,_T("video files (*.avi) |*.avi|All Files (*.*)|*.*||"),NULL);

CString path ;

dlg.m_ofn.lpstrTitle= _T("OpenVedio");

if (dlg.DoModal() == IDOK) {

path = dlg.GetPathName(); 
}else
return;
IplImage* m_pFrame = NULL; // Declare IPL/OpenCV image pointer

HRESULT hr;
// 定義IMediaDet介面執行個體
CComPtr< IMediaDet > pDet;

hr = pDet.CoCreateInstance(__uuidof(MediaDet));
if (FAILED(hr))
return;

// 將影片檔案名稱轉換成BSTR類型
CComBSTR openBSTR(path);
// 設定IMediaDet介面的檔案關聯
hr = pDet->put_Filename(openBSTR);
if (FAILED(hr))
return ;

// 從影片中檢索視頻流和音頻流
long lStreams;
hr = pDet->get_OutputStreams(&lStreams);
if (FAILED(hr))
return ;

// 取出影片的視頻流,因為幀的資訊是儲存在視頻流中的
bool bFound = false;
for (int i=0; i<lStreams; i++)
{
GUID major_type;
hr = pDet->put_CurrentStream(i);
if (SUCCEEDED(hr))
hr = pDet->get_StreamType(&major_type);
if (FAILED(hr))
break;
if (major_type == MEDIATYPE_Video)
{
bFound = true;
break;
}
}
if (!bFound)
return ;

long width = 0, height = 0; // 儲存位元影像的寬和高(單位:象素)
AM_MEDIA_TYPE mt;
hr = pDet->get_StreamMediaType(&mt);
if (SUCCEEDED(hr))
{
if ((mt.formattype == FORMAT_VideoInfo) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER)))
{
// 得到VIDEOINFOHEADER結構指標,VIDEOINFOHEADER結構包含一些與視頻
// 有關的資訊,其中含有BITMAPINFORHEADER結構
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat);
width = pVih->bmiHeader.biWidth;
height = pVih->bmiHeader.biHeight;
if(height < 0 ) height *= -1;
}
else
hr = VFW_E_INVALIDMEDIATYPE;
if(mt.cbFormat != 0)
{
CoTaskMemFree((PVOID)mt.pbFormat); 
mt.cbFormat = 0;
}

if (mt.pUnk != NULL)
{
mt.pUnk->Release();
mt.pUnk = NULL;
}

}
if (FAILED(hr))
return ;

long size;
double time = 0.0;
double totaltime;

double rate ;

// 擷取整個視頻的時間長度
pDet->get_StreamLength(&totaltime);
//每秒多少幀
pDet->get_FrameRate(&rate);

cvNamedWindow( "result", 1 );

//totaltime = totaltime*rate;
m_pFrame = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
//每秒讀一幀
for(time=0.0; time <totaltime; time+= 1.0) 
{
/*
hr = pDet->EnterBitmapGrabMode(time); 
if(FAILED(hr)) 

printf( "Failed in EnterBitmapGrabMode! hr=0x%x\r\n", hr ); 
return ; 

CComPtr < ISampleGrabber > pGrabber = NULL;
hr = pDet->GetSampleGrabber(&pGrabber);

pGrabber->GetCurrentBuffer(&size, NULL);
long m_nBufferSize = size;
pGrabber->GetCurrentBuffer(&m_nBufferSize, (long*)m_pFrame->imageData);
*/
///*
hr = pDet->GetBitmapBits(time, &size, 0, width, height);

if (FAILED(hr))
return ;

char *pBuffer = new char[size];
if (!pBuffer)
return ;
hr = pDet->GetBitmapBits(time, 0, pBuffer, width, height);
if (FAILED(hr))
return ;

m_pFrame->imageData = pBuffer + sizeof(BITMAPINFOHEADER);
//*/
cvFlip(m_pFrame);
//detect_and_draw(m_pFrame);
cvShowImage( "result", m_pFrame );
cvWaitKey( 10 );
delete[] pBuffer;
//AfxMessageBox("t");

}
cvReleaseImage(&m_pFrame);
cvDestroyWindow("result");

2 方法:#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "ffopencv.h"

int main(int argc, char* argv[])
{
    
    IplImage *frame=NULL;
   
   CvCapture* capture; 
   capture=cvCaptureFromFile_FFMPEG("lake.mpg");//D:\\Downloads\\Guns and roses\\Guns N'Roses-Welcome To The Jungle.mpg");
//   capture=cvCreateFileCapture("lake.mpg");
//   CvSize imgSize;

   cvNamedWindow("videoS",CV_WINDOW_AUTOSIZE);  
   //   cvResizeWindow("video1",110,1000);
   cvMoveWindow( "videoS", 10, 50 );  //原始映像視窗定位

   frame=cvQueryFrame(capture);   
   int numTotal=100000;
    for(int num=1;num<numTotal;num++)
   {
   

         frame=cvQueryFrame(capture);   
      cvShowImage("videoS", frame); 
      cvWaitKey(100);
   }

   return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.