Re: [問題] 請問要用BCB寫視訊程式
※ 引述《neway.bbs@bbs.ncku.edu.tw (南無阿彌陀佛)》之銘言:
: ※ 引述《BlackLight.bbs@ptt.cc (又是一場惡夢)》之銘言:
: : 請問一下
: : 如果要用BCB寫視訊程式
: : 比如說開啟AVI檔..並對其中的每張frame可以做即時處理
: : 想學這個要從哪裡著手入門好呢?
: : 有什麼參考書籍有教學嗎?
: : 希望能給我指點一下 謝謝囉
: : ps 目前的我的程度只會用BCB讀取image作處理
: 有一本書 是Delphi 寫視迅的
: 您可以參考一下
那妳只要想辦法從AVI讀一張指定的frame出來處理就可以。
example:
//需要include vfw.h
PAVISTREAM gapavi;
AVISTREAMINFO avis;
// 取出 Video Stream
GetVideoStream("vg01.avi",&gapavi,&avis);
// 秀出指定的frame
Frame2TImage(&gapavi,&avis,這裡填時間,Image14);
這樣就可以在Image14上看到那張圖片了....
bool TForm1::Frame2TImage (PAVISTREAM *gapavi,AVISTREAMINFO *avis,
long miniSecond,TImage *Image1)
{
PGETFRAME gapgf;
//對指定的 gapavi video stream 進行解壓縮,傳回 GetFrame物件放在gapgf中
if (avis->fccType == streamtypeVIDEO) {
gapgf = AVIStreamGetFrameOpen(*gapavi, NULL);
if (gapgf == NULL)
return false;
}
// 對指定的時間計算相對應的frame
LONG lFrame;
lFrame = AVIStreamTimeToSample(*gapavi, miniSecond);
// Get a video frame
BYTE abFormat[1024];
LPBITMAPINFOHEADER lpbi; //the frame data
lpbi = (LPBITMAPINFOHEADER)abFormat;
// 傳回 Video frame的位址放在 lpbi
lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(gapgf,lFrame );
// Paint
HBITMAP hBitmap;
hBitmap=CreateDIBitmap( GetDC(NULL),lpbi,CBM_INIT,(BYTE *)lpbi+40,
(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
HBITMAP2TImage(hBitmap,Image1);
return true;
}
bool TForm1::GetVideoStream(char *szFile,PAVISTREAM *gapavi,
AVISTREAMINFO *avis)
{
//Initial the AVI library
AVIFileInit();
HRESULT hr;
PAVIFILE pfile;
// 讀取avi檔案
hr = AVIFileOpen(&pfile,szFile , 0, 0L);
if (hr != 0)
{
return false;
}
//Getting an AVI stream
int gcpavi;
AVIFileGetStream(pfile, gapavi, 0L, 0);
// Get the stream information
AVICOMPRESSOPTIONS gaAVIOptions;
LPAVICOMPRESSOPTIONS galpAVIOptions;
// Stream header的資訊放在 avis中
AVIStreamInfo(*gapavi, avis, sizeof(*avis));
galpAVIOptions = &gaAVIOptions;
// 把 gaAVIOptions的內容清為0
_fmemset(galpAVIOptions, 0,
sizeof(AVICOMPRESSOPTIONS));
// 取出該 stream 的多媒體型態放在相對應
// 的gaAVIOptions陣列中
galpAVIOptions->fccType = avis->fccType;
switch(avis->fccType) {
case streamtypeVIDEO:
galpAVIOptions->dwFlags =
AVICOMPRESSF_VALID |
AVICOMPRESSF_KEYFRAMES |
AVICOMPRESSF_DATARATE;
galpAVIOptions->fccHandler = 0;
galpAVIOptions->dwQuality =
(DWORD)ICQUALITY_DEFAULT;
galpAVIOptions->dwKeyFrameEvery =
(DWORD)-1; // Default
galpAVIOptions->dwBytesPerSecond = 0;
galpAVIOptions->dwInterleaveEvery = 1;
break;
default:
break;
}
return true;
}
Ps.上面的程式碼當初是剪人家的...沒有留下來源!對不起原作者了>"<...
不過,想要即時是有點困難的.....一秒鐘能夠處理幾張叫即時?
^^"....
--
http://www.wretch.cc/album/show.php?i=genovia&b=25&f=1808827553&p=0
一堆論文等著被re....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.64.81
※ 編輯: genovia 來自: 220.133.64.81 (08/03 14:20)
※ 編輯: genovia 來自: 220.133.64.81 (08/03 14:27)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 5 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章