Контекст: Я смотрю на эффекты сэмплирования, а затем сэмплирования видеофайлов. Я использую Media Foundation .NET, чтобы выставить MF в C #. Программа в настоящее время проходит следующий процесс:
Я использую следующие разрешения:
Текущая ситуация: Это работает почти в совершенстве. Я прошёл процесс сэмплирования и получил 11 видеофайлов с сэмплированием (по одному на каждое разрешение в списке выше), а также оригинальное видео 1440p. Затем я читаю в каждом из этих 11 видео и до образца. Это работает для 10 из них.
Эта проблема: когда я пытаюсь увеличить (1280,720) видео до (1494,840), я получаю:
System.AccessViolationException: ‘Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.
… когда я пытаюсь читать в первом кадре. Я не могу понять, почему. SourceReader настраивается нормально (по крайней мере, ошибки не возвращаются). Я делаю такие вещи, как Marshal.Copy, чтобы получить данные выборочного кадра в пространство управляемой памяти, что, как я изначально предполагал, было проблемой. Код не так далеко, только ошибки, как только я пытаюсь прочитать первый пример кадра. ReadSample находится в блоке Try … Catch, но исключение остается необработанным, поэтому никакая другая информация об ошибке не возвращается.
Я не хочу просто вставлять в бесполезный код, поэтому, пожалуйста, дайте мне знать, что полезно посмотреть, и я добавлю к вопросу. Большая часть кода была взята из учебных пособий по MS для SourceReader и SinkWriter. Также стоит помнить, что это работает в большинстве ситуаций, поэтому код не «сломан» как таковой.
Я пробовал компилировать в Release и Debug, x86 и x64. Также попытался подавить JIT-оптимизацию в опциях Visual Studio.
Есть идеи, где искать дальше?
Оказывается, это проблема интерфейса Media Foundation .NET, а не базовой инфраструктуры MF. Я построил небольшую тестовую программу на C ++, которая реализовала ключевые части кода, и она прошла нормально.
Не уверен, почему Media Foundation .NET вызывал проблемы, но решение было просто установить атрибут:
MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING
скорее, чем
MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING
При расширенной обработке он ведет себя правильно.
Других решений пока нет …