Контекст: Я смотрю на эффекты понижающей дискретизации, а затем на выборочные видеофайлы. Я использую 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.
Есть идеи, где искать дальше?