全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1603
推到 Plurk!
推到 Facebook!

我用GetVideoStream,加上for迴圈,為何最多只能show74個frmae?

答題得分者是:cmf
jchuang
一般會員


發表:41
回覆:36
積分:15
註冊:2003-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-18 17:16:49 IP:163.28.xxx.xxx 未訂閱
我用GetVideoStream(),加上for迴圈,為何最多只能show74個frmae呢???        // 取出 Video Stream  GetVideoStream("c:\\0_999.avi",&gapavi,&avis);     // 秀出指定的frame    for(int k=0;k<=10000;k+=33) {   Frame2TImage(&gapavi,&avis,19033+k,Image1);//畫出圖 } bool  TForm1::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; }    bool TForm1::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; aa= CountColor(0,0);  ba= CountColor(1,0);  ca= CountColor(2,0);  da= CountColor(3,0);  ea= CountColor(4,0);    m=CountFrame(aa,ba,ca,da,ea);//傳迴一個數值 Memo1->Lines->Add(IntToStr(m)); Memo1->Lines->SaveToFile("number.txt"); Image1->Repaint();         return true; }    當執行完後發現最多只有run74個frame請問各位大大要如何修改,才能請較多的 frame呢?? 感謝先前提供function的各位大大囉!!!!!!!!!1    < >< > 新手上路
------
新手上路
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-05 09:55:47 IP:61.218.xxx.xxx 未訂閱
#include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    DWORD dwImageSize = (DWORD)320 * (DWORD)240 * 3;        // 640 * 480 * 24 bpp
    
    void AviPlayer(HWND hWnd, char* szFilename)
    {
        PAVIFILE pavif; 
        PAVISTREAM pavis;
        AVIFILEINFO afi;
        LPBITMAPINFOHEADER biFmt;
        LPSTR szBuffering;
        HDC hdcDisplay;
        HDRAWDIB hddOp;
        LONG lIndex, lLength;
    
        // Initialisation du sous-système AVI
        AVIFileInit();
    
        // Ouverture du fichier utilisateur en mode lecture seule et en mode partage
        AVIFileOpen(&pavif, szFilename, OF_READ, NULL);
    
        // Récupération des informations sur le copyright, stream name, etc.
        AVIFileInfo(pavif, &afi, sizeof(AVIFILEINFO));
    
        // Trouver le premier flux video (obligatoire)
        AVIFileGetStream(pavif, &pavis, streamtypeVIDEO, 0);
    
        // Taille en octets d'un bloc video
        AVIStreamFormatSize(pavis, 0, &lLength);
        
        // Allocation de de l'espace nécessaire en fonction du format
        biFmt = (LPBITMAPINFOHEADER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, lLength);
        szBuffering = (LPSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwImageSize);
    
        // Obtention du DC pour l'affichage
        hdcDisplay = GetWindowDC(hWnd);
    
        // Lecture du format d'un bloc sur la sortie video
        AVIStreamReadFormat(pavis, 0, biFmt, &lLength);
    
        // Combien de frames contient le flux video ?
        lLength = AVIStreamLength(pavis);
    
        // Retailler le fenêtre a la taille exacte du film
        SetWindowPos(hWnd, HWND_TOP, 0, 0, (UINT)biFmt->biWidth, (UINT)biFmt->biHeight, SWP_NOMOVE);
    
        // Création de l'objet DrawDib
        hddOp = DrawDibOpen();
        
        // Initialisation des propriétés de l'objet DrawDib
        DrawDibBegin(hddOp, hdcDisplay, 0, 0, biFmt, 
                      (UINT)biFmt->biWidth,(UINT)biFmt->biHeight, DDF_SAME_HDC);
    
        // Finalement afficher la fenêtre
        ShowWindow(hWnd, SW_RESTORE);
    
        // Maintenant faire une boucle sur la lecture du flux videopour lire l'ensemble des
        // frame le plus rapidement possible. Les frames video sont décompressées par la
        // fonction  AVIStreamRead() en DIBs (dans le buffer szBuffering) ainsi nous n'avons 
        // pas à nous pr\eoccuper de la décompression.
        for (lIndex = 0; lIndex < lLength;   lIndex) {
    
            LONG uLong = dwImageSize;
    
            AVIStreamRead(pavis, lIndex, 1, szBuffering, dwImageSize, &uLong, NULL);
            DrawDibDraw(hddOp, hdcDisplay, 0, 0, (UINT)biFmt->biWidth,
                         (UINT)biFmt->biHeight, biFmt, szBuffering, 0, 0, 
                         (UINT)biFmt->biWidth, (UINT)biFmt->biHeight, 0);
    
        }    // Affichage de chaque Frame
    
        // Réafficher la fenêtre application
        ShowWindow(hWnd, SW_HIDE);
        ShowWindow(hWnd, SW_SHOW);
    
        // Libération du DC
        ReleaseDC(hWnd, hdcDisplay);
    
        // Libération des ressources du flux video
        AVIStreamRelease(pavis);
        AVIFileRelease(pavif);
    
        // Libération de la mémoire allouée
        HeapFree(GetProcessHeap(), 0, (LPVOID)biFmt);
        HeapFree(GetProcessHeap(), 0, (LPVOID)szBuffering);
    
        // Fermeture de l'objet DrawDib et du sous-système AVI
        DrawDibClose(hddOp);
        AVIFileExit();
    }
         
僅供參考,歡迎繼續發言願以此功德 莊嚴佛淨土 上報四重恩 下濟三塗苦 若有見聞者 悉發菩提心 盡此一報身 同生極樂國
------
︿︿
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-06 15:19:55 IP:211.78.xxx.xxx 未訂閱
請問一下 此程式在將AVI檔案show在畫面上時 程式是在for迴圈中運行,所以程式無法做其他動作, 請問可以使用for迴圈以外的方式嗎??該怎麼作?? 發表人 - shing187 於 2003/09/08 12:00:34
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-08 13:21:11 IP:61.218.xxx.xxx 未訂閱
關於 撥放 AVI 你可以使用多種方法達成: 1. MCI : 使用 mciSendCommand 或 mciSendString 2. MCIWnd window class 3. VFW: AVI STREAM 4. Windows Media Player ActiveX 5. DIRECTSHOW
------
︿︿
u9012021
一般會員


發表:21
回覆:19
積分:23
註冊:2005-01-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-11 21:24:20 IP:140.125.xxx.xxx 未訂閱
請問一下 cmf大大 您寫的程式如何把從AVI檔讀到的Frames秀到Image的元件上呢?? HWND hWnd, char* szFilename 此兩個變數中szFilename應該是給AVI的路徑檔名吧?? 那HWND hWnd此變數我看不懂~因為對WindowsSDK不熟~所以看不太懂 麻煩大大可以幫我解惑一下嗎~謝謝^^ 發表人 - u9012021 於 2005/05/11 21:25:16
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-16 11:25:52 IP:61.218.xxx.xxx 未訂閱
    Q:請問一下 cmf大大 您寫的程式如何把從AVI檔讀到的Frames秀到Image的元件 上呢?? A: 無. 該程式是將影片秀到一個視窗上,並不是秀到Image的元件上    Q: HWND hWnd, char* szFilename    此兩個變數中szFilename應該是給AVI的路徑檔名吧?? A: YES    Q: 那HWND hWnd此變數我看不懂~因為對WindowsSDK不熟~所以看不太懂    麻煩大大可以幫我解惑一下嗎~謝謝^^ A: HWND hWnd 是指定影片要秀到哪一個視窗上,該視窗的 HANDLE    =================================================================        http://netbook.mm520.net/modules/newbb/newtopiclist.php?start=50
------
︿︿
u9012021
一般會員


發表:21
回覆:19
積分:23
註冊:2005-01-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-17 21:29:58 IP:210.61.xxx.xxx 未訂閱
引言: Q:請問一下 cmf大大 您寫的程式如何把從AVI檔讀到的Frames秀到Image的元件 上呢?? A: 無. 該程式是將影片秀到一個視窗上,並不是秀到Image的元件上 Q: HWND hWnd, char* szFilename 此兩個變數中szFilename應該是給AVI的路徑檔名吧?? A: YES Q: 那HWND hWnd此變數我看不懂~因為對WindowsSDK不熟~所以看不太懂 麻煩大大可以幫我解惑一下嗎~謝謝^^ A: HWND hWnd 是指定影片要秀到哪一個視窗上,該視窗的 HANDLE ================================================================= http://netbook.mm520.net/modules/newbb/newtopiclist.php?start=50
再麻煩大大一個問題~如何吧HWND hWnd的影像轉成Timage或TBitmap的格式 使用Image的VCL元件作輸出呢~我用Image->Picture->Bitmap->Handle 輸入HWND hWnd變數~他會顯示在螢幕的左上角~ 我知道用Panel->Handle可以限制在Panel上面顯示~ 不過我想要的功能是使用Image來顯示~希望大大能指導一下~ 是否有SDK的函式可以轉換^^"
S4225E
一般會員


發表:1
回覆:2
積分:0
註冊:2005-01-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-22 22:23:01 IP:218.168.xxx.xxx 未訂閱
"使用Image的VCL元件作輸出呢~我用Image->Picture->Bitmap->Handle 輸入HWND hWnd變數~他會顯示在螢幕的左上角~ 我知道用Panel->Handle可以限制在Panel上面顯示~ " 這句話我實在看不懂,我是用 bcb 用以下寫法,但是不通,那該怎麼處理 strcpy(str1,"Open movie parent "); strcat(str1,Panel1->Handle); strcat(str1," style child"); mciSendString(str1,ret,128,0); 請大哥幫忙解囊,thanks! 巫
------
u9012021
一般會員


發表:21
回覆:19
積分:23
註冊:2005-01-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-24 09:24:41 IP:140.125.xxx.xxx 未訂閱
您好 使用的方式如下 AviPlayer(Panel1->Handle, char* szFilename);
系統時間:2024-05-04 16:49:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!