Как написать AVI из Callback, сохранить отзывчивость интерфейса и ждать завершения
Я должен использовать SDK камеры для микроскопа, который поставляется с примером приложения Windows Forms на C#. Функции SDK импортируются в приложение через DLLImport. В этом примере приложения отдельные кадры с камеры считываются из ОЗУ с помощью функции обратного вызова. Эта функция обратного вызова затем обновляет PictureBox для отображения живого изображения.
Однако для моего использования я хочу не только показывать кадры, но и записывать их. Я думаю, что самый простой способ сделать это с помощью SharpAvi. Однако я не знаю, как инициализировать AviWriter (очевидно, я не могу инициализировать его каждый раз, когда вызывается обратный вызов), а затем добавить отдельные кадры в поток из функции обратного вызова.
На данный момент я решил свою проблему с помощью другой функции, которая ожидает в отдельном потоке, чтобы общественный счетчик пошел вверх - сам счетчик обновляется в функции обратного вызова. Каждый раз, когда счетчик обновляется, эта функция затем также считывает фрейм из ОЗУ и добавляет его в AviWriterStream. В довершение всего я должен был сделать так, чтобы поток блокировал мой пользовательский интерфейс, используя
var resetEvent = new ManualResetEvent(false);
System.Threading.ThreadPool.QueueUserWorkItem(delegate
{
WriteAVI()
resetEvent.Set();
}, null);
resetEvent.WaitOne();
Это связано с тем, что мне нужно записать несколько видео в разных позициях XY - поэтому каждый раз, когда мой цикл for достигает новой позиции XY, запись запускается, и я должен убедиться, что переходить на следующую позицию только после записи на самом деле закончено.
Мой способ сделать это, очевидно, хакерская и очень плохая практика (я уже чувствую себя плохо, но просто не знаю лучше), и мне интересно, каким будет правильное решение. Пока это работает - просто заморозка пользовательского интерфейса действительно раздражает.
Изменить: Это, вероятно, два вопроса: 1) Как правильно записать кадры в AVI и 2) Как ждать завершения записи, не заставляя ее заморозить мой интерфейс