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

如何安裝dspack裡的directshow元件及使用

 
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-22 12:07:10 IP:61.230.xxx.xxx 未訂閱
最近常有人問到這個問題,所以小弟寫這份文件給大家參考,並借以拋磚引玉 ,希望大家也能分享這方面的研究成果。請大家多多指教。    首先是安裝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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-27 13:49:21 IP:61.171.xxx.xxx 未訂閱
我在用这些组件构造程序的时候 我在设置Filter的BaseFilter属性为Infinite Pin Tee Filter的时候 说系统ntdll.dll出错,不知道您有不有遇到过! 我的系统是windows xp professional directx9 bcb6
azard
一般會員


發表:9
回覆:1
積分:2
註冊:2006-08-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-29 17:58:29 IP:59.104.xxx.xxx 訂閱
想安裝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-22 10:23:37 IP:125.225.xxx.xxx 未訂閱
按照原本的安裝方式,我也遇到許多的錯誤,搜尋以前的討論後發現很多人也有類似問題
我將電腦重灌了好幾次之後,終於安裝成功,故將步驟紀錄下來,分享給各位網友

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 重新編輯於 2008-09-15 15:24:08, 註解 更新失效連結‧
bugmans 重新編輯於 2009-03-11 20:51:17, 註解 無‧
bugmans 重新編輯於 2012-08-27 19:15:10, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-09 22:00:41 IP:125.225.xxx.xxx 未訂閱
我查以前的討論文章很多網友對於如何使用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,在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 重新編輯於 2009-01-15 10:02:38, 註解 無‧
bugmans 重新編輯於 2012-04-15 02:16:52, 註解 更新圖檔‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-30 21:32:36 IP:125.225.xxx.xxx 未訂閱
在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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-06 17:50:56 IP:61.220.xxx.xxx 訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-07 07:46:03 IP:125.225.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-09-09 11:35:59 IP:140.115.xxx.xxx 訂閱
感謝bugmans大大,這個問題已能順利的解決了!
另外想請問一下demo範例中的Playcap範例,他影像擷取的速度是每秒幾張frame?因為在程式中沒看到任何有關frame張數的設定,還是說這個範例不用設定,因為他初始的設定就是每秒30張frame?
Yu-Fan
一般會員


發表:9
回覆:18
積分:5
註冊:2007-07-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-09-11 10:20:04 IP:60.248.xxx.xxx 訂閱
依照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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-09-11 11:54:19 IP:60.248.xxx.xxx 訂閱
各位大大,我已經使用下面的文章將問題解決了
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=57693
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-09-27 09:48:02 IP:125.225.xxx.xxx 未訂閱
看之前討論常問到如何將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 {gray=(*ptr *(ptr 1) *(ptr 2))/3;
*(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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-10-25 09:39:28 IP:125.225.xxx.xxx 未訂閱
在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 重新編輯於 2008-10-25 09:47:18, 註解 無‧
bugmans 重新編輯於 2012-04-15 02:48:58, 註解 更新圖檔‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-12-06 18:03:01 IP:125.225.xxx.xxx 未訂閱
包裝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 重新編輯於 2008-12-06 18:17:40, 註解 無‧
bugmans 重新編輯於 2008-12-06 18:18:51, 註解 無‧
bugmans 重新編輯於 2008-12-06 18:19:42, 註解 無‧
bugmans 重新編輯於 2008-12-06 18:23:55, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-01-02 21:00:29 IP:125.225.xxx.xxx 未訂閱
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 {FileName[i].WideChar(file,1024);
GraphBuilder->AddSourceFilter(file,file,&BaseFilter);
PinList->Assign(BaseFilter);
for(j=0 ; jCount ; 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
回覆:5486
積分:4552
註冊:2002-10-08

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-01-04 23:48:51 IP:218.168.xxx.xxx 訂閱
感謝bugmans前輩熱心分享心得^_^
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-02-14 22:20:40 IP:125.225.xxx.xxx 未訂閱
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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2009-04-22 22:38:01 IP:125.225.xxx.xxx 未訂閱
這範例原本出自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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2009-05-30 09:15:06 IP:125.225.xxx.xxx 未訂閱
更改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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2009-08-30 11:06:14 IP:125.225.xxx.xxx 未訂閱
利用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 {GUID major_type;
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 {for(int j=0 ; j {//將影片的總時間切成Column*Row份
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

發送簡訊給我
#21 引用回覆 回覆 發表時間:2009-09-29 10:53:54 IP:61.61.xxx.xxx 訂閱
真是太感謝bugmans大大了~

提供超多有關Directshow控制webcam的資源,
我只能說感激不盡~~~

編輯記錄
sunwingman 重新編輯於 2009-09-30 09:35:37, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#22 引用回覆 回覆 發表時間:2009-09-30 08:21:39 IP:125.225.xxx.xxx 未訂閱
我擷取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

發送簡訊給我
#23 引用回覆 回覆 發表時間:2010-04-05 15:18:09 IP:125.225.xxx.xxx 未訂閱
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 重新編輯於 2010-04-05 15:20:35, 註解 無‧
bugmans 重新編輯於 2010-04-05 15:21:58, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#24 引用回覆 回覆 發表時間:2010-08-27 23:54:31 IP:118.167.xxx.xxx 未訂閱
在"更改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

發送簡訊給我
#25 引用回覆 回覆 發表時間:2010-10-18 23:21:07 IP:210.243.xxx.xxx 訂閱
感謝bugmans大大無私的提供Capture Source Filter範例, 獲益良多, 
然而小弟發現產生的Virtual cam裝置在Skype中掛載,
會導致Skype程式崩潰關閉, 想請教bugmans大大,
是否有一些方向或解決辦法能提供給小弟參考?
謝謝bugmans大大~~ ^^
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#26 引用回覆 回覆 發表時間:2011-04-04 20:47:47 IP:114.36.xxx.xxx 未訂閱
我測試也有這樣的問題,但也不知道怎麼解決
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#27 引用回覆 回覆 發表時間:2011-04-04 20:50:45 IP:114.36.xxx.xxx 未訂閱
這不算是個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

編輯記錄
bugmans 重新編輯於 2011-04-04 06:57:18, 註解 無‧
bugmans 重新編輯於 2012-08-13 05:55:13, 註解 無‧
Simon_Li
一般會員


發表:0
回覆:1
積分:0
註冊:2011-12-23

發送簡訊給我
#28 引用回覆 回覆 發表時間:2011-12-27 09:45:17 IP:218.104.xxx.xxx 訂閱
您好!

目前也有遇到與您#13樓差不多的問題,但是按您所說,修改后還是有下列問題現象。請問這是什麽原因呢?非常感謝!!

<!--[if !supportLists]-->1. <!--[endif]-->首先,程序要加入 #include ,否則則為出現:[C Error] utilcls.h(390): E2268 Call to undefined function '_ASSERTE_'
<!--[if !supportLists]-->2. <!--[endif]-->加入#include后,則出現:[C Error] utilcls.h(2826): E2015 Ambiguity between 'GUID_NULL' and 'Directshow9::GUID_NULL'
<!--[if !supportLists]-->3. <!--[endif]-->utilcls.hGUID_NULL,前面加上Directshow9::,則出現:[C Error] utilcls.h(2826): E2090 Qualifier 'Directshow9' is not a class or namespace name
4. 為了讓程序識別Directshow9為一個namespace,我在#include前面加上#include "DSPack.hpp",則又出現:[C Error] utilcls.h(390): E2268 Call to undefined function '_ASSERTE_'
系統時間:2017-12-13 13:38:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!