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

关于BCB6+dx9的问题

答題得分者是:taishyang
blackiron
一般會員


發表:5
回覆:9
積分:2
註冊:2003-08-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-26 14:40:02 IP:61.171.xxx.xxx 未訂閱
我现在用BCB写一个audio capture application! 我参照directx9里边带的例子写了一个,record的时候没有问题,pause的时候,就会出错,pause以后内容不能就不能录制了!并不是每次pause都会错! 我把directx9里include 和lib目录所有的文件分别拷贝到BCB的include和lib目录中,并且下载了与borland兼容的directx9的lib 可是问题依旧,哪位大侠可以帮帮我!
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-26 17:55:24 IP:140.135.xxx.xxx 未訂閱
blackiron您好:   方便將您的程式碼貼上來嗎?? 好讓有經驗的高手可以幫您    順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
blackiron
一般會員


發表:5
回覆:9
積分:2
註冊:2003-08-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-27 11:51:29 IP:61.171.xxx.xxx 未訂閱
我的代码如下: //cpp file //---------------------------------------------------------------------------    #include  #pragma hdrstop #include "main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMainFrame *MainFrame; //--------------------------------------------------------------------------- __fastcall TMainFrame::TMainFrame(TComponent* Owner) : TForm(Owner) { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); HRESULT hr = BuildCaptureGraph(); if(FAILED(hr)) { FreeCapture(); PostQuitMessage(0); } } //--------------------------------------------------------------------------- void __fastcall TMainFrame::WinProc(TMessage &Msg) { switch (Msg.Msg) { case WM_GRAPHNOTIFY: { if (Msg.LParam == RECORD_EVENT) HandleGraphEvent(); } } MainFrame->Dispatch(&Msg); } //--------------------------------------------------------------------------- void __fastcall TMainFrame::FormCreate(TObject *Sender) { MainFrame->WindowProc = WinProc; } //--------------------------------------------------------------------------- HRESULT TMainFrame:: HandleGraphEvent() { long evCode, evParam1, evParam2; HRESULT hr=S_OK; if (!m_pME) return S_OK; // Read all events currently on the event queue while(SUCCEEDED(m_pME->GetEvent(&evCode, (LONG_PTR *) &evParam1, (LONG_PTR *) &evParam2, 0))) { if(EC_DEVICE_LOST == evCode) { // Device was removed if (evParam2 == 0) { btnStopClick(NULL); FreeCapture(); SetDefaults(); MessageBeep(0); } // Device was reattached else { BuildCaptureGraph(); MessageBeep(0); } } // Free event parameters to prevent memory leaks hr = m_pME->FreeEventParams(evCode, evParam1, evParam2); } return hr; } void __fastcall TMainFrame::SetDefaults() { m_pGB = 0; m_pMC = 0; m_pME = 0; m_pCapture = 0; m_pInputDevice =0; pAudioEncoder = NULL; ppf=NULL; m_pWAVDest=NULL; } HRESULT TMainFrame::GetInterfaces() { HRESULT hr; // Create the filter graph hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **) &m_pGB); if (FAILED(hr)) return hr; // Create the capture graph builder hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **) &m_pCapture); if (FAILED(hr)) return hr; // Obtain interfaces for media control and Video Window if(FAILED(hr = m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC))) return hr; if(FAILED(hr = m_pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_pME))) return hr; // Have the graph signal events via window callbacks hr = m_pME->SetNotifyWindow((OAHWND)MainFrame->Handle, WM_GRAPHNOTIFY, RECORD_EVENT); return hr; } HRESULT TMainFrame::GetCaptureDevice(IBaseFilter **ppSrcFilter) { HRESULT hr; IBaseFilter * pSrc = NULL; // Create the system device enumerator ICreateDevEnum *pDevEnum =NULL; hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void ** ) &pDevEnum); if (FAILED(hr)) { return hr; } // Create an enumerator for the audio capture devices IEnumMoniker *pClassEnum = NULL; hr = pDevEnum->CreateClassEnumerator (CLSID_AudioInputDeviceCategory, &pClassEnum, 0); pDevEnum->Release(); if (FAILED(hr)) { return hr; } // If there are no enumerators for the requested type, then // CreateClassEnumerator will succeed, but pClassEnum will be NULL. if (pClassEnum == NULL) { return E_FAIL; } // Use the first video capture device on the device list. // Note that if the Next() call succeeds but there are no monikers, // it will return S_FALSE (which is not a failure). Therefore, we // check that the return code is S_OK instead of using SUCCEEDED() macro. IMoniker *pMoniker =NULL; ULONG cFetched; if (S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched))) { // Bind Moniker to a filter object hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc); if (FAILED(hr)) { pClassEnum->Release(); pMoniker->Release(); return hr; } } else { pClassEnum->Release(); return E_FAIL; } // Copy the found filter pointer to the output parameter. // Do NOT Release() the reference, since it will still be used // by the calling function. *ppSrcFilter = pSrc; pClassEnum->Release(); pMoniker->Release(); return hr; } HRESULT TMainFrame::GetMP3EncoderFilter(IBaseFilter **ppSrcFilter) { HRESULT hr = E_FAIL; WideString encoderName("MPEG Layer-3"); IBaseFilter *pFilter = NULL; // Create the System Device Enumerator. ICreateDevEnum *pDevEnum =NULL; hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void ** ) &pDevEnum); if (FAILED(hr)) { return hr; } // Obtain a class enumerator for the Audio compressor category. IEnumMoniker *pClassEnum = NULL; hr = pDevEnum->CreateClassEnumerator (CLSID_AudioCompressorCategory, &pClassEnum, 0); pDevEnum->Release(); if (FAILED(hr)) { return hr; } // Enumerate the monikers. IMoniker *pMoniker = NULL; ULONG cFetched; while(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK) { IPropertyBag *pProp=NULL; pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pProp); VARIANT varName; VariantInit(&varName); // Try to match the friendly name. hr = pProp->Read(L"FriendlyName", &varName, 0); if (SUCCEEDED(hr) && (wcscmp(encoderName, varName.bstrVal) == 0)) { hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter); break; } VariantClear(&varName); pMoniker->Release(); // Release for the next loop. if(pProp)pProp->Release(); } *ppSrcFilter = pFilter; return hr; } HRESULT TMainFrame::BuildCaptureGraph() { SetDefaults(); HRESULT hr=GetInterfaces(); if(FAILED(hr)) return hr; hr = m_pCapture->SetFiltergraph(m_pGB); if (FAILED(hr)) { return hr; } hr = GetCaptureDevice(&m_pInputDevice); if (FAILED(hr)) { // Don't display a message because FindCaptureDevice will handle it return hr; } hr = m_pGB->AddFilter(m_pInputDevice, L"Audio Capture"); if (FAILED(hr)) { m_pInputDevice->Release(); return hr; } //Build the File-Writing Section hr = m_pCapture->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\Example.mp3", &ppf, NULL); if(FAILED(hr)) { return hr; } hr = GetMP3EncoderFilter(&pAudioEncoder); if (FAILED(hr)) { return hr; } hr = m_pGB->AddFilter(pAudioEncoder, L"Audio Encoder"); if (FAILED(hr)) { return hr; } hr = CoCreateInstance(CLSID_WavDest, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&m_pWAVDest); if (FAILED(hr)) { return hr; } hr = m_pGB->AddFilter(m_pWAVDest, L"WAV Dest"); if (FAILED(hr)) return hr; // Render streams. hr = m_pCapture->RenderStream( &PIN_CATEGORY_CAPTURE, // Pin category &MEDIATYPE_Audio, // Media type m_pInputDevice, // Capture filter pAudioEncoder, // Compression filter (optional) ppf // Multiplexer or renderer filter ); return hr; } void __fastcall TMainFrame::FreeCapture() { if (m_pME) m_pME->SetNotifyWindow((OAHWND)NULL, 0, 0); SAFE_RELEASE(m_pMC); SAFE_RELEASE(m_pME); SAFE_RELEASE(m_pInputDevice); SAFE_RELEASE(m_pGB); SAFE_RELEASE(m_pCapture); SAFE_RELEASE(ppf); SAFE_RELEASE(pAudioEncoder); SAFE_RELEASE(m_pWAVDest); } void __fastcall TMainFrame::FormClose(TObject *Sender, TCloseAction &Action) { FreeCapture(); CoUninitialize(); } //--------------------------------------------------------------------------- void __fastcall TMainFrame::btnStopClick(TObject *Sender) { if (m_pMC) m_pMC->StopWhenReady(); btnRecord->Enabled =true; } //--------------------------------------------------------------------------- void __fastcall TMainFrame::btnRecordClick(TObject *Sender) { m_pMC->Run(); btnRecord->Enabled =false; } //--------------------------------------------------------------------------- void __fastcall TMainFrame::btnPauseClick(TObject *Sender) { m_pMC->Pause() ; btnContinue->Enabled =true; btnPause->Enabled =false; } //--------------------------------------------------------------------------- void __fastcall TMainFrame::btnContinueClick(TObject *Sender) { m_pMC->Run(); btnContinue->Enabled =false; btnPause->Enabled =true; } //---------------------------------------------------------------------------
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-27 12:10:15 IP:140.135.xxx.xxx 未訂閱
blackiron您好:   程式很長,這樣的排版閱讀起來很吃力   請您參考下面連結做適當的修正,謝謝您的配合   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=36133 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
blackiron
一般會員


發表:5
回覆:9
積分:2
註冊:2003-08-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-28 08:31:26 IP:61.171.xxx.xxx 未訂閱
谢谢,您的帮助! 这个问题我自己解决了! 是这里的别人的贴子给了我很多提示! 这里真是一个好地方
taishyang
站務副站長


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-28 14:50:37 IP:140.135.xxx.xxx 未訂閱
blackiron您好:   
引言: 这个问题我自己解决了!是这里的别人的贴子给了我很多提示! 这里真是一个好地方
請問您是參考哪幾篇呢? 能不能補充上來,將來可能也有其他人有相同的問題 謝謝您 順心
blackiron
一般會員


發表:5
回覆:9
積分:2
註冊:2003-08-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-29 10:43:49 IP:61.171.xxx.xxx 未訂閱
我看这样吧,为了便于别人学习,我把自己的经验写篇文章贴上来,版主您觉得怎么样?发这样的贴子怎么发呢?
taishyang
站務副站長


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-29 13:18:02 IP:140.135.xxx.xxx 未訂閱
blackiron您好:
引言:我看这样吧,为了便于别人学习,我把自己的经验写篇文章贴上来,版主您觉得怎么样?发这样的贴子怎么发呢?
這真是太好了,感謝您的熱心奉獻 可以發表在下面連結的地方 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=79 [會員作品發表區(限本人創作發表)] 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
系統時間:2024-03-29 6:02:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!