Последние записи
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
27th
Окт
Удаленное управление веб камерой. Видеозахват методами DirectShow и через AVICAP
Posted by admin under Delphi, Win Api, Железо
raxp:
хоть тема называется управление, но вижу затык с получением картинки… итак:
1) включить, то бишь получить-сграбить картинку с локальной камеры (usb подключение) можно через функции (универсальный подход к работе с драйвером камеры) AVICAP32.dll (cистемная)
Код:
var
DC : HDC;
Bt : BITMAPINFO;
h_wnd : HWND;
h_cam : HWND;
//== Получение и обработка кадра
function FrameCallback(hWnd: HWND; lpVHdr: PVIDEOHDR): DWORD; stdcall;
type
TByteArray = array [0..1] of Byte;
PByteArray = ^TByteArray;
var
i, j : Integer;
sum : Single;
status : TCapStatus;
str : string;
begin
Result := 0;
// информация о изображении
SendMessage(h_cam, WM_CAP_GET_STATUS, SizeOf(status), Integer(@status));
// проверка на корректность формата изображения
if (status.uiImageWidth > 640) or (status.uiImageHeight > 480) or
(lpVhdr^.dwBytesUsed div (status.uiImageWidth * status.uiImageHeight) <> 3) then
begin
TextOut(DC, 0, 0, 'Размер изображения не должен превышать 640х480 пикселей', 55);
TextOut(DC, 0, 18, 'Изображение должно быть 24 битным', 33);
Exit;
end;
// вывод результата в окно
bt.bmiHeader.biWidth := status.uiImageWidth;
bt.bmiHeader.biHeight := status.uiImageHeight;
StretchDIBits(DC, 0, 0, 640, 480, 0, 0, status.uiImageWidth, status.uiImageHeight, lpVHdr.lpData, bt, 0, SRCCOPY);
end;
// настройка подключения-
DC := GetDC(h_wnd);
if SendMessage(h_cam, WM_CAP_DRIVER_CONNECT, 0, 0) <> 0 then
begin
SendMessage(h_cam, WM_CAP_GET_VIDEOFORMAT, SizeOf(Bt), LongInt(@Bt));
Bt.bmiHeader.biWidth := 320;
Bt.bmiHeader.biHeight := 240;
Bt.bmiHeader.biSize := SizeOf(Bt.bmiHeader);
Bt.bmiHeader.biPlanes := 1;
Bt.bmiHeader.biBitCount := 24;
SendMessage(h_cam, WM_CAP_SET_VIDEOFORMAT, SizeOf(Bt), LongInt(@Bt));
SendMessage(h_cam, WM_CAP_SET_CALLBACK_FRAME, 0, Integer(@FrameCallback));
...
// получить кадр, например по таймеру
//SendMessage(h_cam, WM_CAP_GRAB_FRAME, 0, 0);
(модуль с хэдерами прилагаю, передать по сети проблем не составит, можно реализовать сервером, а с нета например браузером смотреть)
…кроме того есть готовый компонент для работы через эту dll — TJLCVideo/ В нем реализовано получение и аудиопотока
(тоже прилагаю)
2) как получить картинку с (подключиться к) ip камеры через инет тоже прилагаю материал http://raxp.radioliga.com/cnt/s.php?p=mw.pdf
(список ресурсов в статье)
пример тестовой утилиты, нажать F12 для просмотра локальной USB (во вложении)
…загрузка картинки с нета любым http клиентом, хоть с indy- набора. пример:
//=== закачка ===
procedure Tvid.HttpCli1DocBegin(Sender: TObject);
begin
FileName:= '\' + HttpCli1.DocName;
if HttpCli1.ContentType = 'image/gif' then ReplaceExt(FileName, 'gif')
else if HttpCli1.ContentType = 'image/jpeg' then ReplaceExt(FileName, 'jpg')
else if HttpCli1.ContentType = 'image/bmp' then ReplaceExt(FileName, 'bmp');
//
if HttpCli1.ContentType <> 'text/html' then
try HttpCli1.RcvdStream := TFileStream.Create(FileName, fmCreate)
except end
end;
procedure Tvid.HttpCli1DocEnd(Sender: TObject);
begin
if HttpCli1.RcvdStream <> nil then begin
HttpCli1.RcvdStream.Free;
HttpCli1.RcvdStream:= nil;
end
end;
в данном случае (ip) камера сама выступает сервером
3) если вы хотите передавать видео и у вас потоковая камера
…лучше использовать AsfWriter из набора dspack, доступ через интерфейс IWMWriterSink… пример передачи:
AsfWriter1.WriterNetworkSink.SetNetworkProtocol(WMT_PROTOCOL_HTTP);
AsfWriter1.WriterNetworkSink.SetMaximumClients(10);
AsfWriter1.WriterNetworkSink.Open(номер порта);
AsfWriter1.WriterAdvanced2.AddSink(AsfWriter1.WriterNetworkSink);
AsfWriter1.WriterAdvanced2.SetLiveSource(True)
…это годится только если стандарт и интерфейс у камеры не какой-нибудь собственный (прокатывают потоковые камеры от axic)
…для просмотра можно импортировать — AxisCamControl activex (там же есть и управление)
Пост написан при поддержке компании SONY. купить видеокамеру SONY на официальном сайте в фирменном интернет-магазине.
Тема на форуме от 2006 года с ответом от 2009 года.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)