線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1501
推到 Plurk!
推到 Facebook!

參考了板上一些人貼的讀avi檔後~有一些問題想請教

尚未結案
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-14 20:55:47 IP:218.175.xxx.xxx 未訂閱
 
#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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-15 12:35:45 IP:218.175.xxx.xxx 未訂閱
請問使用這個方式有辦法說抓到它的frame然後對它的frame做處理嗎~比如說前一秒的跟這一秒的相減這樣子~因為我本來是直接對ccd所以抓到的frame來做處理~所以使用capSetCallbackOnFrame像這樣的就可以了~但是現在用這個方式讀進來~就不知該如何處理了~所以想請各位大大幫幫我~謝謝各位大大
shiffong
一般會員


發表:0
回覆:2
積分:0
註冊:2005-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-10 10:29:47 IP:203.64.xxx.xxx 未訂閱

請問小弟對著上面所提供的程式碼去執行,執行會出現下圖所示的錯誤,是哪邊出問題呢??有前輩能告之嗎??謝謝

shiffong
一般會員


發表:0
回覆:2
積分:0
註冊:2005-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-10 13:38:25 IP:203.64.xxx.xxx 未訂閱
已解決了解到^^
===================引 用 文 章===================

請問小弟對著上面所提供的程式碼去執行,執行會出現下圖所示的錯誤,是哪邊出問題呢??有前輩能告之嗎??謝謝

系統時間:2024-05-02 16:21:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!