Я пишу приложение, которое должно записывать видео с помощью DirectShow - для этого я использую библиотеку взаимодействия DirectShowLib, которая, кажется, прекрасно работает.
Однако теперь мне нужно получить уведомление об обратном вызове, так как образцы записываются в файл, поэтому я могу добавить расширения блока данных. Согласно документации msdn, в C ++ это делается путем реализации интерфейса IAMWMBufferPassCallback и передачи полученного объекта в метод SetNotify интерфейса IAMWMBufferPass вывода.
Итак, я создал небольшой класс, который реализует интерфейс IAMWMBufferPassCallback из DirectShowLib:
class IAMWMBufferPassCallbackImpl : IAMWMBufferPassCallback
{
private RecordingPlayer player;
public IAMWMBufferPassCallbackImpl(RecordingPlayer player)
{
this.player = player;
}
public int Notify(INSSBuffer3 pNSSBuffer3, IPin pPin, long prtStart, long prtEnd)
{
if (player.bufferPin == pPin && !player.firstBufferHandled)
{
player.firstBufferHandled = true;
//do stuff with the buffer....
}
return 0;
}
}
Затем я получил интерфейс IAMWMBufferPass для требуемого вывода и передал экземпляр этого класса методу SetNotify:
bufferPassCallbackInterface = new IAMWMBufferPassCallbackImpl(this);
IAMWMBufferPass bPass = (IAMWMBufferPass)DSHelper.GetPin(pWMASFWriter, "Video Input 01");
hr = bPass.SetNotify(bufferPassCallbackInterface);
DsError.ThrowExceptionForHR(hr);
Не выдается исключение, указывающее, что метод SetNotify завершился успешно.
Теперь проблема в том, что метод Notify в моем объекте обратного вызова никогда не вызывается. Запись видео без проблем, за исключением того факта, что обратный вызов не выполняется вообще.
Это проблема с тем, как я делаю взаимодействие?