2015-08-28 2 views
1

Я использую Geraint Davies' MP4Demux для потоковой передачи некоторых ранее закодированных файлов mp4.Приложение DirectShow MP4Demux из памяти на IMediaControl :: Run

В прошлом исследовании я обнаружил, что MP4Demux выделяет память для всех атомов при загрузке. Для небольших файлов это работает нормально, но с использованием более крупного файла mp4 (около 1,2 ГБ) я получаю ошибку из памяти IMediaControl :: Run.

Одним из вариантов было бы переписать/отредактировать демультиплексор mp4, чтобы иметь пул/круговой буфер памяти и только читать фреймы по мере необходимости/запрашивать, но мне интересно, есть ли более простое решение, например. как-то увеличивая память, которую может использовать приложение DirectShow (хотя это 32-битное консольное приложение).

+0

Вы случайно попытались использовать [мою вилку] (https://github.com/roman380/gdcl.co.uk-mpeg4) демультиплексора? Я помню, что некоторые ассигнования там могут быть лучше. Мое предположение было бы в том, что у какого-то распределителя просто избыточное количество буферов или буферов слишком велико. Было бы целесообразно сначала проверить распределителей, чтобы увидеть, есть ли что-то очевидное для настройки/исправления. –

+0

Hi @RomanR., Нет, я использовал последний выпуск Geraint's. Я добавил несколько журналов, где была выделена память для атомов, и обнаружил, что все память была выделена в начале (IIRC при загрузке фильтра), но ошибка из памяти появляется только в IMediaControl :: Run. Освобождение IIRC произошло только при разгрузке фильтра. В этом случае, я не думаю, что распределители DirectShow вообще вступают в игру? – Ralf

+0

Регулярное распределение происходит при остановленном -> приостановленном переходе, который может быть частью вызова «Выполнить». Тогда проблемное место могло просто выделить много, но не смертельно слишком много. Тогда дальнейшее «нормальное» распределение памяти, такое как декодер H.264, которое также нуждается в некоторой ОЗУ, терпит неудачу и приведет к ошибке. Моя точка зрения заключается в том, что распределители очевидны для проверки. –

ответ

2

Типичные потребители памяти в графах - распределители памяти. Исходя из основных причин, иногда распределение чрезмерно: слишком много буферов и/или слишком больших буферов. Распределение обычно происходит при переходе с остановленным на паузу, который может быть частью вызова Run (он фактически является частью вызова Pause, но если вы вызываете Run во время остановки, есть неявный Pause звонок).

Независимо от причины, распределители в первую очередь проверяют: приостанавливать график и обрабатывать частные байты, обрабатывать потребление виртуальных адресов, свойства распределителя (GraphStudioNext и DirectShowSpy должны быть в состоянии сделать это) и проверить, или он слишком много захватывает.

Иногда это просто может привести к тому, что процесс слишком близок к пределу виртуального адресного пространства, а сбой не является немедленным, но давление памяти заставляет что-то еще сбой вскоре после этого.

Смежные вопросы