Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 56
MASM

Подключиться к web-камере и сохранить от неё снимок

10.03.2020, 00:53. Показов 3386. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я начинающий в ассемблере, поэтому прошу понять и простить. Я честно перерыл весь интернет и уже голову сломал, но так и не нашел решения проблемы. Суть проста - хочу сделать программу на масме, которая при запуске делает фото с веб-камеры и сохраняет его на диске. И всё, вроде, ничего сложного. У меня получилось подключиться к веб-камере (загорается индикатор), но файл не сохраняется. Более того, когда я построчно прогоняю программу в ollydbg, то у меня она уходит в бесконечную загрузку (running) на последнем SendMessage (который должен отключать камеру). Очень надеюсь на помощь знающий людей! Спасибо!
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
.386
.model flat,stdcall
 
;include ..\INCLUDE\kernel32.inc 
;include ..\INCLUDE\user32.inc 
;includelib ..\LIB\kernel32.lib 
;includelib ..\LIB\user32.lib
 
include ..\INCLUDE\masm32rt.inc
include ..\INCLUDE\avicap32.inc
includelib ..\LIB\avicap32.lib
 
;include ..\INCLUDE\vfw32.inc
includelib ..\LIB\vfw32.lib
 
.const
 
WM_CAP_DRIVER_CONNECT       equ WM_USER + 10
WM_CAP_DRIVER_DISCONNECT    equ WM_USER + 11
WM_CAP_FILE_SAVEDIB         equ WM_USER + 25
 
.data
 
title1 db "webcam",0                ;название окна
device dd 0                 ;номер устройства камеры (0-9)
file1 db "AAA.bmp",0                ;название результирующего файла
 
 
.code
start:
 
 
 
 
invoke capCreateCaptureWindow,0,0,0,0,0,0,HWND_DESKTOP,0    
mov ebx,eax
 
  
mov [device],0
@@:
invoke SendMessage,ebx,WM_CAP_DRIVER_CONNECT,[device],0
cmp eax,TRUE
je @f
inc [device]
cmp [device],9
jbe @b
invoke DestroyWindow,ebx
jmp exit1
@@:
invoke SendMessage,ebx,WM_CAP_FILE_SAVEDIB,0,[file1]
invoke SendMessage,ebx,WM_CAP_DRIVER_DISCONNECT,[device],0
invoke DestroyWindow,ebx
 
exit1:
invoke ExitProcess,0
 
end start
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2020, 00:53
Ответы с готовыми решениями:

Как подключиться к Web камере?
Всем привет! Народ подскажите плиз, как подключиться к web камере? Есть примеры, но у меня на такой код выдает ошибку неопознанная...

Как получить доступ к веб-камере и сделать снимок
Как получить доступ к веб камере (сделать снимок)? Может быть есть готовый контрол?

Обращение к Web-камере пользователя в Web-Application.
У пользователей Web-аппликации (которую мы разрабатываем) имеются Web-камеры. Пользователь нажимает какую-то кнопку в Аппликации и она...

13
1 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 56
10.03.2020, 11:25  [ТС]
UPD:
У меня всё-таки получилось создать файл, проблема была в том, что передавался в функцию не адрес 'переменной', а она сама. Однако теперь появилась новая проблема - файл создается пустой (0 байт), соответственно ничем не открывается. В чем может быть проблема, может кто-нибудь сможет подсказать?

Новый код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
.386
.model flat,stdcall
 
include ..\INCLUDE\kernel32.inc 
include ..\INCLUDE\user32.inc 
includelib ..\LIB\kernel32.lib 
includelib ..\LIB\user32.lib
 
include ..\INCLUDE\masm32rt.inc
include ..\INCLUDE\avicap32.inc
includelib ..\LIB\avicap32.lib
 
;include ..\INCLUDE\vfw32.inc
includelib ..\LIB\vfw32.lib
 
.const
 
WM_CAP_DRIVER_CONNECT       equ WM_USER + 10
WM_CAP_DRIVER_DISCONNECT    equ WM_USER + 11
WM_CAP_FILE_SAVEDIB         equ WM_USER + 25
 
.data
 
file1           db 'AAA.bmp',0
title1 db 'webcam',0                ;название окна
device dd 0                 ;номер устройства камеры (0-9)
                ;название результирующего файла
 
 
.code
start:
 
;---------------------------------------------------------------------------------------------
 
 
 
invoke capCreateCaptureWindow,0,0,0,0,0,0,HWND_DESKTOP,0
mov ebx,eax
 
  
mov [device],0
@@:
invoke SendMessage,ebx,WM_CAP_DRIVER_CONNECT,[device],0
cmp eax,TRUE
je @f
inc [device]
cmp [device],9
jbe @b
invoke DestroyWindow,ebx
jmp exit1
@@:
invoke SendMessage,ebx,WM_CAP_FILE_SAVEDIB,0,ADDR file1
invoke SendMessage,ebx,WM_CAP_DRIVER_DISCONNECT,ADDR title1,0
invoke DestroyWindow,ebx
 
exit1:
invoke ExitProcess,0
 
end start
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
10.03.2020, 11:52
Цитата Сообщение от klaustrofob Посмотреть сообщение
передавался в функцию не адрес 'переменной', а она сама
В какую функцию и какая переменная?
0
1 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 56
10.03.2020, 13:24  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
В какую функцию и какая переменная?
Вот эта строчка:
До:
Assembler
1
invoke SendMessage,ebx,WM_CAP_FILE_SAVEDIB,0,[file1]
После:
Assembler
1
invoke SendMessage,ebx,WM_CAP_FILE_SAVEDIB,0,ADDR file1
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
10.03.2020, 13:46
А с чего вы решили, что там передаётся не адрес, а содержимое?
Адрес там и передаётся.
Что возвращается функцией SendMessage? TRUE или FALSE?

Может, проблема в чём-то другом?
Например, камера не успевает запуститься или ещё что-то.
Надо смотреть маны по работе с камерой.
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
10.03.2020, 17:55
Попробовал на FASM
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
format PE GUI
include 'win32wx.inc'
WM_CAP_DRIVER_CONNECT   =WM_USER + 10
WM_CAP_DRIVER_DISCONNECT=WM_USER + 11
WM_CAP_FILE_SAVEDIB     =WM_USER + 25
 
section '' code readable executable
entry $
  invoke capCreateCaptureWindowA,0,WS_DISABLED,0,0,0,0,0,0
  mov    ebx,eax
  xor    ebp,ebp
  scan:invoke SendMessageA,ebx,WM_CAP_DRIVER_CONNECT,ebp,0
       test   eax,eax
       je @f
         invoke SendMessageA,ebx,WM_CAP_FILE_SAVEDIB,0,filename
         invoke ExitProcess,0
       @@:
       inc   ebp
       cmp   ebp,10
  jne scan
  invoke ExitProcess,0
 
filename db 'B:\1.bmp',0
 
section '' import data readable writeable
  library Avicap32,'Avicap32.dll',\
          user32,'user32.dll',\
          kernel32,'kernel32.dll'
  import Avicap32,\
         capCreateCaptureWindowA,'capCreateCaptureWindowA'
  import user32,\
         SendMessageA,'SendMessageA'
  import kernel32,\
         ExitProcess,'ExitProcess'

Под отладчиком работает нормально. При запуске без отладчика выдаёт такое окно и не создаёт файл

Вот такой эффект наблюдателя
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
10.03.2020, 20:40
Предлагаю почитать вот эти ветки, к примеру:
Как получить доступ к веб-камере и сделать снимок
Как получить изображение с веб-камеры
0
1 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 56
11.03.2020, 01:50  [ТС]
UPD#2:
Ситуация становится всё более интересной - я решил поискать подобные программы на масме (и фасме), и в итоге понял, что все они создают пустой файл bmp. Это наводит на логичную мысль - может, дело в моей системе, а не в программе? Более того, как ни странно, у меня спокойно получается записать видео с камеры! Ниже привожу обновленный код, который успешно записывает видео в .avi, но все ещё создает пустой .bmp
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
.386
.model flat,stdcall
 
include ..\INCLUDE\kernel32.inc 
include ..\INCLUDE\user32.inc 
includelib ..\LIB\kernel32.lib 
includelib ..\LIB\user32.lib
 
include ..\INCLUDE\masm32rt.inc
include ..\INCLUDE\avicap32.inc
includelib ..\LIB\avicap32.lib
 
;include ..\INCLUDE\vfw32.inc
includelib ..\LIB\vfw32.lib
 
CAPTUREPARMS STRUCT
            dwRequestMicroSecPerFrame  DWORD  ?      ; Requested capture rate
            fMakeUserHitOKToCapture    DWORD  ?      ; Show "Hit OK to cap" dlg?
            wPercentDropForError       DWORD  ?      ; Give error msg if > (10%)
            fYield                     DWORD  ?      ; Capture via background task?
            dwIndexSize                DWORD  ?      ; Max index size in frames (32K)
            wChunkGranularity          DWORD  ?      ; Junk chunk granularity (2K)
            fUsingDOSMemory            DWORD  ?      ; Use DOS buffers?
            wNumVideoRequested         DWORD  ?      ; # video buffers, If 0, autocalc
            fCaptureAudio              DWORD  ?      ; Capture audio?
            wNumAudioRequested         DWORD  ?      ; # audio buffers, If 0, autocalc
            vKeyAbort                  DWORD  ?      ; Virtual key causing abort
            fAbortLeftMouse            DWORD  ?      ; Abort on left mouse?
            fAbortRightMouse           DWORD  ?      ; Abort on right mouse?
            fLimitEnabled              DWORD  ?      ; Use wTimeLimit?
            wTimeLimit                 DWORD  ?      ; Seconds to capture
            fMCIControl                DWORD  ?      ; Use MCI video source?
            fStepMCIDevice             DWORD  ?      ; Step MCI device?
            dwMCIStartTime             DWORD  ?      ; Time to start in MS
            dwMCIStopTime              DWORD  ?      ; Time to stop in MS
            fStepCaptureAt2x           DWORD  ?      ; Perform spatial averaging 2x
            wStepCaptureAverageFrames  DWORD  ?      ; Temporal average n Frames
            dwAudioBufferSize          DWORD  ?      ; Size of audio bufs (0 = default)
            fDisableWriteCache         DWORD  ?      ; Attempt to disable write cache
            AVStreamMaster             DWORD  ?      ; Which stream controls length?
        CAPTUREPARMS ENDS
 
.const
 
WM_CAP_DRIVER_CONNECT       equ WM_USER + 10
WM_CAP_DRIVER_DISCONNECT    equ WM_USER + 11
WM_CAP_FILE_SAVEDIB         equ WM_USER + 25
;WM_CAP_SET_PREVIEW         equ WM_CAP_START + 50
 
.data
 
file1           db 'AAA.bmp',0
title1 db 'webcam',0                ;название окна
device dd 0                 ;номер устройства камеры (0-9)
kek db "AAA.avi",0              ;название результирующего файла
CaptureParms   CAPTUREPARMS <>
 
.code
start:
 
;---------------------------------------------------------------------------------------------
 
 
 
invoke capCreateCaptureWindow,0,0,0,0,0,0,HWND_DESKTOP,0    
mov ebx,eax
 
  
mov [device],0
@@:
invoke SendMessage,ebx,WM_CAP_DRIVER_CONNECT,[device],0
cmp eax,TRUE
je @f
inc [device]
cmp [device],9
jbe @b
invoke DestroyWindow,ebx
jmp exit1
@@:
        invoke SendMessage,ebx,WM_CAP_SET_SCALE,TRUE,0
            invoke SendMessage,ebx,WM_CAP_SET_PREVIEW,TRUE,0
            invoke SendMessage,ebx,WM_CAP_SET_PREVIEWRATE,10,0
invoke SendMessage,ebx,WM_CAP_FILE_SAVEDIB,0,ADDR file1
        invoke SendMessage,ebx,WM_CAP_FILE_SET_CAPTURE_FILE,0,ADDR kek
        invoke SendMessage,ebx,WM_CAP_GET_SEQUENCE_SETUP,sizeof CaptureParms,ADDR CaptureParms
        mov CaptureParms.fCaptureAudio,TRUE
        mov CaptureParms.fLimitEnabled,TRUE
                        mov CaptureParms.wTimeLimit,10
        invoke SendMessage,ebx,WM_CAP_SET_SEQUENCE_SETUP,sizeof CaptureParms,ADDR CaptureParms
        invoke SendMessage,ebx,WM_CAP_SEQUENCE,0,0
invoke SendMessage,ebx,WM_CAP_DRIVER_DISCONNECT,ADDR title1,0
invoke DestroyWindow,ebx
 
exit1:
invoke ExitProcess,0
 
end start
P.S.
У меня ноутук Acer Predator. Соответственно, веб-камера встроенная. ОС - Win 10. Есть у кого-нибудь идеи, на счет того, что камера записывает видео, но фото делать не хочет?

Добавлено через 19 минут
Цитата Сообщение от Jin X Посмотреть сообщение
А с чего вы решили, что там передаётся не адрес, а содержимое?
Адрес там и передаётся.
Что возвращается функцией SendMessage? TRUE или FALSE?

Может, проблема в чём-то другом?
Например, камера не успевает запуститься или ещё что-то.
Надо смотреть маны по работе с камерой.
Только что посмотрел в ollydbg. Действительно, возвращает False (0) с ошибкой "ERROR_INVALID_HANDLE" - результат выполнения строчки:
Assembler
1
invoke SendMessage,ebx,WM_CAP_FILE_SAVEDIB,0,ADDR file1
Добавлено через 25 минут
Самое странное, что у меня во все SendMessage'ы передается ebx - одно и то же значение. Я проверил в отладчике - так и есть, но, почему-то, масм жалуется на то, что неправильный хэндлер. Спецификацию функции читал - ничего противоречащего моему коду не нашел.
0
1 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 56
11.03.2020, 02:15  [ТС]
Код возвращаемой ошибки, на сколько я понимаю - 6.
Скрин отладчика прикрепляю (состояние программы на момент выполнения той самой строчки)
Изображения
 
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
11.03.2020, 12:07
klaustrofob, ERROR_INVALID_HANDLE – это не результат работы SendMessage, как понимаю, а результат работы обработчика сообщения. Т.е. он (обработчик) что-то делает и получается в процессу эту ошибку. Она может быть не связана с хендлом в ebx, а связана с чем-то другим, что происходит внутри обработчика.
1
1 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 56
11.03.2020, 12:08  [ТС]
UPD:
Что ж, сейчас я окончательно понял, что проблема в встроенной веб-камере. Ради эксперимента я подключил usb-вебку, и что вы думаете? Программа прекрасно работает, делает фото и записывает видео. Но я всё равно не понимаю что за магия происходит со встроенной камерой, почему она не делает фото масму и как это исправить.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
11.03.2020, 12:11
У вас проблема не ассемблеровская и не низкоуровневая, поэтому рекомендую задать вопрос в каком-нибудь WinAPI-шном подразделе, скажем, в C++ или т.п. Там проходимость больше.

Добавлено через 1 минуту
А, ну если проблема с камерой, тогда не знаю, что сказать.

Добавлено через 20 секунд
На другом компе попробуйте.
Я даже сейчас протестить не могу, у меня вообще нет камеры
1
1 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 56
11.03.2020, 12:13  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
У вас проблема не ассемблеровская и не низкоуровневая, поэтому рекомендую задать вопрос в каком-нибудь WinAPI-шном подразделе, скажем, в C++ или т.п. Там проходимость больше.

Добавлено через 1 минуту
А, ну если проблема с камерой, тогда не знаю, что сказать.

Добавлено через 20 секунд
На другом компе попробуйте.
Я даже сейчас протестить не могу, у меня вообще нет камеры
Да, спасибо большое за советы. Пожалуй, так и сделаю!
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
12.03.2020, 17:05
Попробуй этот пример - https://flatassembler.net/examples/fasmcam.zip
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2020, 17:05
Помогаю со студенческими работами здесь

Нужно подключиться к камере
Учусь я на программиста только пол года, и по этому достаточных знаний в этой области не имею, прошу всех более опытных дать какую-то инфу...

Подключиться к камере из другой подсети
Добрый день, возникла проблема, имеется сеть в которой находиться компьютер, шлюз и ip-камера. Не удаётся подключиться к камере т.к. по...

Подключиться к камере SOAP (стандарт ONVIF)
Здравствуйте. Суть: необходимо подключиться к камере через SOAP, поддерживающей стандарт ONVIF 1.02 средствами PHP. Необходимо...

Как подключиться к камере используя ONVIF gSOAP?
Доброго времени суток! Если кто работал с протоколом ONVIF покажите пожалуйста простейший пример например вывод информации о камере, и если...

Как подключиться к домашней веб-камере через интернет
Приветствую всех форумчан и прошу помочь советом в одном деле. Есть желание подключиться через интернет к собственной домашней...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru