c # — Media Foundation: ReadSample — исключение нарушения прав доступа

Контекст: Я смотрю на эффекты сэмплирования, а затем сэмплирования видеофайлов. Я использую Media Foundation .NET, чтобы выставить MF в C #. Программа в настоящее время проходит следующий процесс:

  • Возьмите видео в высоком разрешении и читайте в каждом кадре (SourceReader & ReadSample)
  • Образец вниз с использованием пользовательского кода, который манипулирует на уровне байтов
  • Запишите записанные данные в новый видеофайл с низким разрешением (используя SinkWriter)
  • Повторите для ряда разрешений, поддерживаемых Media Foundation
  • Считайте отобранные видео обратно и увеличьте образец до следующего более высокого разрешения в списке ниже, снова используя пользовательский код, который манипулирует каждым байтом
  • Записать новые данные в файл с более высоким разрешением (снова используя SinkWriter)

Я использую следующие разрешения:

  • 2560,1440
  • 2346,1320
  • 2134,1200
  • 1920,1080
  • 1706.960
  • 1494.840
  • 1280.720
  • 1068.600
  • 854480
  • 640360
  • 428240
  • 214120

Текущая ситуация: Это работает почти в совершенстве. Я прошёл процесс сэмплирования и получил 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.

Есть идеи, где искать дальше?

0

Решение

Оказывается, это проблема интерфейса Media Foundation .NET, а не базовой инфраструктуры MF. Я построил небольшую тестовую программу на C ++, которая реализовала ключевые части кода, и она прошла нормально.

Не уверен, почему Media Foundation .NET вызывал проблемы, но решение было просто установить атрибут:
MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING
скорее, чем
MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING

При расширенной обработке он ведет себя правильно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]