Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) captura de video avicap32.dll


MICHELI_MARTINS

Pergunta

boa tarde.

pessoal ate então tinha um sistema em delphi 2007 que funcionava certinho. porem passei para delphi 2010 e a captura de video não esta salvando o bmp.

o codigo:

SendMessage(CaptureWindow, WM_CAP_FILE_SAVEDIB, 0, longint(char(path + 'tmp.bmp')));

o problema é que no delphi 2010 não aceita char acusa erro de invalid typecast, tentei mudar para pchar mas não grava.

alguém tem alguma ideia?

Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0
ate então tinha um sistema em delphi 2007 que funcionava certinho. porem passei para delphi 2010 e a captura de video não esta salvando o bmp.

voce instalou o componente no delphi 2010 ?

Essa função funciona corretamente no delphi 2010

function capFileSetCaptureFile(hwnd:THandle; szName:LongInt):LongInt; 
begin 
Result := SendMessage(hwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, szName); 
end;

código completo de um controle para webcam

http://www.delphiturkiye.com/offline/2/10232.html

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

bom ate onde eu vi não precisa instalar compenente. eu estou usando essa funçao aqui:

function capCreateCaptureWindowA(lpszWindowName : PCHAR; dwStyle : longint; x : integer;

y : integer;nWidth : integer;nHeight : integer;ParentWin : HWND; nId : integer): HWND; STDCALL EXTERNAL 'AVICAP32.DLL';

que usa a dll externa avicap32.dll

a captura da cam funciona mostra certinho então acho que todas as declarações foram feitas. ela so não esta salvando a imagem em bmp.

faço assim:

if CaptureWindow <> 0 then

exit;

CaptureWindow:= capCreateCaptureWindowA('CAPTURA CAM',WS_CHILD or WS_VISIBLE ,panel5.Left,panel5.Top,395,350,panel5.Handle,0);

if CaptureWindow <> 0 then

begin

SendMessage(CaptureWindow, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);

SendMessage(CaptureWindow, WM_CAP_SET_CALLBACK_ERROR, 0, 0);

SendMessage(CaptureWindow, WM_CAP_SET_CALLBACK_STATUS, 0, 0);

SendMessage(CaptureWindow, WM_CAP_DRIVER_CONNECT, 0, 0);

SendMessage(CaptureWindow, WM_CAP_SET_SCALE, 1, 0);

SendMessage(CaptureWindow, WM_CAP_SET_PREVIEWRATE, 66, 0);

SendMessage(CaptureWindow, WM_CAP_SET_OVERLAY, 1, 0);

SendMessage(CaptureWindow, WM_CAP_SET_PREVIEW, 1, 0);

até aqui ta ok.

problema é aqui:

SendMessage(CaptureWindow, WM_CAP_GRAB_FRAME, 0, 0);

SendMessage(CaptureWindow, WM_CAP_FILE_SAVEDIB, 0, longint(PAnsichar(path + 'tmp.bmp')));

SendMessage(CaptureWindow, WM_CAP_DRIVER_DISCONNECT, 0, 0);

Link para o comentário
Compartilhar em outros sites

  • 0
incompatible types integer and pwidechar.

ok... a função dentro da dll é esta

function capFileSaveDIB(Handle: HWND; szName: PChar): integer;
begin
Result := sendmessage(handle, WM_CAP_FILE_SAVEDIB, 0, integer(szName));
end;

portanto ao chamar a função, temos:

SendMessage(CaptureWindow, WM_CAP_FILE_SAVEDIB, 0, longint(PAnsichar('c:\temp\sample.bmp')),1);

OBS: o erro é de conversão de tipos .... eu uso o componente DSPack para capturar imagem da webcam

de qualquer modo veja: {PASCAL INTERFACE for AVICAP32 DLL}

http://hi.baidu.com/sunlovestar/blog/item/...4779f05575.html

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

na verdade a linha fica assim:

SendMessage(CaptureWindow, WM_CAP_FILE_SAVEDIB, 0, longint(PAnsichar('c:\temp\sample.bmp'))); -- tirei o 1 do final.

Aqui ele grava certo, desde que as opçoes de segurança da maquina permitam.

o problema (acredito eu) vem do pansichar com o meu path (que é d:\) não sei porque.

se eu colocar direto SendMessage(CaptureWindow, WM_CAP_FILE_SAVEDIB, 0, longint(PAnsichar('d:\sample.bmp'))); ele grava

agora se eu coloco

SendMessage(CaptureWindow, WM_CAP_FILE_SAVEDIB, 0, longint(PAnsichar(path + 'sample.bmp'))); não grava, isso considerando meu path como d:\

é esse o problema so não sei como resolver tanto que esse codigo no 2007 funcionava, mas ao invés de pansichar era so char.

Link para o comentário
Compartilhar em outros sites

  • 0

se eu colocar direto SendMessage(CaptureWindow, WM_CAP_FILE_SAVEDIB, 0, longint(PAnsichar('d:\sample.bmp'))); ele grava

então tente assim:

SendMessage(CaptureWindow, WM_CAP_FILE_SAVEDIB, 0, longint(PAnsichar(path) + PAnsichar('\sample.bmp')));

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

p:= 'd:\sample.bmp';

SendMessage(CaptureWindow, WM_CAP_SAVEDIB, 0, longint(pansichar(p)));

tb não funcionou. não entendo porque ele interpreta diferente, afinal é o mesmo caminho de SendMessage(CaptureWindow, WM_CAP_SAVEDIB, 0, longint(pansichar('d:\sample.bmp')));

não queria ter que colocar fixo......

Link para o comentário
Compartilhar em outros sites

  • 0
Deu certo!!!

agora tem como você me explicar a magica?

Obrigada viu?

ajudo no que posso ... rs

O tipo AnsiString é usado para concatenar sucessões de carácteres, como orações ou sentenças.

Cada carácter é um AnsiChar, que tem 8 bits de tamanho.

Um AnsiString pode concatenar qualquer número de carácteres, só restringido pelo tamanho da memória.

Essa é uma mudança feita a partir do delphi 2009

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...