したがって、私はこれをよく読んで、http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htmです。DirectShowフィルタをプライベートCoCreateInstance経由で登録せずに使用する
これは、フィルタを登録せずに使用する方法を示しています。新しいメソッドとプライベートCoCreateInstanceメソッドを使用する2つのメソッドがあります。私はCoCreateInstanceメソッドを使用しようとしています。
コードは次のようにリストされているサイトからのサンプルで、
IUnknownPtr pUnk;
HRESULT hr = CreateObjectFromPath(TEXT("c:\\path\\to\\myfilter.dll"), IID_MyFilter, &pUnk);
if (SUCCEEDED(hr))
{
IBaseFilterPtr pFilter = pUnk;
pGraph->AddFilter(pFilter, L"Private Filter");
pGraph->RenderFile(pMediaClip, NULL);
}
私のコードは次のよう、
IUnknownPtr pUnk;
HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4demux.dll"), IID_BaseFilter, &pUnk);
if (SUCCEEDED(hr))
{
//add functionality
}
私はIID_BaseFilter推測しているがImが使用することになって何で、その何I他のフィルタに使用します。しかし、私は、 'ClassFactoryが要求されたクラスを提供できません'というエラーが表示されます。
ここに何か不足していますか?どんな助けでも大歓迎です。前もって感謝します!
編集:コード
IBaseFilter *pSrc = NULL, *pSrc2 = NULL, *pWaveDest = NULL, *pWriter = NULL;
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;
ICaptureGraphBuilder2 *pBuild;
IMediaControl *pControl = NULL;
// This example omits error handling.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2, (void**)&pBuild);
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
//Initialize the Capture Graph Builder
hr = pBuild->SetFiltergraph(pGraph);
// Not shown: Use the System Device Enumerator to create the
// audio capture filter.
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
hr = pGraph->AddFilter(pSrc, L"VideooCap");
hr = pMoniker2->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc2);
hr = pGraph->AddFilter(pSrc2, L"AudioCap");
IBaseFilter *pMux;
//IFileSinkFilter *pSink;
hr = pBuild->SetOutputFileName(
&MEDIASUBTYPE_Avi, // Specifies AVI for the target file.
L"C:\\wav\\Example2.mp4", // File name.
&pMux, // Receives a pointer to the mux.
NULL); // (Optional) Receives a pointer to the file sink.
IUnknownPtr pUnk;
//static CLSID const clsid = { 0x025BE2E4, 0x1787, 0x4DA4, { 0xA5,0x85,0xC5,0xB2,0xB9,0xEE,0xB5,0x7C } };
static CLSID const clsid = { 0x5FD85181, 0xE542, 0x4e52, { 0x8D,0x9D,0x5D,0x61,0x3C,0x30,0x13,0x1B } };
//5FD85181-E542-4e52-8D9D5D613C30131B
HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4mux.dll"), clsid, &pUnk);
if (SUCCEEDED(hr))
{
IBaseFilterPtr pFilter = pUnk;
HRESULT hr = pGraph->AddFilter(pFilter, L"Private Filter");
}
hr = pBuild->RenderStream(
NULL,//NULL,//&PIN_CATEGORY_CAPTURE, // Pin category.
NULL,//&MEDIATYPE_Interleaved,//NULL,//&MEDIATYPE_Audio, // Media type.
pSrc, // Capture filter.
NULL, // Intermediate filter (optional).
pMux); // Mux or file sink filter.
hr = pBuild->RenderStream(
NULL,//NULL,//&PIN_CATEGORY_CAPTURE, // Pin category.
NULL,//&MEDIATYPE_Interleaved,//NULL,//&MEDIATYPE_Audio, // Media type.
pSrc2, // Capture filter.
NULL, // Intermediate filter (optional).
pMux); // Mux or file sink filter.
IMediaControl *pMC = NULL;
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMC);
printf("START");
hr = pMC->Run();
Sleep(4000);
hr = pMC->Stop();
printf("END");
CoUninitialize();
}
}
すごいああ、私は完全にそれを逃しました。私の経験不足のため申し訳ありません。今私は、マルチプレクサのCLSIDを追加しました。これは、誤っていないとエンコーダですか?フィルタを見つけてから続行します。\t IBaseFilterPtr pFilter = pUnk; pGraph-> AddFilter(pFilter、L "プライベートフィルタ");今はエンコードするのに十分ではないでしょうか?ファイルサイズは以前と同じです。または、出力タイプ(&MEDIASUBTYPE_Avi)のようなものを変更する必要がありますか?また、おかげで再びローマのために私を助ける永続性、あなたはヒーローです:) –
これは、フィルタを追加して使用するのに十分です。私はあなたがそれを正しく使用しているかどうか確信が持てません - あなたはあなたが持っているどのようなグラフトポロジーとピンのメディアタイプについて説明する必要があります。 –
申し訳ありませんすべてを示す最初の投稿に自分のコードを追加しました。 –