參考了板上一些人貼的讀avi檔後~有一些問題想請教 |
尚未結案
|
dragonhippopdc
一般會員 發表:45 回覆:51 積分:19 註冊:2005-01-15 發送簡訊給我 |
#include "vfw.h" //------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int i=0; bool Frame2TImage(PAVISTREAM *gapavi,AVISTREAMINFO *avis,long miniSecond,TImage *Image1);// 從影像串流中取出相對應時間的Frame, 並秀在指定TImage的Canvas 上 bool GetVideoStream(char *szFile,PAVISTREAM *gapavi,AVISTREAMINFO *avis); // 由 AVI 檔中取出影像串流 //------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //------------------------------------------------------------------- bool GetVideoStream(char *szFile,PAVISTREAM *gapavi,AVISTREAMINFO *avis) { //1 Initial the AVI library AVIFileInit(); //2 Open an AVI-file HRESULT hr; PAVIFILE pfile; // 讀取avi檔案 hr = AVIFileOpen(&pfile,szFile , 0, 0L); if (hr != 0) { return false; } //3 Getting an AVI stream //PAVISTREAM gapavi; // for storage the frames of AVI int gcpavi; AVIFileGetStream(pfile, gapavi, 0L, 0); // 把得到的 Stream interface放在gapavi中 //4. Get the stream information //AVISTREAMINFO avis; 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; } //--------------------------------------------------------- bool HBITMAP2TImage(HBITMAP hBitmap,TImage *Image1) { BITMAP bitmap; Graphics::TBitmap *Bitmap1=new Graphics::TBitmap(); Bitmap1->Handle=hBitmap; // 取得 Bmp 的 Width & Height GetObject(hBitmap,sizeof(BITMAP),&bitmap); Image1->Width=bitmap.bmWidth; Image1->Height=bitmap.bmHeight; // 把 Bitmap 畫在 Image1上 Image1->Canvas->Draw(0,0,Bitmap1); delete Bitmap1; Image1->Visible=true; Image1->Repaint(); return true; } //------------------------------------------------------------------- bool Frame2TImage (PAVISTREAM *gapavi,AVISTREAMINFO *avis,long miniSecond,TImage *Image1) { PGETFRAME gapgf; // GetFrame物件 //5. 對指定的 gapavi video stream 進行解壓縮,傳回 GetFrame物件放在gapgf中 if (avis->fccType == streamtypeVIDEO) { gapgf = AVIStreamGetFrameOpen(*gapavi, NULL); if (gapgf == NULL) return false; } //6. 對指定的時間(2th) 計算相對應的frame LONG lFrame; lFrame = AVIStreamTimeToSample(*gapavi, miniSecond); //8. Get a video frame BYTE abFormat[1024]; LPBITMAPINFOHEADER lpbi; // <----- the frame data lpbi = (LPBITMAPINFOHEADER)abFormat; // 指定 lpbi的位址 // 傳回 Video frame的位址放在 lpbi lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(gapgf,lFrame ); // 10. Paint Video HBITMAP hBitmap; hBitmap=CreateDIBitmap( GetDC(NULL),lpbi,CBM_INIT,(BYTE *)lpbi 40,(BITMAPINFO *)lpbi,DIB_RGB_COLORS); HBITMAP2TImage(hBitmap,Image1); return true; } //------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Close(); } //------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { PAVISTREAM gapavi; AVISTREAMINFO avis; // 取出 Video Stream GetVideoStream("c:\\1.avi",&gapavi,&avis); // 秀出指定的frame //Frame2TImage(&gapavi,&avis,5000,Image1); /* while(i<10000) { Frame2TImage(&gapavi,&avis,i,Image1); i=i 10; }*/ for(i=0;i<=30000;i =10) { Frame2TImage(&gapavi,&avis,i,Image1); } }想請問各位大大要如果才能控制它撥放的速度跟正常的一樣呢~因為感覺它好像動的很快~一下子就把frame都跑完了~還有要如何控制我只要每秒撥幾個frame就好了~例如~正常是一秒30個frame~但是我讀進來後~只想要一秒撥五個frame或是撥十個frame要如何做呢~請各位大大教教我~謝謝各位大大 發表人 - dragonhippopdc 於 2005/05/14 20:56:30 |
dragonhippopdc
一般會員 發表:45 回覆:51 積分:19 註冊:2005-01-15 發送簡訊給我 |
|
shiffong
一般會員 發表:0 回覆:2 積分:0 註冊:2005-10-28 發送簡訊給我 |
|
shiffong
一般會員 發表:0 回覆:2 積分:0 註冊:2005-10-28 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |