Что нового

AviCap - Работа с AviCap32.dll (веб-камера)

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
AutoIt: 3.3.6.1+
Версия: 1.0 (11:04 19.10.2017)

Категория: Вспомогательные функции, Графика, Система, Окна и диалоги, Файловая система, Элементы GUI, Разное

Описание: Расширенные возможности при работе с веб-камерой. Библиотека работает со стандартной библиотекой "AviCap32.dll".
Поддерживаются следующие возможности:
• Создание "элемента" веб-камеры в Вашем окне;
• Создание и сохранения снимков;
• Запись видео в файл с веб-камеры (с возможностью записи аудио);
• Вызов диалогов настроек веб-камеры;
• Настройка записи видео;
• Подключение к конкретному драйверу веб-камеры, а также, вывод списко всех драйверов веб-камер;
• И др...

Код/Пример:
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "AviCap.au3"

Global $sAviFile=""

_AviCap_LoadDll()
	If @Error Then Exit MsgBox(16, @Error, "Ошибка _AviCap_LoadDll")


$hWnd = GUICreate("AviCap Test", 641, 564)
	GUISetBkColor(0xFFFFFF)

$hWebcamWnd = _AviCap_CapCreateCaptureWindow($hWnd, 0, 0, 640, 480, 1)

GUICtrlCreateLabel("Драйвер:", 12, 498, 52, 17)
$hDriver = GUICtrlCreateCombo("", 74, 495, 226, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
$hDriverConn = GUICtrlCreateButton("Подключить", 306, 493, 75, 25)
$hDriverDisconnect = GUICtrlCreateButton("Отключить", 390, 493, 75, 25)

$hCreateBmp = GUICtrlCreateButton("Сделать снимок", 522, 493, 107, 25)

$vVideoFileLabel = GUICtrlCreateLabel("Файл видео:", 12, 530, 421, 17)
$hVideoSel = GUICtrlCreateButton("...", 442, 530, 36, 25)
$hRecStart = GUICtrlCreateButton("Старт", 489, 530, 66, 25)
$hRecStop = GUICtrlCreateButton("Стоп", 565, 530, 66, 25)


Local $aDriversInfo, $i, $sData=""
$aDriversInfo = _AviCap_CapGetDriverDescription()
	If NOT @Error Then
	For $i = 1 To $aDriversInfo[0][0]
		If $sData = "" Then
		$sData = $aDriversInfo[$i][0]&": "&$aDriversInfo[$i][1]&" - "&$aDriversInfo[$i][2]
		Else
		$sData &= "|"&$aDriversInfo[$i][0]&": "&$aDriversInfo[$i][1]&" - "&$aDriversInfo[$i][2]
		EndIF
	Next
	EndIF
GUICtrlSetData($hDriver, $sData)

GUICtrlSetState($hDriverDisconnect, $GUI_DISABLE)
GUICtrlSetState($hCreateBmp, $GUI_DISABLE)
GUICtrlSetState($hRecStart, $GUI_DISABLE)
GUICtrlSetState($hRecStop, $GUI_DISABLE)


GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_AviCap_RecVideo_Stop($hWebcamWnd)
			_AviCap_CapDriverDisconnect($hWebcamWnd)
			_AviCap_DeleteCaptureWindow($hWebcamWnd)
			_AviCap_UnloadDll()
			Exit


		Case $hDriverConn
			$sData = GUICtrlRead($hDriver)
				If $sData = "" Then ContinueLoop
			GUICtrlSetState($hDriverConn, $GUI_DISABLE)
			$iDriverIndex = StringLeft($sData, 1)
			_AviCap_CapDriverConnect($hWebcamWnd, $iDriverIndex, 1, 10)
			GUICtrlSetState($hDriverDisconnect, $GUI_ENABLE)
			GUICtrlSetState($hCreateBmp, $GUI_ENABLE)
			$sAviFile = ""
			GUICtrlSetData($vVideoFileLabel, "Файл видео: "&$sAviFile)


		Case $hDriverDisconnect
			GUICtrlSetState($hDriverDisconnect, $GUI_DISABLE)
			GUICtrlSetState($hCreateBmp, $GUI_DISABLE)
			GUICtrlSetState($hRecStart, $GUI_DISABLE)
			GUICtrlSetState($hRecStop, $GUI_DISABLE)
			_AviCap_CapDriverDisconnect($hWebcamWnd)
			GUICtrlSetState($hDriverConn, $GUI_ENABLE)
			$sAviFile = ""
			GUICtrlSetData($vVideoFileLabel, "Файл видео: "&$sAviFile)


		Case $hCreateBmp
			$sOutFile = FileSaveDialog("Сохранить как", @ScriptDir, "Изображения (*.bmp;*.jpg)", 18, @HOUR&"-"&@MIN&"-"&@SEC&".bmp")
				If @Error Then ContinueLoop
			_AviCap_CapFileSaveDib($hWebcamWnd, $sOutFile)
				If @Error Then MsgBox(0+48, @Error, "Ошибка сохранения кадра", 2, $hWnd)


		Case $hVideoSel
			$sOutFile = FileSaveDialog("Сохранить как", @ScriptDir, "Видео (*.avi)", 18, @HOUR&"-"&@MIN&"-"&@SEC&".avi")
				If @Error Then ContinueLoop
			_AviCap_RecVideo_SetOutVideoFile($hWebcamWnd, $sOutFile)
				If @Error Then MsgBox(0+48, @Error, "Ошибка применения файла", 2, $hWnd)
			_AviCap_RecVideo_Config($hWebcamWnd, 1, 1, 0, 0)
				If @Error Then MsgBox(0+48, @Error, "Ошибка применения настроек", 2, $hWnd)
			$sAviFile = $sOutFile
			GUICtrlSetData($vVideoFileLabel, "Файл видео: "&$sAviFile)
			GUICtrlSetState($hRecStart, $GUI_ENABLE)


		Case $hRecStart
			If $sAviFile = "" Then ContinueLoop
			GUICtrlSetState($hRecStart, $GUI_DISABLE)
			_AviCap_RecVideo_Start($hWebcamWnd)
				If @Error Then
				MsgBox(0+48, @Error, "Ошибка начала записи", 2, $hWnd)
				GUICtrlSetState($hRecStart, $GUI_ENABLE)
				ContinueLoop
				EndIF
			GUICtrlSetState($hRecStop, $GUI_ENABLE)


		Case $hRecStop
			GUICtrlSetState($hRecStop, $GUI_DISABLE)
			_AviCap_RecVideo_Stop($hWebcamWnd)
				If @Error Then MsgBox(0+48, @Error, "Ошибка завершения записи", 2, $hWnd)
			GUICtrlSetState($hRecStart, $GUI_ENABLE)

	EndSwitch
WEnd

Файл: AviCap.zip

История версий:
1.0: 11:04 19.10.2017

Сисок функций:
Список функций:
• Запуск:
_AviCap_LoadDll()
$hWebcamWnd = _AviCap_CapCreateCaptureWindow($hWnd, $iPosX, $iPosY, $iWidth, $iHeight, $iWindowId=1)
_AviCap_CapDriverConnect($hWebcamWnd, $iDriverIndex=0, $fScale=1, $iUpdateMsec=1)
• Снимки
_AviCap_CapFileSaveDib($hWebcamWnd, $sOutFile)
_AviCap_RecVideo_SetOutVideoFile($hWebcamWnd, $sOutVideoFile)
_AviCap_RecVideo_Start($hWebcamWnd)
_AviCap_RecVideo_Stop($hWebcamWnd)
_AviCap_RecVideo_Config($hWebcamWnd, $fYield=0, $fCaptureAudio=1, $fAbortLeftMouse=1, $fAbortRightMouse=1)
• Другое
_AviCap_CapGetDriverDescription()
_AviCap_CapDlgVideoformat($hWebcamWnd)
_AviCap_CapDlgVideocompression($hWebcamWnd)
_AviCap_CapDlgVideosource($hWebcamWnd)
• Завершение
_AviCap_CapDriverDisconnect($hWebcamWnd)
_AviCap_DeleteCaptureWindow($hWebcamWnd)
_AviCap_UnloadDll()

Описание функций:
Описание функций:
• Запуск:
Загружает библиотеки avicap32.dll и user32.dll в память:
_AviCap_LoadDll
Создает элемент (дочернее окно) веб-камеры в указанном окне:
_AviCap_CapCreateCaptureWindow
Посылает сообщение о подключении драйвера веб-камеры:
_AviCap_CapDriverConnect
• Снимки
Сохраняет кадр камеры в указанный (.BMP; .JPG) файл:
_AviCap_CapFileSaveDib
Задает конечный видео (.AVI) файл, в который будет выполняться запись:
_AviCap_RecVideo_SetOutVideoFile
Начинает запись видео с веб-камеры в указанный:
_AviCap_RecVideo_Start
Остановить запись видео в файл:
_AviCap_RecVideo_Stop
Настраивает запись видео:
_AviCap_RecVideo_Config
• Другое
Возвращает 2D массив с информацией о драйверах веб-камеры:
_AviCap_CapGetDriverDescription()
Открывает диалог вибора настроек формата видео (разрешение и глубина цвета):
_AviCap_CapDlgVideoformat
Открывает диалог вибора настроек сжатия:
_AviCap_CapDlgVideocompression
Открывает диалог вибора источника видео:
_AviCap_CapDlgVideosource
• Завершение
Отключает драйвер веб-камеры:
_AviCap_CapDriverDisconnect
Удаляет ранее созданное окно (элемент) веб-камеры:
_AviCap_DeleteCaptureWindow
Выгружает библиотеки avicap32.dll и user32.dll:
_AviCap_UnloadDll

Комментарий автора:
Признаюсь, что эта UDF немного похожа на уже написанные UDFs "Webcam.au3", но в моей UDF больше возможностей. Также мой код является менее конфликтным (специфицеские имена глобальных переменных ($h_AviCap_Dll, $h_AviCap_Msg), в отличии от $avi, $user (которые можно увидеть в каждой 2-ой UDF); убраны константы; имеется обработка ошибок; скрипт не вылетает после выполнения функций по отключению веб-камеры и закрытию DLL; и др. мелкие "приятности" (см. описание функций).
О записи видео:
- Возможна запись только в формат .AVI (файл получается огромный, нужно придумывать конвертирование тем-же ffmpeg, например);
+ Имеется возможность не приостанавливать работу скрипта на время записи, отключить запись звука, отключить остановку записи при нажатии: Esc, ЛКМ, ПКМ (по умолчанию включено).
В общем, считаю, что моя UDF (на сегодняшний день) самая лучшая из всех имеющихся :smile:


Источник: autoit-script.ru, msdn.microsoft.com
Автор: Astel064
 

Вложения

  • AviCap.zip
    5.6 КБ · Просмотры: 31

kv68rab

Новичок
Сообщения
1
Репутация
0
Всё работает...! Но вот есть необходимость вставить информационный блока в виде времени в пред просмотр и сохраняемый файл... В MSDN описана данная возможность с помощью WM_CAP_FILE_SET_INFOCHUNK и структуры CAPINFOCHUNK, но реализовать данную возможность, что-то не получается... Есть идеи как это реализуется на AutoIT? Похожего ни чего найти не могу....
 

Ev3658

Новичок
Сообщения
1
Репутация
0
Спасибо! Мне как чайнику не удалось разобраться с первого раза, но рад что есть с чего начать!!!! :bye:
 
Верх