Mp4 キャプチャ アプリケーションを直接表示しています。私のアプリケーションでは、30 分 (または何らかの動的な値) のビデオを連続してキャプチャする必要があります。私のグラフは以下の通りです
Video Source --> x264vfw - H.264/MPEG-4 AVC Codec --------->GDCL MPEG-4 Multiplexer --> File Writer
|
Audio Source --> ACM Wrapper --> Monogram AAC Encoder --|
そのために、私は次のようなロジックを作成しました->
- グラフ Builder を作成し、 Devices を取得し、 Graph を作成し、キャプチャ グラフを開始および停止するために必要なすべてのものを含むキャプチャ クラス。
- キャプチャ クラス用に 2 つのポインター オブジェクトを作成し、1 番目と 2 番目のオブジェクトのグラフを作成します。
- 1 番目のグラフを実行し、30 分のタイムアウト後に 2 番目のグラフを開始し、1 番目のグラフを停止します
同じ方法でグラフを継続的に実行します。このロジックは適切に機能するはずです...そして、ほぼ論理的に正しいです
最初のグラフを作成すると、最初のグラフが正常に生成され、2番目のポインタオブジェクトを使用してそのオブジェクトのグラフを作成すると、接続Audio Source Pin
されずACM Wrapeer
、HRESULT = -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 を使用してこのメソッドからグラフに追加されます
リソースの一部を外部にリリースする必要があると思いますが、わかりません。