Я написал свой собственный фильтр DirectShow RTSP Push Source (CBaseFilter), который работает на H264 как чудо! Но, когда я попытался поддержать MPEG4 (поток MP4V-ES), я наткнулся на проблему ... Мой поток декодируется (с фильтром ffdshow Video Decoder или DivX Video Decoder) и воспроизводится идеально в течение ровно 10 секунд. Изображение бегло со скоростью 15 кадров в секунду, но через 10 секунд резко падает частота кадров в секунду, и декодируются только IVOP, а PVOP / BVOP отбрасываются ... даже если я их получаю и вовремя отправляю их в декодер.
Затем я начал возиться с моим кодом и обнаружил, что правильно распаковываю полезную нагрузку MPEG4 RTP и отправляю образцы мультимедиа в декодер правильно, а также корректно освобождаю их, также CBaseOutputPin::DecideBufferSize()
выполняет свою работу так, как должно, и Я правильно называю IMediaSample::SetTime()
... НО, если я изменю этот код, который доставляет образец в декодер:
hr = videoPin->Deliver(sample);
sample->Release();
с этим кодом (обратите внимание на первую строку) :
videoPin->DeliverNewSegment(REFERENCE_TIME(start), REFERENCE_TIME(end), 1.0);
hr = videoPin->Deliver(sample);
sample->Release();
видео становится плавным через 10 секунд и более (fps остается на 15), но картинка все испорчена ... как будто IVOP не декодируется должным образом, и есть некоторые артефакты в статических частях сцены.
Итак, как мне использовать CBaseOutputPin :: DeliverNewSegment ()? И какого черта мне это нужно?
Потому что, я думаю, мне это нужно, так как это мешает моему видео потоку не декодироваться бегло ...
Я гуглил, но без удачи.
Любая помощь будет оценена. Thanx.
UPDATE
В методе videoPin->DeliverNewSegment(tStart, tStop, dRate)
параметр dRate равен:
Скорость обработки этого сегмента, в процентах от первоначальной ставки.
Так что если вместо 1.0
я поставлю 100.0
, поток будет течь так, как и должно быть, но с некоторой задержкой между кадрами. Но пока это лучшее!