Media Foundation: ReadSample - исключение нарушения прав доступа - PullRequest
0 голосов
/ 01 мая 2018

Контекст: Я смотрю на эффекты понижающей дискретизации, а затем на выборочные видеофайлы. Я использую 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 and Debug, x86 и x64. Также попытался подавить JIT-оптимизацию в опциях Visual Studio.

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

1 Ответ

0 голосов
/ 02 мая 2018

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

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

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

...