如何安裝dspack裡的directshow元件及使用 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
最近常有人問到這個問題,所以小弟寫這份文件給大家參考,並借以拋磚引玉
,希望大家也能分享這方面的研究成果。請大家多多指教。 首先是安裝dspack 1.Download DSPACK http://www.progdigy.com/
並將其解壓縮至任意的位置(只要找得到就可以)。並下載及安裝directx 9及
DXSDK(Direct X SDK)。 以下
以\$(DSPACK)\當作dspack所在目錄。
以\$DXSDK\當作DXSDK所在目錄
以\$(BCB)\當作BCB所在目錄 2.將\$(DSPACK)\include裡的檔案更新至\$(DXSDK)\include,會覆蓋幾個檔。
再把\$(DXSDK)\include裡的檔更新至\$(BCB)\include。 3.以上動作做完,就可安裝dspack directshow元件: 至\$(DSPACK)\packages\目錄裡,依序執行下面這三個檔案
DirectX9_BCB6.bpk 執行compiler,儲存
DSPack_BCB6.bpk 執行compiler,儲存
DSPackDesign_BCB6.bpk 執行install 這目錄的檔案,有些是唯讀的,執行前,把唯讀取消 在執行之前,先在Tools->Environment Option->Libary->Libary path
加入\$(DSPACK)\lib、\$(DSPACK)\src\DSPack、\$(DSPACK)\src\DirectX9
在執行之後,工具列就會多了directx元件
注意:請先確定windows系統檔有無d3d9.dll,d3dx9d.dll這兩個檔。在筆者的
系統檔只有d3d9.dll,所以在compiler DirectX9_BCB6.bpk前,筆者先將d3dx9d.lib
及d3dx9.pas從表格裡移除,再執行compiler。如此最後在install時,就不有
找不到d3dx9d.dll這個訊息,(至於這樣做會不會有副作用,就不得而知,至少現
在用都還沒出現)。
4.安裝好dspack之後,我們就可以使DSPACK所附的範例試試directshow。
執行Demos\BCB6\Playcap\Playcap.bpr。會出現一個錯誤訊息,這是因為
資料夾被改變,只要做點小改變就可以使用了。這時我們可以從
project->options->directories\conditionals->include path這圖看出
有些include目錄並不正確,只要將其改正即可使用。
..\..\..\Src\DSPack 改成\$(DSPACK)\Src\DSPack
..\..\..\Src\DirectX9改成\$(DSPACK)\Src\DirectX9
D:\DSPACK\Demos\BCB6\Playcap改成\$(DSPACK)\Demos\BCB6\Playcap 相同的,在Libary path也要將
D:\DSPACK\Demos\BCB6\Playcap改成\$(DSPACK)\Demos\BCB6\Playcap 改正之後,就可以執行,執行畫面如下,按下device按鈕就可以看到ccd的名稱
點選之後,如果有接上ccd,就可以看到畫面。
enjoy~ 發表人 - jerrykuo 於 2003/09/22 17:56:34
|
blackiron
一般會員 發表:5 回覆:9 積分:2 註冊:2003-08-26 發送簡訊給我 |
|
azard
一般會員 發表:9 回覆:1 積分:2 註冊:2006-08-28 發送簡訊給我 |
想安裝dspack, 搜尋到這篇文章, 可是他說要裝dspack前, 要下載安裝directx 9及direct x sdk.
我對多媒體的東西很不了解,我想問的是directx 9很多遊戲都需要 (像是魔獸世界 wow) 能玩這個遊戲 就代表我的電腦已經有directx 9了嗎? 另外, 我去微軟的網站找 direct x sdk 那個檔案有400多mb 這個是原作者叫我安裝那個direct x sdk嗎? 還是哪裡可以找到direct x sdk? 想請知道的大大能解決我的疑惑. |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
按照原本的安裝方式,我也遇到許多的錯誤,搜尋以前的討論後發現很多人也有類似問題
我將電腦重灌了好幾次之後,終於安裝成功,故將步驟紀錄下來,分享給各位網友 1.安裝Direct X SDK 我試了好幾個版本都會發生安裝錯誤,上dspack官方討論區發現應該要下載舊版本的sdk 我下載direct 9 SDK 2004年12月的版本才安裝成功 h ttp://www.microsoft.com/downloads/details.aspx?FamilyID=4e825a37-0c94-4421-9ec8-156e52525d11&displaylang=en h ttp://download.microsoft.com/download/f/6/0/f6087536-6544-47c7-9ca8-efdcc18feb57/dxsdk_dec2004.exe 101.8.28補充 微軟的連結已經失效了,另外上傳到這裡 http://dl.dropbox.com/u/23455489/dxsdk_dec2004.exe 以下的版本都失敗 http://www.microsoft.com/downloads/details.aspx?DisplayLang=en&FamilyID=86cf7fa2-e953-475c-abde-f016e4f7b61a (連結失效)ttp://download.microsoft.com/download/3/b/d/3bd0a88d-4e99-49fc-931d-9eeb11ecd2a3/dxsdk_apr2007.exe http://ftp.isu.edu.tw/pub/MsDownload/directx/9.0/sdk/ 相關討論http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=77604 2.下載Dspack http://www.progdigy.com/modules.php?name=DSPack 可下載2.3.4,但官方討論區有提到可以從cvs下載最新的dspack 我將最新版的dspack放在http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=92986 裡面還有D2005和D2006的安裝檔,所以以下的問題應該是解決了 http://delphi.ktop.com.tw/board.php?cid=31&fid=77&tid=85330 http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=90062 3. 將Dspack解壓縮到C:\,到C:\DSPACK\packages依"次序"安裝以下的package DirectX9_BCB6.bpk 執行compile後儲存 DSPack_BCB6.bpk 執行compile後儲存 DSPackDesign_BCB6.bpk執行install後儲存,應該會出現安裝成功的訊息(圖1) 並在頁籤最後一項(圖2)找到DSpack 4.編譯範例檔 到C:\DSPACK\Demos\BCB6\Playcap開啟Playcap.bpr 從功能表Project \ Options \ Directories/Conditionals \ Include Path 加入C:\DSPACK\include和$(DXSDK_DIR)\include <= 需要手動輸入 並注意路徑的順序要和圖3相同,如此就可以編譯成功了 相關資訊 其他BCB範例下載http://www.donationcoders.com/marky/ 調整library path的順序 http://www.progdigy.com/modules.php?name=Forums&file=viewtopic&t=3427 若沒有webcam的網友可以下載Softcam來測試範例程式 http://toget.pchome.com.tw/intro/network_webcam/16694.html 若自己拉Dspack元件到Form上時,會出現找不到DSPack.h的錯誤 請先確定你的include path是否和圖3相同,並且將#include "DSPack.h"改成#include "DSPack.hpp"就可以了 |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
我查以前的討論文章很多網友對於如何使用dspack還有許多疑問
雖然dspack有附範例,但一些細節的部分卻沒有詳細的文件,許多的技巧還是靠網友的試誤法才成功的 我來介紹如何從Playcap範例將VideoWindow畫面抓到Image,並在Image上畫線寫文字,最後加上一個按鈕將Image的畫面抓成bmp圖檔 從上一篇文章的步驟四確定Playcap範例能成功編譯 1.先點選VideoWindow後在左邊的Object Inspector找到Align屬性,將alClient改成alNone 2.從DSPack頁籤將SampleGrabber拉到Form上,從Additional頁籤拉Image 3. SampleGrabber1的FilterGraph屬性設為FilterGraph,在OnBuffer事件中輸入 [code cpp] Image1->Canvas->Lock(); SampleGrabber1->GetBitmap(Image1->Picture->Bitmap, pBuffer, BufferLen); Image1->Canvas->Brush->Style=bsClear; Image1->Canvas->Font->Color=clWhite; Image1->Canvas->TextOutA(20,20,"ABC這是測試"); Image1->Canvas->Pen->Color=clWhite; Image1->Canvas->MoveTo(100,100); Image1->Canvas->LineTo(200,200); Image1->Canvas->Unlock(); [/code] 4. 在TMainForm::DevicesClick事件中輸入 IBaseFilter *SampleFilter=NULL; CheckDSError(SampleGrabber1->QueryInterface(IID_IBaseFilter,&SampleFilter)); 並將Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter,NULL , VideoFilter); 改成Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter,SampleFilter , VideoFilter); 5. 在TMainForm::FormCreate事件中 輸入this->DoubleBuffered=true; 避免程式執行時Image1畫面閃爍 6. 到這裡可以先編譯執行看看,應該可以看到VideoWindow和Image都有webcam的畫面 接下來再加上抓圖的功能 7.main.h的TMainForm物件中宣告IsCapure和count變數 8.從Standard頁籤拉一個Button,在OnClick事件中輸入 IsCapure=true; 9.在SampleGrabber1的OnBuffer事件中再加入 [code cpp] if(IsCapure==true)//抓圖 {Image1->Picture->SaveToFile(ExtractFilePath(Application->ExeName) IntToStr(count) ".bmp"); count ; IsCapure=false; } [/code] 10.編譯後執行 範例檔下載http://delphi.ktop.com.tw/download.php?download=upload/489da1a9704cb_Playcap.rar 還附上DirectX9_BCB6.bpl,d3dx9d.dll 若執行時缺少vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe 執行畫面 |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
在DSPACK\Demos\D6-D7\Filters目錄下就有Delphi的filter範例
但網友lu有提到BCB似乎無法寫Filter http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=92403#4 http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=90363#4 http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=62031#6 也算是幸運吧,因緣際會讓我試出來了,雖然只是兩個最簡單的filter範例,卻也讓我高興不已 像BCB6這種古董編輯器(6年前?)就可以做到的事,(borland,codegear,??)卻吝於宣傳 沒有技術文章沒有範例就靠熱心的網友嘗試錯誤,也難怪市場佔有率越來越低 感謝http://www.cppfans.com/d_sdk/victordx9sdk.asp 所提供的DirectX9 SDK和strmbase.lib 裡面還有step by step的教學文件,教你如何建立最簡單的transform filter,SDK的其他範例仍然編譯失敗 相關文章 http://www.programmer-club.com/pc2020v5/forum/ShowSameTitleN.asp?URL=N&board_pc2020=directx&index=4&id=3827&mode=top20&type_pc2020=sametitleLevel-2 包裝ffmpeg中的codecs成為DirectShow中的transform filter http://www.javaworld.com.tw/roller/qing/entry/包裝ffmpeg中的codecs成為directshow中的transform_filter 感覺是不錯的東西,但目前仍是編譯失敗 http://www.codeproject.com/KB/directx/thirdpartyfiltersvideoapp.aspx http://www.codeproject.com/KB/directx/prototypingdsfilters.aspx 這兩篇都是同一作者,介紹如何將影像邊緣找出來,但我執行時CPU飆到100%,感覺有點頓頓的 感覺用filter沒有想像的好 檔案下載http://delphi.ktop.com.tw/download.php?download=upload/48b9431725547_directshowfilter.rar 搜尋關鍵字:NullNull,NullIP,CTransInPlaceFilter,Transform,MediaType
編輯記錄
bugmans 重新編輯於 2008-08-30 21:43:11, 註解 無‧
|
j89105
一般會員 發表:0 回覆:2 積分:0 註冊:2008-09-06 發送簡訊給我 |
照bugmans 大大的方式下去做的時候,小弟確實有找到DSPack的元件,但是做到最後去執行Playcap範例程式的時候,小弟出現了下列的錯誤,故導致無法順利執行,但是我設定Include Path的方式也跟圖3一樣,但是我不知道要不要在library path做設定? 下面是我執行時發生的錯誤,請各位大大幫幫忙!
Build [C Error] crtdbg.h(52): E2268 Call to undefined function '_T' [C Error] crtdbg.h(52): E2034 Cannot convert 'int' to 'const char *' [C Error] crtdbg.h(52): E2340 Type mismatch in parameter 2 (wanted 'const char *', got 'int')
編輯記錄
taishyang 重新編輯於 2008-09-08 09:57:39, 註解 無‧
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
感謝taishyang幫忙修改文章
至於這個錯誤,我自己是沒遇過,但我到google搜尋後找到兩種方法你可以試試看 1.http://www.progdigy.com/forums/viewtopic.php?t=744 在Projects -> Options -> Directories/Conditionals將_DEBUG刪除 2.http://blog.csdn.net/CUMBER/archive/2008/05/21/2465947.aspx 在C:\Program Files\Borland\CBuilder6\Include\crtdbg.h第52行找到 ::wsprintf(msg, TEXT("%s failed - %s/%d"), expr, file, line);改成 ::wsprintf(msg, "%s failed - %s/%d", expr, file, line); 或將整行註解掉
編輯記錄
bugmans 重新編輯於 2008-09-08 14:19:20, 註解 無‧
|
j89105
一般會員 發表:0 回覆:2 積分:0 註冊:2008-09-06 發送簡訊給我 |
|
Yu-Fan
一般會員 發表:9 回覆:18 積分:5 註冊:2007-07-17 發送簡訊給我 |
依照bugmans 大大方式安裝,我也曾出現過與j89105 相同的問題,再用後來bugmans 的文章把問題解決了
但是..我卻還有存在下列的Error 不知道該怎麼辦,煩請各位大大幫個忙!! [C Error] DSUtil.hpp(392): E2257 , expected [C Error] DSUtil.hpp(404): E2293 ) expected [C Error] DSUtil.hpp(505): E2040 Declaration terminated incorrectly [C Error] DSUtil.hpp(557): E2189 extern variable cannot be initialized [C Error] DSUtil.hpp(557): E2108 Improper use of typedef 'LONG' [C Error] DSUtil.hpp(557): E2188 Expression syntax [C Error] DSUtil.hpp(557): E2293 ) expected [C Error] DSUtil.hpp(559): E2189 extern variable cannot be initialized [C Error] DSUtil.hpp(559): E2238 Multiple declaration for 'ULONGLONG' [C Error] DSUtil.hpp(453): E2344 Earlier declaration of 'ULONGLONG' [C Error] DSUtil.hpp(559): E2356 Type mismatch in redeclaration of 'ULONGLONG' [C Error] DSUtil.hpp(453): E2344 Earlier declaration of 'ULONGLONG' [C Error] DSUtil.hpp(559): E2188 Expression syntax [C Error] DSUtil.hpp(559): E2293 ) expected |
Yu-Fan
一般會員 發表:9 回覆:18 積分:5 註冊:2007-07-17 發送簡訊給我 |
各位大大,我已經使用下面的文章將問題解決了
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=57693 |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
看之前討論常問到如何將VideoWindow畫面抓到Image,再利用ScanLine處理後續的資料
但實際上在SampleGrabber1Buffer事件中的pBuffer變數就是各像素了 而且修改後馬上在VideoWindow看到結果,本程式則示範sobel邊緣偵測 1.我從這個範例開始修改 http://delphi.ktop.com.tw/download.php?download=upload/489da1a9704cb_Playcap.rar 刪除Image1和Button1,並將TMainForm::SampleGrabber1Buffer內的程式碼刪除 2.在TMainForm::DevicesClick內加上下列的程式碼以取得畫面的寬和高 [code cpp] TAMMediaType MediaType; SampleGrabber1->SampleGrabber->GetConnectedMediaType(&MediaType); VIDEOINFOHEADER *pVih=(VIDEOINFOHEADER*)MediaType.pbFormat; width=pVih->bmiHeader.biWidth; height=pVih->bmiHeader.biHeight; [/code] 3.在TMainForm::SampleGrabber1Buffer加上轉灰階的程式碼 [code cpp] BufferEnd=(Byte *)pBuffer BufferLen; for(ptr=(Byte *)pBuffer ; ptr *(ptr )=*(ptr )=*(ptr )=gray; } [/code] 4.在class TMainForm : public TForm{...}加上變數宣告 [code cpp] int height,width; int gray; Byte *ptr,*BufferEnd; [/code] 到這裡可以先編譯執行看看有沒有出現灰階的畫面 5.再加上sobel邊緣偵測的程式碼,我借用這個網站的程式碼,再加上一些修改 http://www.jasonokane.com/tu/351cos/sobel/ 在form1上再拉一個TrackBar當作門檻值 sobel((char *)pBuffer,width,height,TrackBar->Position); 範例下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=95424 若執行時缺少vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe
編輯記錄
bugmans 重新編輯於 2008-09-27 09:53:34, 註解 無‧
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
在C:\DSPACK\Demos\D6-D7\VMR\VMRBitmap 示範了如何在VideoWindow寫字和畫圖
畫圖的功能可以繼續發展成市面上的大頭貼軟體或是加上個人浮水印,而寫字的功能可以為影片檔外加字幕 這裡我只示範如何將C:\DSPACK\Demos\BCB6\Playcap 加上VMR的功能,至於其他的應用就請網友再試看看 1. VideoWindow的Mode屬性請從vmNormal改成vmVMR 2. 宣告TVMRBitmap *VMRBitmap;變數 在TMainForm::FormCreate事件中輸入VMRBitmap=new TVMRBitmap(VideoWindow); 在TMainForm::FormDestroy事件中輸入delete VMRBitmap; 3. 功能表再加上Blend\Text後,在TMainForm::Text1Click事件中輸入 [code cpp] VMRBitmap->LoadEmptyBitmap(300,200,pf24bit,clSilver); VMRBitmap->Source = VMRBitmap->Canvas->ClipRect; VMRBitmap->Options = VMRBitmap->Options << vmrbSrcColorKey; VMRBitmap->ColorKey = clSilver; VMRBitmap->Canvas->Brush->Color = clSilver; VMRBitmap->Canvas->Font->Color = clWhite; VMRBitmap->Canvas->Font->Style << fsBold; VMRBitmap->Canvas->Font->Size = 30; VMRBitmap->Canvas->Font->Name = "Arial"; VMRBitmap->Canvas->TextOutA(0,0,"Hello World :)"); VMRBitmap->DrawTo(0,0,1,1,0.5); [/code] 拉一個OpenDialog到MainForm上,Name屬性改為OpenDialog 功能表再加上Blend\Bitmap後,在TMainForm::Bitmap1Click事件中輸入 [code cpp] Graphics::TBitmap *Bitmap; if(OpenDialog->Execute() ) {Bitmap = new Graphics::TBitmap(); try {Bitmap->LoadFromFile(OpenDialog->FileName); VMRBitmap->LoadBitmapA(Bitmap); VMRBitmap->Source=VMRBitmap->Canvas->ClipRect; VMRBitmap->Options=VMRBitmap->Options << vmrbSrcColorKey; VMRBitmap->ColorKey =clWhite; VMRBitmap->DrawTo(0,0,1,1,1); } __finally {delete Bitmap;} } [/code] 4.但是編譯時就會出現這樣的錯誤 [Linker Error] Unresolved external '__fastcall Dspack::TVMRBitmap::LoadBitmapA (Graphics::TBitmap *)' referenced from C:\DSPACK\DEMOS\BCB6\PLAYCAP\MAIN.OBJ 為了修正錯誤請先關閉Playcap專案,再開啟C:\DSPACK\src\DSPack\DSPack.pas 利用文字編輯器將LoadBitmap取代為LoadBitmapA(應該有三個地方被取代掉) 並重新編譯DirectX9_BCB6.bpk,DSPack_BCB6.bpk,DSPackDesign_BCB6.bpk 此時Playcap應該可以編譯成功了 相關應用 有谁能在dspack控件中的videowindow上面实现鼠标画线? http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=76869 用dspack怎么样在播放视频时显示指定字幕(.srt) http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=93277 在 DSPack VideoWindow 上面是否可以畫線或寫字串? http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=78480 參考資料 Delphi的Options := VMRBitmap.Options [vmrbSrcColorKey];在BCB要怎麼改寫 http://www.progdigy.com/forums/viewtopic.php?t=4266 範例下載 http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=95742 |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
包裝ffmpeg中的codecs成為DirectShow中的transform filter
http://www.javaworld.com.tw/roller/qing/entry/包裝ffmpeg中的codecs成為directshow中的transform_filter 原來文章只有原始檔並沒有編譯好的.ax檔,所以花了一些時間利用BCB編譯出來 並將編譯過程紀錄下來以免以後忘記 1.準備工作 (1)DirectX9 SDK相關檔案 => BaseClasses,DX9SDK兩個資料夾 BaseClasses取自 從微軟下載的dx9sdk的Samples\C \DirectShow\BaseClasses DX9SDK取自 http://www.cppfans.com/d_sdk/victordx9sdk.asp (2)FFmpeg相關檔案 => avcodec.dll,avdevice.dll,avfilter.dll,avformat.dll,avutil.dll,swscale.dll 和對應的include資料夾libavcodec,libavdevice,libavfilter,libavformat,libavutil,libswscale FFmpeg取自 http://www.bairuitech.com/html/ruanjianxiazai/ffmpeg/20080414/89.html 用implib.exe轉出lib檔案,指令如下 implib.exe -a avutil.lib avutil.dll implib.exe -a avdevice.lib avdevice.dll implib.exe -a avformat.lib avformat.dll implib.exe -a avcodec.lib avcodec.dll implib.exe -a swscale.lib swscale.dll implib.exe -a avfilter.lib avfilter.dll (3)要轉換的VC專案檔FLVDecoder.zip http://www.javaworld.com.tw/roller/qing/resource/FLVDecoder.zip 2.產生BCB專案檔 功能表File/Other , ActiveX頁籤選ActiveX Library後按下OK 儲存專案為FLVDecoder.tlb,FLVDecoder.bpr關閉BCB 3. 從FLVDecoder.zip取出FLVDecoder.h,FLVDecoderProp.h,iFLVDecoder.h,resource.h,ffmpegext.cpp, FLVDecoder.cpp,FLVDecoderProp.cpp,FLVDecoder.def 並將原本的FLVDecoder.cpp取代掉,將FLVDecoder.cpp內容第一行#include "stdafx.h"註解掉,在檔案最後加上 extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID); BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved); } FLVDecoder.h的DECLARE_IUNKNOWN修改成 STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { return GetOwner()->QueryInterface(riid,ppv); }; STDMETHODIMP_(ULONG) AddRef() { return GetOwner()->AddRef(); }; STDMETHODIMP_(ULONG) Release() { return GetOwner()->Release(); }; 將FLVDecoderProp.cpp內容的第一行#include "stdafx.h"註解掉 第24行加上WINAPI CUnknown * WINAPI CFLVDecoderProp::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr) 將ffmpegext.cpp的第一行#include "stdafx.h"註解掉 [code cpp] #include #include [/code] 修改成 extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" } img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGBA32, (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height); 修改成 struct SwsContext *img_convert_ctx; img_convert_ctx = sws_getContext(320,240,PIX_FMT_YUV420P, 320,240,PIX_FMT_RGBA32, SWS_BICUBIC, NULL, NULL, NULL); sws_scale (img_convert_ctx, pFrame->data, pFrame->linesize, 0, 240,pFrameRGB->data , pFrameRGB->linesize ); sws_freeContext(img_convert_ctx); 4. 重新開啟FLVDecoder.bpr,從功能表Project\Options的Application頁籤,將Target file extension改成ax Directiories/Conditionals頁籤中的Include path加上BaseClasses和DX9SDK\include(次序不能顛倒) Conditional defines再加上STRICT 從功能表Project\Add to Project將BaseClasses\strmbasd.lib,DX9SDK\Lib\strmiids.lib, avcodec.lib,avformat.lib,avutil.lib,swscale.lib,FLVDecoderProp.cpp,ffmpegext.cpp,FLVDecoder.def加入專案 5.開始編譯產生FLVDecoder.ax 檔案下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=96360 |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
http://www.codeproject.com/KB/audio-video/vmr9.aspx
這篇文章示範了如何利用VMR9的功能將兩個影片疊在一起播放 我參考了其中了程式碼重新將\DSPACK\Demos\BCB6\PlayWin改寫 另外參考Moveable Coloured Layers Version 2作成拖曳的功能 http://www.planet-source-code.com/vb/sc ripts/ShowCode.asp?txtCodeId=27945&lngWId=1 我只將關於direct show程式碼放出來以方便搜尋,其餘請自行下載參閱 http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=96777 執行時若需要DirectX9_BCB6.bpl,d3dx9d.dll請從這裡下載 http://delphi.ktop.com.tw/download.php?download=upload/489da1a9704cb_Playcap.rar 執行時缺少vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe [code cpp] FilterGraph->Active = FALSE; FilterGraph->Active = TRUE; if(GraphBuilder==NULL) CheckDSError(FilterGraph->QueryInterface(IID_IGraphBuilder,(void **)&GraphBuilder)); if(FilterGraph2==NULL) CheckDSError(FilterGraph->QueryInterface(IID_IFilterGraph2,(void **)&FilterGraph2)); if(VMR9Filter==NULL) CheckDSError(VideoWindow->QueryInterface(IID_IVMRMixerControl9,(void **)&VMR9Filter)); TPinList *PinList=new TPinList(BaseFilter); for(i=0 ; i GraphBuilder->AddSourceFilter(file,file,&BaseFilter); PinList->Assign(BaseFilter); for(j=0 ; j FilterGraph2->RenderEx(PinList->Items[j],AM_RENDEREX_RENDERTOEXISTINGRENDERERS,NULL); VMR9Filter->SetOutputRect(i,&VMRRect[i]); VMR9Filter->SetZOrder(i,i); ZOrder[i]=i; } delete PinList; FilterGraph->Play(); [/code] |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=37755#6
NullNull和NullIP只是filter的雛形,實際上用途不大,EZRGB24 Filter則是完整的範例 整個架構都已經具備了,你只要著重在影像處理的演算法就好了 另一個好處是filter寫好後先用GraphEdit跑看看,沒問題後再寫程式來執行filter ezrgb24.cpp [code cpp] HRESULT CEZrgb24::Transform(IMediaSample *pMediaSample) { BYTE *pData; long lDataLen; unsigned int grey,grey2; int iPixel; int temp,x,y; RGBTRIPLE *prgb; AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType(); VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat; ASSERT(pvi); CheckPointer(pMediaSample,E_POINTER); pMediaSample->GetPointer(&pData); lDataLen = pMediaSample->GetSize(); int cxImage = pvi->bmiHeader.biWidth; int cyImage = pvi->bmiHeader.biHeight; int numPixels = cxImage * cyImage; switch (m_effect) { // An excellent greyscale calculation is: // grey = (30 * red 59 * green 11 * blue) / 100 // This is a bit too slow so a faster calculation is: // grey = (red green) / 2 case IDC_GREY: prgb = (RGBTRIPLE*) pData; for (iPixel=0; iPixel < numPixels ; iPixel , prgb ) { grey = (prgb->rgbtRed prgb->rgbtGreen) >> 1; prgb->rgbtRed = prgb->rgbtGreen = prgb->rgbtBlue = (BYTE) grey; } //轉成灰階後再加上後續處理的程式碼 break; } return NOERROR; } [/code] [code cpp] void __fastcall TMainForm::MenuOpenClick(TObject *Sender) { if (OpenDialog->Execute()) { FilterGraph->Active = FALSE; FilterGraph->Active = TRUE; FilterGraph->RenderFile(OpenDialog->FileName); //在這裡設定要套用的效果,參數請見iez.h----------- IIPEffect *pIPEffect; Filter1->QueryInterface(IID_IIPEffect,&pIPEffect); pIPEffect->put_IPEffect(IDC_RED,2,100); pIPEffect->Release(); //----------------------------------------------- FilterGraph->Play(); } } [/code] 檔案下載 http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=97182 |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
這範例原本出自dx9sdk\Samples\C++\DirectShow\VMR9\VMR9Allocator
在C:\DSPACK\Demos\D6-D7\VMR\VMR9Allocator也有Delphi範例 但我試著用BCB來編譯卻失敗了,嘗試了很久才採用折衷的辦法 用Dspack的Playcap範例加上Allocator.pas和PlaneScene.pas才編譯成功 技術細節可以參考 中文版 Direct3D 環境中的 DirectShow 影片 http://www.microsoft.com/taiwan/msdn/library/2003/Mar-2003/vmr_d3d.htm 英文版 DirectShow Movies in Direct3D Worlds http://msdn.microsoft.com/en-us/library/ms867211.aspx 範例下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=98065 搜尋關鍵字:CAllocator,IID_IVMRSurfaceAllocator9,IID_IVMRImagePresenter9,IVMRSurfaceAllocatorNotify 執行畫面 |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
更改webcam解析度
這問題的關鍵就是IAMStreamConfig,版上也有網友給了答案,但感覺這問題仍是一直出現 http://www.google.com/search?hl=zh-TW&client=opera&rls=zh-tw&hs=BGW&q=IAMStreamConfig site:delphi.ktop.com.tw&btnG=搜尋&lr= 其實在C:\DSPACK\Demos\D6-D7\videocap就有相同功能的範例 關鍵程式碼 [code cpp] TPinList *PinList=new TPinList(SourceFilter); TEnumMediaType *VideoMediaTypes=new TEnumMediaType(PinList->First()); IAMStreamConfig *iconfig = NULL; CheckDSError(PinList->First()->QueryInterface(IID_IAMStreamConfig,(void **)&iconfig)); int index=((TMenuItem *)Sender)->Tag; iconfig->SetFormat(VideoMediaTypes->Items[index]->AMMediaType); delete PinList; delete VideoMediaTypes; [/code] 測試幾個虛擬的webcam軟體後發現一個很特別的現象 像softcam,VH Screen Capture Driver雖然有更改解析度的視窗,但實際用dspack測試時卻只有一種尺寸 e2eSoft VCam有顯示9種尺寸,但無論點哪一個都還是原來的大小 只有Vcam.ax出現的9種尺寸經點選後真的會改變大小 除非廠商有按照DirectX的標準來實作IAMStreamConfig,否則Dspack也幫不上忙 至於vandate virtual camera請網友不要安裝,測試時會出現視窗炸彈,而且找不到反安裝功能 是個名副其實的流氓軟體,等測試完後我就要用True Image回溯系統 請問如何擷取WEBCAM百萬畫素的影像 http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=95696 很好奇真的可以調到那麼高的解析度嗎? http://www.softcam.com/ http://www.hmelyoff.com/index.php?section=4 http://www.e2esoft.cn/ http://tmhare.mvps.org/downloads/vcam.zip 範例下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=98489 搜尋關鍵字:IID_IAMStreamConfig,TPinList,TEnumMediaType,MediaDescription,AMMediaType |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
利用IMediaDet製作影片縮圖
我參考這兩篇文章也完成一個製作影片縮圖的軟體 示範了如何用IMediaDet的WriteBitmapBits將影片抓成圖檔 抓圖的程式碼我參考http://www.vckbase.com/document/viewdoc/?id=976 利用Media Player Classic製作影片縮圖 http://hc.cyc.edu.tw/mpc/ 用KMPlayer幫影片自動分割成「縮圖簡介」 http://briian.com/?p=3726 關鍵程式碼 [code cpp] long __fastcall TMainForm::MediaDetInit(AnsiString file,long &width,long &height,double &length) { HRESULT hr; long lStreams; bool bFound = false; hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void**) &MediaDet ); if(FAILED(hr)) return hr; wchar_t w_file[1024]; file.WideChar(w_file,1024); MediaDet->put_Filename(w_file); MediaDet->get_OutputStreams(&lStreams); for(int i=0;i hr = MediaDet->put_CurrentStream(i); if (SUCCEEDED(hr)) hr = MediaDet->get_StreamType(&major_type); if (FAILED(hr)) break; if (major_type == MEDIATYPE_Video) {bFound = true; break; } } if (!bFound) return VFW_E_INVALIDMEDIATYPE; MediaDet->get_StreamLength(&length); AM_MEDIA_TYPE mt; MediaDet->get_StreamMediaType(&mt); if ((mt.formattype == FORMAT_VideoInfo) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER))) {VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat); double scale=(double)StrToInt(txtScale->Text)/100; width = pVih->bmiHeader.biWidth * scale; height = pVih->bmiHeader.biHeight * scale; return S_OK; } else return VFW_E_INVALIDMEDIATYPE; } //--------------------------------------------------------------------------- void __fastcall TMainForm::CaptureThumnail(int Column,int Row) { if(!MediaDet) return; double time; int left,top,right,bottom; if(ImgPreview->Picture) ImgPreview->Picture=NULL; ImgPreview->Width=(Column 1)*SPACE ScaleVideoWidth*Column; ImgPreview->Height=(Row 1)*SPACE ScaleVideoHeight*Row; //填上空白的底色 ImgPreview->Canvas->FillRect(TRect(0,0,ImgPreview->Width,ImgPreview->Height)); Graphics::TBitmap *bitmap=new Graphics::TBitmap(); TDateTime DateTime; for(int i=0 ; i time=VideoLength/(Column*Row)*(i*Row j); //每個等份的時間點抓一張圖 MediaDet->WriteBitmapBits(time,ScaleVideoWidth,ScaleVideoHeight,L"C:\\\\temp.bmp"); Application->ProcessMessages(); bitmap->LoadFromFile("C:\\\\temp.bmp"); //加上截圖的時間 DateTime.Val=time/86400; //24*60*60; bitmap->Canvas->TextOut(5,5,FormatDateTime("HH:MM:SS",DateTime).c_str()); left=(i 1)*SPACE ScaleVideoWidth*i; top=(j 1)*SPACE ScaleVideoHeight*j; right=left ScaleVideoWidth; bottom=top ScaleVideoHeight; //將截圖放在對應的位置 ImgPreview->Canvas->CopyRect(TRect(left,top,right,bottom), bitmap->Canvas,TRect(0,0,ScaleVideoWidth,ScaleVideoHeight)); } } delete bitmap; } [/code] 檔案下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=99254 若需要vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe 若需要d3dx9d.dll,DirectX9_BCB6.bpl,DSPack_BCB6.bpl請到這裡下載 http://delphi.ktop.com.tw/download.php?download=upload/489da1a9704cb_Playcap.rar 示範如何更新截圖(1.按下SnapShot 2.拖曳到要取代的縮圖 3.放開滑鼠完成更新) 至於縮圖的陰影和時間數字的美化我就不做了 |
sunwingman
一般會員 發表:26 回覆:47 積分:14 註冊:2008-05-14 發送簡訊給我 |
真是太感謝bugmans大大了~
提供超多有關Directshow控制webcam的資源, 我只能說感激不盡~~~
編輯記錄
sunwingman 重新編輯於 2009-09-30 09:35:37, 註解 無‧
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
我擷取gspy(http://gspy.sourceforge.net/)的gspy\console\main.c的
mark_alarm_zone,do_motion_analysis,update_reference_image三個副程式 可以偵測相鄰兩個frame的差異之處,並用長方形框框突顯出來 比較特別的是ASFStream可以擷取網路串流影片做偵測 http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=50771 可惜在MSDN有提到IFileSourceFilter::Load只能播放一個連結,改播第二個連結時會失敗 It is not designed to load multiple files, and any calls to this method after the first call will fail. http://msdn.microsoft.com/en-us/library/dd389983(VS.85).aspx 讓這個範例的實用性打了些折扣,若要做成類似PPStream,SopCast,TVAnts等網路電視軟體 則還有很大的改善空間。 檔案下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=99991 搜尋關鍵字:CLSID_WMAsfReader,IWMReaderAdvanced2,IFileSourceFilter,GetBufferProgress 影片來源http://sv08msmedia.dot.ca.gov/D11Cam4,只能看1分鐘時間過了畫面就會停住
編輯記錄
bugmans 重新編輯於 2009-12-05 23:21:41, 註解 無‧
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
http://delphi.ktop.com.tw/board.php?cid=31&fid=81&tid=99655
去年11月我買了一本"遊戲音效與視訊程式設計入門",將原本用VC的範例改用dspack BCB實作 雖然書上已有解釋我還是花了很多時間測試,完成之後才發覺dspack已經實作很多細節 我只要專注在IVMRImageCompositor9就好了 這次我嘗試著用ATL的CComPtr,CComQIPtr來宣告變數,只是編譯時會出現兩個錯誤 [C Error] atlbase.h(4657): E2015 Ambiguity between 'IID_IPersistStream' and 'Dsutil::IID_IPersistStream' [C Error] atlbase.h(4664): E2015 Ambiguity between 'GUID_NULL' and 'Directshow9::GUID_NULL' 要在atlbase.h修改兩個地方編譯就會成功 IID_IPersistStream改成Dsutil::IID_IPersistStream GUID_NULL改成Directshow9::GUID_NULL 另外我的範例只能播放原始的avi(例如clock.avi),其他像wmv,rmvb,mpg只會出現整片綠,原因我還不曉 檔案下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=100645 若需要vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe 若需要d3dx9d.dll,DirectX9_BCB6.bpl,DSPack_BCB6.bpl請到這裡下載 http://delphi.ktop.com.tw/download.php?download=upload/489da1a9704cb_Playcap.rar 搜尋關鍵字:CompositeImage,InitCompositionDevice,TermCompositionDevice |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
在"更改webcam解析度"這篇提到藉由IAMStreamConfig來改解析度
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=37755#19 經測試有些軟體卻無法更改解析度,或許可以從這個範例來觀察 CVCamStream要實作IAMStreamConfig的四個Methods CVCamStream::SetFormat CVCamStream::GetFormat CVCamStream::GetNumberOfCapabilities { *piCount = 8;//定義有8種解析度可以選 } CVCamStream::GetStreamCaps(int iIndex,...) { //看你選到哪一個來調整寬度和高度 pvi->bmiHeader.biWidth = 80 * iIndex; pvi->bmiHeader.biHeight = 60 * iIndex; pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader); //一張frame的大小也要更改 pmt->SetSampleSize(pvi->bmiHeader.biSizeImage); } CVCamStream::FillBuffer(IMediaSample *pms) { lDataLen = pms->GetSize();//看一張frame大小多少 for(int i = 0; i < lDataLen; i) pData[i] = rand();//從這裡塞入資料 } 但有些廠商不按照IAMStreamConfig所規定的來實作, 而採用另開視窗設定或提供的SDK來設定,那DirectX就幫不上忙了 檔案下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=101441 若需要vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe 若需要d3dx9d.dll,DirectX9_BCB6.bpl,DSPack_BCB6.bpl請到這裡下載 http://delphi.ktop.com.tw/download.php?download=upload/489da1a9704cb_Playcap.rar 搜尋關鍵字:IAMStreamConfig,IKsPropertySet,GetNumberOfCapabilities,GetStreamCaps
編輯記錄
bugmans 重新編輯於 2010-08-27 23:56:44, 註解 無‧
|
reindeer168
一般會員 發表:0 回覆:1 積分:0 註冊:2010-10-18 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
這不算是個KTV的軟體,我只是利用DCDSPFilter來實作KTV軟體時一些必要的功能
其他點歌功能、歌曲資料庫都沒有,有興趣的網友可以再寫下去 相較於用IMpegAudioDecoder只能將其中一個聲道轉為靜音 DCDSPFilter算是更好的解決方案 原始碼和delphi元件可到官方網站www.dsp-worx.de/ 下載 _di_IDCChannelOrder => 切換伴奏和人聲 _di_IDCAmplify => 調整音量 _di_IDCPitchScale => 升/降key _di_IDCTempo => 加/減速 mv可以用foxy下載mpg影片,檔案裡音樂和人聲就是分開為兩個聲道 参考資料 記得以前RootKit所發表"最近空空再寫卡拉OK程式"有Delphi寫的程式碼 http://delphi.ktop.com.tw/board.php?cid=32&fid=107&tid=96163 KTV程式實作規劃的問題 http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=54095 有關音量輸出的問題... http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=34844 搜尋關鍵字 DCDSPFilter,set_Order,set_Volume,set_Pitch,set_Tempo 檔案下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=102407 若執行時缺少vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe 執行時若需要DirectX9_BCB6.bpl,d3dx9d.dll請從這裡下載 http://delphi.ktop.com.tw/download.php?download=upload/489da1a9704cb_Playcap.rar |
Simon_Li
一般會員 發表:0 回覆:1 積分:0 註冊:2011-12-23 發送簡訊給我 |
您好!
目前也有遇到與您#13樓差不多的問題,但是按您所說,修改后還是有下列問題現象。請問這是什麽原因呢?非常感謝!! <!--[if !supportLists]-->1.首先,程序要加入,否則則為出現: <!--[if !supportLists]-->2.加入后,則出現: <!--[if !supportLists]-->3.在中,前面加上,則出現: 4.為了讓程序識別為一個,我在前面加上,則又出現:[C Error] utilcls.h(390): E2268 Call to undefined function '_ASSERTE_' |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |