Передача образцов видео MPEG4 в декодер - Как использовать CBaseOutputPin :: DeliverNewSegment ()? - PullRequest
0 голосов
/ 21 июня 2011

Я написал свой собственный фильтр 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, поток будет течь так, как и должно быть, но с некоторой задержкой между кадрами. Но пока это лучшее!

1 Ответ

1 голос
/ 21 июня 2011

Я не уверен, что NewSegment вызывает проблемы, которые вы видите.NewSegment используется в тех случаях, когда данные, которые вы отправляете в одном пакете, пересекают время начала или время окончания и позволяют декодеру доставлять только до времени остановки.В этом случае вы можете вызвать NewSegment (0, MAX_LONGLONG, 1) один раз в начале потоковой передачи, и это должно быть хорошо.

Если вы видите проблемы, то, возможно, вам следует проверить задержку на выходе декодера (сравните метку временис текущим временем потока).

G

...