нужно захватить видео с одной из камер в системе и сохранить. у меня возникла какаято путаница с либами. приложение упорно требует vfw32.dll. в system32 есть msvfw32, пробовал переименовать- без результатно
Всем привет! Подскажите кто знает, как быстро камеры переключать? В примере 2 кнопки, каждая должна включать свою камеру из двух установленных системе Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .data n1 db "C:\WINDOWS\system32\avicap32.dll",0 n2 db "камера1",0 n3 db "камера2",0 n4 db "VIDEOSOURCE",0 ButtonClassName db "button",0 ClassName db "SimpleWinClass",0 AppName db "oko",0 funcap db "capCreateCaptureWindowA",0 .data? hdll dd ? afun dd ? hCapWindow dd ? hInstance HINSTANCE ? CommandLine LPSTR ? hBut2 HWND ? hBut1 HWND ? hBut3 HWND ? .const ButID2 equ 2 ButID1 equ 1 ButID3 equ 3 .code start: invoke LoadLibrary, addr n1 mov hdll, eax invoke GetProcAddress, hdll, addr funcap mov afun, eax invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL, CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance invoke LoadIcon, NULL, IDI_EXCLAMATION mov wc.hIcon, eax invoke LoadCursor, NULL, IDC_ARROW mov wc.hCursor, eax mov wc.hIconSm,NULL mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke RegisterClassEx, addr wc invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_MINIMIZEBOX or WS_SYSMENU,0,0, 700 , 500 ,NULL,NULL,hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_COMMAND mov eax, wParam ;////////////////////////////////////////////////////////////////////////////////////// .IF ax==ButID1 shr eax,16 .IF ax==BN_CLICKED invoke Beep, 1111, 111 ; Гц, мс xor eax,eax .ENDIF .ENDIF ;------------------------------------------------------------------------------------------------------------- .IF ax==ButID2 shr eax,16 .IF ax==BN_CLICKED invoke Beep, 1144, 111 xor eax,eax .ENDIF .ENDIF ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ .IF ax==ButID3 shr eax,16 .IF ax==BN_CLICKED invoke SendMessage, hCapWindow, WM_CAP_DLG_VIDEOSOURCE, 0, 0 xor eax,eax .ENDIF .ENDIF .ENDIF .IF uMsg==WM_CREATE push 0 push hWnd push 500 push 500 push 0 push 0 push WS_VISIBLE or WS_CHILD push 0 call afun mov hCapWindow, eax invoke SendMessage, hCapWindow, WM_CAP_DRIVER_CONNECT, 0, 0 invoke SendMessage, hCapWindow, WM_CAP_SET_SCALE , 1, 0 invoke SendMessage, hCapWindow, WM_CAP_SET_PREVIEWRATE , 20, 0 invoke SendMessage, hCapWindow, WM_CAP_SET_PREVIEW , 1, 0 invoke ShowWindow, hCapWindow, SW_SHOW invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR n2,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,510, 22, 70, 25, hWnd, ButID1, hInstance, NULL mov hBut1, eax invoke ShowWindow, hBut1, SW_SHOW invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR n3,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,510, 66, 70, 25, hWnd, ButID2, hInstance, NULL mov hBut2, eax invoke ShowWindow, hBut2, SW_SHOW invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR n4,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,510, 111, 111, 25, hWnd, ButID3, hInstance, NULL mov hBut3, eax invoke ShowWindow, hBut3, SW_SHOW .ENDIF .IF uMsg==WM_DESTROY invoke SendMessage, hCapWindow, WM_CAP_DRIVER_DISCONNECT, 0, 0 invoke FreeLibrary, hdll call ExitProcess .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start
в мсдн приводится следующий пример кода для перечисления устройств захвата видео: Код (Text): Visual Basic Example to List Web Cam Sources to Listbox '---list all the various video sources--- Private Sub ListVideoSources() 'http://msdn.microsoft.com/en-us/library/dd756909%28VS.85%29.aspx 'The function retrieves the version description of the capture driver. Dim DriverName As String = Space(80) Dim DriverVersion As String = Space(80) For i As Integer = 0 To 9 If capGetDriverDescriptionA(i, DriverName, 80, _ DriverVersion, 80) Then lstVideoSources.Items.Add(DriverName.Trim) End If Next End Sub аналогичным кодом на масме я вывел список своих камер, получилось только одно устройство!!! а у меня установлены две (рабочие) камеры. отправкой сообщения WM_CAP_DRIVER_CONNECT с wParam = 0 удается подключить только одну камеру, если посылать wParam > 0 ничего не происходит. Может ктонибудь подскажет в чем тут дело и где выход из моей проблемы.
набросал программу для записи видео в файл, но она отказывается работать в W7, подскажите как ее настроить для работы в W7. исходник с программой приложены.
(Вряд ли я сейчас выневскую прогу посмотрю под осью BIRD.) Попробуйте для начала в свойствах режим совместимости настроить. PS: если кто знает как на BIRD(это китайская мобильная платформа) переключиться на вторую камеру не сочтите за труд написать лс
Наконец-то разобрался, пришлось активно заюзывать directshow. Вобще невероятно сложная штука этот директ %) Для упрощения работы накатал скромняцкую библиотеку " vcapture32.dll " и решил поделится, может кому пригодится. Главный ее плюс, в отличии от VFW, это превосходная поддерживаемость в Win Vista и 7.
ziral2088 есть. Данную дллку думаю немного доработать на выходных, до уровня функциональности vfw. Тогда и сорцы выложу