Я получаю поток H.264
с цифрового видеорегистратора, используя его SDK. Были утечки памяти, и я думал, что все утечки вызваны SDK. Но когда я записал поток и воспроизвел кадры один за другим, читая с диска (без участия сторонних dll), я заметил, что проблема не в dll, а в самом потоке.
Как ни странно, Декодер DivX H264
— единственный кодек, который не вызывает утечки памяти, но при длительном проигрывании потока иногда падает и декодер DivX. Я бы предпочел использовать Microsoft DTV-DVD Video Decoder
, но это приводит к огромным утечкам памяти и потере большого количества кадров. Многие другие декодеры H.264, которые я пробовал, ведут себя точно так же.
Я изучил кадры h.264
, используя некоторые парсеры h.264
, сравнив их с некоторыми другими безпроблемными потоками, но не заметил в логах ничего очевидного.
Поскольку моя проблема связана со структурой кадров h.264, я подготовил исходный фильтр с именем FramesFromFileSourceFilter
, который вы можете скачать ниже.
http://www.akaydin.com/directshow/FramesFromFileSourceFilter.zip
Это проект Visual Studio 2008
, и все зависимости включены в zip-файл в относительно расположенных папках (включая h 0,264 кадра). Итак, все, что вам нужно сделать, это скомпилировать проект, зарегистрировать вывод с помощью regsvr32.exe
и запустить фильтр с любым декодером h.264 из GraphEdit или GraphStudio. Примеры графиков ниже.
Также кадры h264 доступны в виде одного необработанного файла h264 по приведенной ниже ссылке, который можно воспроизвести с помощью VLC (с неправильным FPS, поскольку в оригинале было 12 FPS).
http://www.akaydin.com/directshow/stream.zip
Вопрос:
Что может быть причиной проблем с утечкой памяти во многих известных декодерах H264, кроме декодера DivX. Что не так с этим потоком?
Обновление 1
Поток чтения данных удален, а функции перемещены в FillBuffer без использования каких-либо буферов и флагов. Проблема остается той же.
http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate1.zip
Обновление 2
Обновление 1 использовало Sleep()
в FillBuffer()
, которая вызывал некоторые проблемы. Теперь я удалил Sleep()
и использовал SetTime()
, чтобы получить ~12 FPS. Это также решило Microsoft DTV-DVD Video Decoder
проблемы с пропуском кадров, но не решило проблемы с памятью.
http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate2.zip
Увеличение памяти происходит только для рабочего набора
. Virtual Bytes
и Private Bytes
кажутся стабильными. Что может быть причиной непрерывного увеличения памяти рабочего набора
, которое происходит только с видеодекодером Microsoft DTV-DVD
?