0

Mp4 キャプチャ アプリケーションを直接表示しています。私のアプリケーションでは、30 分 (または何らかの動的な値) のビデオを連続してキャプチャする必要があります。私のグラフは以下の通りです

Video Source --> x264vfw - H.264/MPEG-4 AVC Codec --------->GDCL MPEG-4 Multiplexer --> File Writer                                             
                                                        | 
Audio Source --> ACM Wrapper --> Monogram AAC Encoder --|

そのために、私は次のようなロジックを作成しました->

  1. グラフ Builder を作成し、 Devices を取得し、 Graph を作成し、キャプチャ グラフを開始および停止するために必要なすべてのものを含むキャプチャ クラス。
  2. キャプチャ クラス用に 2 つのポインター オブジェクトを作成し、1 番目と 2 番目のオブジェクトのグラフを作成します。
  3. 1 番目のグラフを実行し、30 分のタイムアウト後に 2 番目のグラフを開始し、1 番目のグラフを停止します

同じ方法でグラフを継続的に実行します。このロジックは適切に機能するはずです...そして、ほぼ論理的に正しいです

最初のグラフを作成すると、最初のグラフが正常に生成され、2番目のポインタオブジェクトを使用してそのオブジェクトのグラフを作成すると、接続Audio Source PinされずACM WrapeerHRESULT = -2147220969

誰にもそのような行動のアイデアがありますか??

必要に応じてコードを貼り付けることができます。

ありがとう。

@Roman R.、投稿を編集してコードのフラグメントを追加しています。ここに必要な詳細を追加したいと思います。

編集:

// Create 1st Capture Instance
Capture *capodd = new Capture();
capodd->destination = capinfo.destination;
capodd->periodicity = capinfo.periodicity;

// Select 1st Audio and 1st Video Device from Devices add their filters to graph
capodd->SelectDevice(1,1);

// Build Graph for the 1st Capture Instance
capodd->BuildMp4CaptureGraph();

// Create 2nd Capture Instance
Capture *capeven = new Capture();
capeven->destination = capinfo.destination;
capeven->periodicity = capinfo.periodicity;

// Select 1st Audio and 1st Video Device from Devices add their filters to graph
capeven->SelectDevice(1,1);

// Build Graph for the 2nd Capture Instance
capeven->BuildMp4CaptureGraph();


while(1)
{
    // set current capture file 
    Capture *capcurrent = new Capture();
    if(!capodd.Fcapturing && !capeven.Fcapturing)
    {
        capcurrent = capodd
        capodd->StopCapture();
    }
    else if(capodd.Fcapturing)
    {
        capcurrent = capeven;
        capodd->StopCapture();
    }
    else
    {
        capcurrent = capodd;
        capeven->StopCapture();
    }



    // Set the Capture File name 
    capcurrent->setCaptureInfo();

    // start capturing
    capcurrent->StartCapture();

    HANDLE hTimer = NULL;
    HANDLE hTimerQueue = NULL;
    int arg = 123;
    gDoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (NULL == gDoneEvent)
    {
        capcurrent->ErrMsg(TEXT("CreateEvent failed (%d)\n"), GetLastError());
        return FALSE;
    }

     hTimerQueue = CreateTimerQueue();
    if (NULL == hTimerQueue)
    {
        capcurrent->ErrMsg(TEXT("CreateTimerQueue failed (%d)\n"), GetLastError());
        return FALSE;
    }

    // Set a timer to call the timer routine in 10 seconds.
    if (!CreateTimerQueueTimer( &hTimer, hTimerQueue, 
        (WAITORTIMERCALLBACK)TimerRoutine, &arg , (capcurrent->dwTimeLimit)*1000, 0, 0))
    {
        capcurrent->ErrMsg(TEXT("CreateTimerQueueTimer failed (%d)\n"), GetLastError());
        return FALSE;
    }

    if (WaitForSingleObject(gDoneEvent, ((capcurrent->dwTimeLimit)*1000)+1000) != WAIT_OBJECT_0)
        capcurrent->ErrMsg(TEXT("WaitForSingleObject failed (%d)\n"), GetLastError());

    CloseHandle(gDoneEvent);

    // Delete all timers in the timer queue.
    if (!DeleteTimerQueue(hTimerQueue))
        capcurrent->ErrMsg(TEXT("DeleteTimerQueue failed (%d)\n"), GetLastError());


}

デバイスの選択 オーディオおよびビデオ フィルタ デバイスを取得し、選択したフィルタをグラフに追加します

BuildMp4CaptureGraph は上記の図のようにグラフを作成し、ACM ラッパー、GDCL Mux フィルターが作成され、CoCreateInstance を使用してこのメ​​ソッドからグラフに追加されます

リソースの一部を外部にリリースする必要があると思いますが、わかりません。

4

1 に答える 1

1

-2147220969-> 0x80040217-> VFW_E_CANNOT_CONNECT:

接続を確立するための中間フィルターの組み合わせが見つかりませんでした。

つまり、2 回目にグラフを作成しようとして失敗しました。エラーを特定のピン接続に分離するには、グラフにあるフィルターを確認する必要があります。

また、通常、2 つ以上のグラフで同じキャプチャ デバイスを使用することはできないことに注意してください。それらは、アクティブなパイプラインによって排他的にロックされます。

于 2012-05-29T12:38:10.160 に答える