Неожиданная ошибка в работе архиватора aforge video directshow dll
У меня немного странная проблема, которую мне трудно отладить. Иногда я не могу закрыть свою программу, и она зависает, когда я пытаюсь закрыть ее.
Сделал большую программу для распознавания видеоизображений. Сделал специальную кнопку для закрытия камеры. Эта кнопка работает с этим, вызывая функцию ниже, и это действительно работает.
Обратите внимание, что исходное видео было начато так
Теперь моя проблема кажется (и это предположение, потому что я не могу отладить этот момент), что какой-то поток все еще активен, желая обновить основную форму данными. Однако, возможно, он не сможет этого сделать, поскольку он закрывается. Я думаю, что что-то подобное происходит, поэтому я написал в основной форме заявки
Однако с этим последним кодом у программы еще больше проблем с выходом.
Итак, есть ли способы перечислить подпотоки, а затем закрыть их один за другим, если нажать правый крест в верхнем углу, чтобы выйти из приложения?
Что ж, мне удалось отладить программу и, наконец, найти причину проблемы. Это немного странно, поскольку в качестве кнопки я мог остановить камеру с помощью функции exitcamera .
Однако внутри события a _formclosing та же процедура не работала, хотя она работала после того, как я выделил функцию waitforstop .
Я все еще немного смущен, почему это не сработает в случае закрытия. Но вроде бы этим решается.
Я пробовал какое-то решение, но ничего не работает. Я частично решил добавить сон потока после WaitForStop
Если я попытаюсь вызвать Stop, приложение зависнет
Это уничтожит вашу проблему (у меня была эта проблема, я пробовал)
Избегайте прямого взаимодействия с формой - надейтесь на лучшее решение, чем таймер, но решает проблему. я
Статический вспомогательный класс
В моей ситуации была нужна функция WaitForStop (), но выполнение кода внутри метода зависало. Я заменил его сразу после вызова SignalToStop () на:
Это код библиотеки AForge:
Изменить: это не исправило зависание в 100% случаев. Иногда вызов com-объекта (mediaControl.Stop ();) в методе WorkerThread () просто длился вечно.
Я занимался этой проблемой. Вот простой способ остановить камеру и закрыть Win Form.
Это помогло с другой проблемой, когда я хотел показать предварительный просмотр, щелкнуть кнопку «захватить», изменить разрешение камеры с низкого разрешения на высокое, захватить изображение, а затем вернуться к низкому разрешению для предварительного просмотра. Вот что сработало, хотя мне пришлось отказаться от этого, потому что остановка и запуск камеры сбрасывали автоматическую экспозицию, поэтому изображение на захваченном изображении было ужасным:
Возможно, у вас возникли проблемы с утечкой памяти, вызванные событием. Вы можете попробовать отключить событие при выходе из программы:
Файл aforge.video.directshow.dll из AForge является частью AForge NET. aforge.video.directshow.dll, расположенный в e: \Program Files \iSpy \iSpy \ с размером файла 32768.00 байт, версия файла 2.1.4.0, подпись 470BB14D03ADBD0FCF2E6A616223585B.
- Запустите приложение Asmwsoft Pc Optimizer.
- Потом из главного окна выберите пункт "Clean Junk Files".
- Когда появится новое окно, нажмите на кнопку "start" и дождитесь окончания поиска.
- потом нажмите на кнопку "Select All".
- нажмите на кнопку "start cleaning".
- Запустите приложение Asmwsoft Pc Optimizer.
- Потом из главного окна выберите пункт "Fix Registry problems".
- Нажмите на кнопку "select all" для проверки всех разделов реестра на наличие ошибок.
- 4. Нажмите на кнопку "Start" и подождите несколько минут в зависимости от размера файла реестра.
- После завершения поиска нажмите на кнопку "select all".
- Нажмите на кнопку "Fix selected".
P.S. Вам может потребоваться повторно выполнить эти шаги.
3- Настройка Windows для исправления критических ошибок aforge.video.directshow.dll:
- Нажмите правой кнопкой мыши на «Мой компьютер» на рабочем столе и выберите пункт «Свойства».
- В меню слева выберите " Advanced system settings".
- В разделе «Быстродействие» нажмите на кнопку «Параметры».
- Нажмите на вкладку "data Execution prevention".
- Выберите опцию " Turn on DEP for all programs and services . " .
- Нажмите на кнопку "add" и выберите файл aforge.video.directshow.dll, а затем нажмите на кнопку "open".
- Нажмите на кнопку "ok" и перезагрузите свой компьютер.
Всего голосов ( 181 ), 115 говорят, что не будут удалять, а 66 говорят, что удалят его с компьютера.
В этой статье помогают устранить проблему, из-за которой фильтр DirectShow не будет подключаться к фильтру ниже по течению после установки 2670838 на Windows 8 или Windows 7 SP1.
Оригинальная версия продукта: Windows 8, Windows 7
Исходный номер КБ: 2841589
Симптомы
Вы используете фильтр DirectShow, который не подключается к фильтру Windows 8 и Windows 7 SP1 после установки 2670838 . Перед установкой 2670838 КБ эта проблема не возникла на Windows 7 SP1.
При вызове функции возвращается значение CBasePin.ReceiveConnection VFW_E_INVALIDMEDIATYPE (0x80040200) .
Причина
В базовый класс DirectShow в Windows 8 добавлены новые проверки для типов видео Windows 8. Эти проверки могут отклонить неправильные или неизвестные типы мультимедиа. Эти проверки добавляются для защиты систем от переполнений буфера и эксплуатации перерасхода буфера.
Решение
Ниже приводится рекомендация, которая поможет убедиться, что код проходит новые проверки безопасности:
Проверка AM_MEDIA_TYPE структуры для недействительных значений. Эта структура описывает формат образца мультимедиа.
При вызове для выделения памяти для блока формата убедитесь, что вы проходите правильный размер, необходимый CMediaType.AllocFormatBuffer для блока формата.
этот метод обновляет и cbFormat pbFormat обновляет членов AM_MEDIA_TYPE structure .
Проверка BITMAPINFOHEADER структуры для недействительных значений.
biSize Убедитесь, что он равен sizeof(BITMAPINFOHEADER) .
Проверка biSizeImage на плохое значение (то есть > 0x40000000).
Проверка biClrUsed на плохое значение (то есть > 256).
Действия по воспроизведению проблемы с помощью GraphEdit
GraphEdit доступен в microsoft Windows комплекте разработки программного обеспечения (SDK).
Перейдите в папку Bin Windows SDK и запустите graphedt.exe.
В меню Graph вставьте фильтры. Диалоговое окно отображается со списком фильтров в системе, организованным по категории фильтров.
Найдите фильтр в соответствующей категории (в категории DirectShow Фильтры) и нажмите кнопку Вставить фильтр. Если фильтр не является исходным фильтром, убедитесь, что для него добавлен необходимый исходный фильтр.
Вставьте необходимый ниже по течению фильтр.
После добавленных фильтров можно подключить два фильтра, перетаскив мышь с выходного пин-кода одного фильтра на входной контакт другого фильтра. Если контакты принимают подключение, GraphEdit рисует стрелку, соединяющую их. Попробуйте это для фильтра с помощью фильтра ниже по течению. Увидите
Дополнительная информация
Термины, используемые в этой статье:
Переполнение буфера происходит, когда мы пытаемся поместить больше данных в буфер, чем было выделено. Переполнение буфера может использоваться для выполнения вредоносного кода в системе.
Перерасход буфера вызван обработкой неконтрантных внешних входных данных как надежных данных. Акт копирования этих данных с использованием таких операций, как , или , может создавать непредвиденные результаты, что позволяет CopyMemory strcat strcpy wcscpy системной коррупции.
Я сильно запутался. WinForms, использую библиотеку Afforge, их пространства имен - AForge.Video, AForge.Video.DirectShow, AForge.Controls и т. д. Используем control VideoSourcePlayer из библиотеки «Controls.dll». Ниже код:
В конструкторе формы был установлен обработчик:
Однако при запуске VideoSourcePlayer this.videoSourcePlayer.NewFrame - это событие не обрабатывается. Пожалуйста помогите. спасибо
Как я понял вам важно сохранять видеокадры в файлы, причем желательно обрабатывать несколько видеофайлов одновременно. Потому, в данном случае, пришлось отказаться от VideoSourcePlayer , он ведь может работать только с одним файлом за раз.
У меня получилась такая программулина
Вот такой класс для работы с этой библиотекой пришлось написать
Работа протестирована на файлах wmv , на avi почему-то вылезает ошибка, но я надеюсь, что вы далее сами поработайте и все наладите. Весь проект целиком можно скачать здесь.
На более мощном ПК не работает, на стареньком все отрабатывает
Если проблема проявляется только на отдельных машинах, вам нужно смотреть, что отличается на проблемной машине в конфигурации DirectShow. Видимо какой-то кодек вызывает проблему, генерируя поток неподходящего формата. AForge использует DirectShow, беглый просмотр исходников FileVideoSource показывает следующую методику построения графа:
Автоматически вставляется выбранный системой source filter (через AddSourceFilter )
Создается Sample Grabber, настроенный на формат видео MediaSubType.RGB24
Sample Grabber подцепляется к первому найденному видео-выходу source filter
Слабое место в этой схеме - явное указание MediaSubType . Насколько я знаю, если в видеопотоке SubType будет несовместимым с RGB24 (например YUY2), ошибки не выведется, но событие нового кадра никогда не вызовется. Поэтому работоспособность этого класса полностью зависит от того, какой формат будет генерировать декодер видео для конкретного файла на целевой машине.
Вы можете попробовать следующее:
Распространять вместе с программой кодеки, которые гарантированно выдают формат RGB для выходного потока видео, и настраивать их так, чтобы они автоматически выбирались системой (имели наивысший приоритет).
Читайте также: