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

如何取得擷取盒裡的聲音

答題得分者是:HikaruGo
Yu-Fan
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-24 09:56:35 IP:60.248.xxx.xxx 訂閱
各位先進您好:
小弟買了一台pinnacle 510-USB 的擷取盒,它有Video in、 S-Video in及Audio in的接口,透過USB與電腦連結
現在我利用DSPACK可以取得並切換Video及S-Video的訊號,但是卻一直無法得到聲音的部份
對於Audio 的部份,本想用waveInOpen的方式取得
但是用waveInGetDevCaps or waveInGetDevCaps都看不到該擷取盒的裝置
連用mixerGetDevCaps也找不到,全都只能看到電腦音效的部分而已
所以要請問各位先進,還有什麼方式可以讓我得到擷取盒擷取到的聲音
或是指點個方向讓我去試吧!謝謝!!


HikaruGo
中階會員


發表:22
回覆:69
積分:88
註冊:2007-12-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-24 22:26:00 IP:61.62.xxx.xxx 訂閱
PCI 跟USB CARD  通常音頻會不太一樣,
之前在寫抓TV Card 也常發生此問題


建議你用graphedit Trace 一下,應該就知道問題在那,
PS:也有可能你的CrossBar 音頻 沒有對正確,

我沒有此卡 ,只能列出可能的問題.
編輯記錄
HikaruGo 重新編輯於 2008-12-24 22:27:43, 註解 無‧
Yu-Fan
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-25 09:30:50 IP:60.248.xxx.xxx 訂閱
HikaruGo大大:
我用graphedit 試了一下,Audio Capture Devices 只有電腦那個聲卡


但是Video Capture Devices就可以看到那個擷取盒


這樣是對的嗎??我有試過網路上很多種類似的程式,但是Audio 的部份都只有電腦的聲卡

還有你說的"PS:也有可能你的CrossBar 音頻 沒有對正確" 是什麼意思,我不是很清楚

我對於DirectShow不是很懂,都是從下面的文章學的
如何安裝dspack裡的directshow元件及使用
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=37755
請問關於DSPack使用的問題
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=35690

不過我用VideoGrabber1的VCL就可以在Audio Capture Devices 的部分選擇該擷取盒
也可以直接錄音,但就是不知道是用什麼方式做到的
Yu-Fan
一般會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-25 09:43:11 IP:60.248.xxx.xxx 訂閱
HikaruGo大大:
真抱歉,誤會了您的意思,
原來你是要我用GraphEdt去抓問題
我再去試看看
Yu-Fan
一般會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-25 10:10:12 IP:60.248.xxx.xxx 訂閱
剛剛"真的"試了GraphEdit的程式,哇~可以聽到聲音了

但重點來了,接下來我該做什麼呢??要用什麼方法取得聲音呢??
HikaruGo大大,麻煩指點個方向吧,謝謝!!
HikaruGo
中階會員


發表:22
回覆:69
積分:88
註冊:2007-12-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-26 11:08:48 IP:61.62.xxx.xxx 訂閱
看不出來你的 LayOut (Image 無法顯示),
也許是audio Device Index問題,或ReanderStream問題
Yu-Fan
一般會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-26 11:31:47 IP:60.248.xxx.xxx 訂閱
抱歉!!重新附上layout圖

HikaruGo
中階會員


發表:22
回覆:69
積分:88
註冊:2007-12-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-12-26 11:45:25 IP:61.62.xxx.xxx 訂閱
參考目錄 AudioRender
看起來為 DirectSound Device 沒有設對嗎? Device Index 問題?


若音頻重音效卡出來時 要多使用 參考目錄 Audio Captur Souce, 依實體卡略有不同
此圖短缺一個 ,ViedoRender (參考目錄:DirectShow Filters)
(第一個區塊為 參考目錄:ViedoCaptureSource,PS:類比TV卡才有CrossBar)

參考指令 :
RenderStream( )
RenderStream 事先要指定正確的Filter <---( AudioRender與ViedoRender)
也就是把圖轉成Code.


當然 Video Out -- > ViedoRender 中間可以掛一些 Fileter 處理影像如ffDShow (功能滿強大的),可以參考站內記的有人介紹過,


因為 Video in 如 tv 訊號 WebCam....品質都不佳 ,此時可以掛 ffDshow 改善輸出品質(如柔化,去雜訊...)

編輯記錄
HikaruGo 重新編輯於 2008-12-26 12:17:22, 註解 無‧
HikaruGo 重新編輯於 2008-12-26 12:21:26, 註解 無‧
HikaruGo 重新編輯於 2008-12-26 12:33:34, 註解 無‧
Yu-Fan
一般會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-12-27 11:56:42 IP:60.248.xxx.xxx 訂閱
下圖我用Filter 裡的BaseFilter抓出來的圖

由於Audio Captur Sources只有AC97,所以如果要從電腦聲卡出聲音
是不是得從Video Captur Sources的Pnnacle 510-USB 的 Audio out
用RenderStream( )的方式與聲卡連結??
若要有聲音與影像,是否得用到兩個Filter,AudioRender與ViedoRender?



編輯記錄
Yu-Fan 重新編輯於 2008-12-27 12:04:30, 註解 無‧
Yu-Fan
一般會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-01-06 16:52:15 IP:60.248.xxx.xxx 訂閱
請問大大們
用new TSysDevEnum(CLSID_AudioRendererCategory)的方法可以得到聲卡的input
用new TSysDevEnum(CLSID_VideoInputDeviceCategory)再配合EnumPins可以得到"Audio out" pin
但是可以使用RenderStream來連結嗎?
映象中RenderStream是不是只能有一個output port才可以用
我應該用什麼方法把得到的Audio Output pin 及 聲卡 Input pin連結呢?
麻煩大大們提點一下,謝謝!!

Yu-Fan
一般會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-01-07 11:27:22 IP:60.248.xxx.xxx 訂閱
貼上"未完成"的程式碼,請大大們幫忙看一下,謝謝!!

[code cpp]
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//Get Video capturer
SysDev = new TSysDevEnum(CLSID_VideoInputDeviceCategory);
//Get Audio Render
SysDevAu = new TSysDevEnum(CLSID_AudioRendererCategory);

FilterGraph1->ClearGraph();
FilterGraph1->Active = false;

Filter1->BaseFilter->Moniker = SysDev->GetMoniker(0);
Filter2->BaseFilter->Moniker = SysDevAu->GetMoniker(0);

FilterGraph1->Active = true;
ICaptureGraphBuilder2 *Graph = NULL;
IBaseFilter *SourceFilter = NULL;
IBaseFilter *VideoFilter = NULL;
IBaseFilter *AudioFilter = NULL;

CheckDSError(Filter1->QueryInterface(IID_IBaseFilter, &SourceFilter));
CheckDSError(Filter2->QueryInterface(IID_IBaseFilter, &AudioFilter));
CheckDSError(FilterGraph1->QueryInterface(IID_ICaptureGraphBuilder2, &Graph));
CheckDSError(VideoWindow1->QueryInterface(IID_IBaseFilter, &VideoFilter));

HRESULT hr;
hr = Graph->FindInterface(&PIN_CATEGORY_CAPTURE, NULL, SourceFilter,
IID_IAMCrossbar, (void**)&pXBar1);
if (SUCCEEDED(hr))
{
//Find control pin
DisplayCrossbarInfo(pXBar1);
pXBar1->Release();
}

//Find pins
IEnumPins *EnumPins;
IPin *OutPin;
IPin *InPin;
ULONG fetched;
PIN_INFO pinfo;
PIN_DIRECTION inout;
String pinName;

//Find Audio output pin from Video capturer
SourceFilter->EnumPins(&EnumPins);
EnumPins->Reset();
while(EnumPins->Next(1,&OutPin, &fetched)==S_OK)
{
OutPin->QueryPinInfo(&pinfo);
pinfo.achName[0]=' ';
pinName=pinfo.achName;
if(pinName.Pos("Audio out"))
{
break;
}
pinfo.pFilter->Release();
}
EnumPins->Release();

//Find Audio input pin
AudioFilter->EnumPins(&EnumPins);
EnumPins->Reset();
EnumPins->Next(1, &InPin, &fetched);
EnumPins->Release();
//得到OutPin 是 Audio out and Inpin 是 Sound Card in
//但是不知道怎麼連接


Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);
Graph->RenderStream(&PIN_CATEGORY_PREVIEW,NULL,SourceFilter, NULL,AudioFilter);
//影像部分沒問題,但是沒聲音
//我知道第二行有問題,但就不知道怎麼改
FilterGraph1->Play();
Graph->Release();
VideoFilter->Release();
SourceFilter->Release();
AudioFilter->Release();
}

[/code]
編輯記錄
Yu-Fan 重新編輯於 2009-01-07 11:31:36, 註解 無‧
Yu-Fan 重新編輯於 2009-01-07 11:35:59, 註解 無‧
Yu-Fan 重新編輯於 2009-01-07 11:39:16, 註解 無‧
Yu-Fan 重新編輯於 2009-01-07 11:42:06, 註解 無‧
Yu-Fan 重新編輯於 2009-01-07 11:44:33, 註解 無‧
Yu-Fan 重新編輯於 2009-01-07 11:51:14, 註解 無‧
Yu-Fan 重新編輯於 2009-01-07 11:56:04, 註解 無‧
Yu-Fan 重新編輯於 2009-01-07 11:57:34, 註解 無‧
Yu-Fan
一般會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-01-09 17:49:15 IP:60.248.xxx.xxx 訂閱
終於有聲音了,感動呢~~
最後還是老實的慢慢用CoCreateInstance寫了
再用Graph->Connect( OutPin,InPin)就可以啦

但還是有點疑問,難道不能用DSPACK 裡面的VCL連結嗎?
希望知道的前輩能夠指點一下,謝謝!!

先結案去~~

編輯記錄
Yu-Fan 重新編輯於 2009-01-09 17:50:28, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-01-09 18:04:54 IP:118.169.xxx.xxx 訂閱
您好:

方便寫個範例放到分享區中讓有需要的人參考嗎^^?
印象中站上沒有這類的範例

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