 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Invitado
|
Publicado: Jue 15 May, 2003 8:51 am Asunto: webcam trasmision remota |
|
|
Ya revise en la opcion buscar todos los "post" referenets a video
y les indico lo que he logrado el dia de hoy
**Aplicacion Servidor "simulado" rustico
1) Abrir dispositivo web cam y colocarlo en un panel dentro de una ventana
2) Captura cada cierto tiempo (timer) un frame y guardarlo com bitmap
**Aplicacion Cliente mas rustica todavia
VEntana que leee cada cierto tiempo el fichero *.bmp generado por la
apliacacion Servidor , esto obiamnte funmciona atravez de una rd local
compartiendo la carptea donde esta la imagen
Entiendo que lo que hice no es NADA OPTIMO y consume recursos como idiota pero bueno es lo que logre hacer luego de 4 horas de investigacion
y nada en internet sobre el manejo de streams y la ayduaa del builder en esos temas es muy pobre
SOLICITO SU SU AYUDA DE LAS MANERA MAS HUMILDE (leo, rpocar, rb y los demas gurus)
para convertir este programa a trasmision por medio de un tmemorystream y serversocket y clientesocte o com se llame
para poder hacerlo via internte, asumiendo que posteriorremte
comprima la imagen a un formato jpg para la trasmision del mismo
o mpg
AYUDA PLZ!!! |
|
| Volver arriba |
|
 |
Niteman Lt

Registrado: 19 Dic 2002Mensajes: 92Ubicación: Sant Boi (Barcelona)
|
Publicado: Jue 15 May, 2003 1:15 pm Asunto: |
|
|
Hola.
Como ya habrás visto en el foro, yo conseguí enviar una imagen (sin necesidad de guardarla en un fichero) usando los componentes NMStrm y NMStrmServ y en una red local.
Cuando intenté hacerlo con las imagenes de la camara web (30 frames/sec) e intentando usar el localhost, se me colgó el programa. Ahora lo tengo parado por otras prioridades. Si consigues hacer algo postealo, please.
Que componente usas para la captura de la webcam?? Yo el ImageEn porque no encontré que tuviese una función que devolviese los frames.
Salu2. |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Jue 15 May, 2003 6:12 pm Asunto: |
|
|
No me gusta instalr componentes externos ya que luego es nu problema distribuirlos (solo cuando sea algo muy complicado como un id telefonico o algo asi)
Utilizamos el api de windows
capFileSaveDIB (hwndVideo, FileName);
Pego el componente completo aqui para que uses
Enviem el codigo parfa enviar sin guardar en archivo plz
| Código: |
//---------------------------------------------------------------------------
/*
* Copyright (c) Allan Petersen, 2001.
* This is a tutorial for a simple capture system using the win32 api
* for accessing your webcam
*
* (c) Copyright 2001, Allan Petersen
* ALL RIGHTS RESERVED
*
* Contact Allan Petersen at <support@allanpetersen.com> or visit
* www.allanpetersen.com
*
*/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "c_cap.h"
#include "ServerVideo.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
__fastcall TCap::TCap (HWND Handle)
{
// create video capture window
ParentHandle = Handle;
hwndVideo = capCreateCaptureWindow(
(LPSTR) "My Capture Window",
WS_CHILD | WS_VISIBLE,
0, 0, 300, 200,
frmServerVideo->panelCaptura->Handle,
(int) 0);
/* w = capCreateCaptureWindow("Mi Video",
WS_CHILD | WS_VISIBLE,
1, 1, 320, 240,
Panel1->Handle, 0); */
pStringCapDrivers = new TStringList;
SelectedDevice = -1;
}
__fastcall TCap::~TCap ()
{
delete pStringCapDrivers;
capPreview(hwndVideo, FALSE); // end preview
capDriverConnect(hwndVideo, SelectedDevice);
capDriverDisconnect(hwndVideo); // disconnect from driver
}
//---------------------------------------------------------------------------
// enumerate the installed capture drivers
//---------------------------------------------------------------------------
int TCap::EnumCapDrv ()
{
char szDeviceName[80]; // driver name
char szDeviceVersion[80]; // driver version
char str[161]; // concatinated string
int xcap; // counter
xcap = 0;
pStringCapDrivers->Clear ();
do {
if (capGetDriverDescription(xcap, szDeviceName, sizeof(szDeviceName),
szDeviceVersion, sizeof(szDeviceVersion))){
sprintf (str, "%s, %s", szDeviceName, szDeviceVersion);
pStringCapDrivers->AddObject (str, (TObject *)xcap);
}
else {
break;
}
xcap++;
} while (true);
return 0;
}
//---------------------------------------------------------------------------
// connecting to selected device and starts preview
//---------------------------------------------------------------------------
void TCap::Connect (int Selected)
{
CAPSTATUS CapStatus;
int hsize;
// capDlgVideoDisplay(hwndVideo);
// connect to the driver
if (SelectedDevice != -1) {
capPreview (hwndVideo, FALSE);
capDriverConnect(hwndVideo, SelectedDevice);
}
if (!capDriverConnect(hwndVideo, Selected)) {
// ---- Unable to connect to driver
return;
}
// update the driver capabilities
capDriverGetCaps (hwndVideo, sizeof(CAPDRIVERCAPS), &CapDrvCaps);
capDlgVideoFormat(ParentHandle);
// Are there new image dimensions
capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
hsize = GetSystemMetrics(SM_CYMENU);
hsize += GetSystemMetrics(SM_CYCAPTION);
// ---- Rescaling the windows
SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
SetWindowPos(ParentHandle, NULL, 0, hsize, CapStatus.uiImageWidth,
CapStatus.uiImageHeight+hsize, SWP_NOZORDER | SWP_NOMOVE);
// set preview rate to 33.3 miliseconds, or 30 FPS
capPreviewRate (hwndVideo, 33.3);
// start preview video
capPreview (hwndVideo, TRUE);
// ---- Remember selected device
SelectedDevice = Selected;
}
//---------------------------------------------------------------------------
// Get access to the video source format box
//---------------------------------------------------------------------------
void TCap::Format ()
{
int hsize;
CAPSTATUS CapStatus;
capDlgVideoFormat(hwndVideo);
// Are there new image dimensions
capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
hsize = GetSystemMetrics(SM_CYMENU);
hsize += GetSystemMetrics(SM_CYCAPTION);
SetWindowPos(ParentHandle, NULL, 0, hsize, CapStatus.uiImageWidth,
CapStatus.uiImageHeight+hsize, SWP_NOZORDER | SWP_NOMOVE);
SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
}
//---------------------------------------------------------------------------
// Get access to the video source dialog box
//---------------------------------------------------------------------------
void TCap::Source ()
{
capDlgVideoSource(hwndVideo);
}
//---------------------------------------------------------------------------
// capture a frame and save it
//---------------------------------------------------------------------------
void TCap::CaptureFrame (char *FileName)
{
capFileSaveDIB (hwndVideo, FileName);
}
|
Archivode cabecera
| Código: |
//---------------------------------------------------------------------------
#ifndef c_capH
#define c_capH
//---------------------------------------------------------------------------
#include <vfw.h> // video for windows library
class TCap
{
private:
protected:
HWND ParentHandle;
HWND hwndVideo;
CAPDRIVERCAPS CapDrvCaps; // driver capabilities
int SelectedDevice;
public:
TStringList *pStringCapDrivers;
int EnumCapDrv();
void Connect (int Selected);
void Format ();
void Source ();
void CaptureFrame (char *FileName);
__fastcall TCap(HWND Handle);
__fastcall ~TCap();
};
#endif
|
|
|
| Volver arriba |
|
 |
Niteman Lt

Registrado: 19 Dic 2002Mensajes: 92Ubicación: Sant Boi (Barcelona)
|
Publicado: Vie 16 May, 2003 6:46 am Asunto: |
|
|
Hola.
Entiendo que no querais instalar componentes externos por el tema de licencias, distribucion, etc. Voy a mirar el código que poneis y lo probaré.
Salu2. |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Vie 16 May, 2003 6:57 am Asunto: |
|
|
El codigo que puse funciona perfectamente, lo que necesito es la iluminacion de alguno de ustedes para enviar una imagen por medio de l protocolo tcp/ip, me imagino que es un stream , me imagino que no voy a guardar la imagen el disco voy a a tomar el fram , lo voy a "meter" en un stream de memorya y lo voya envair por medio ntmstrserver a un ntmstrcliente o algo
que alguien me ayude con ejemplos de codigo del uso de sockets Y TRASMISION , yo m encargo de la compresion PLease!!!
ya coloque la clasesista en las seccion de tips
saludos y espero su inmensa ayuda! _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Vie 16 May, 2003 6:59 am Asunto: |
|
|
Enviame porfavor algun ejemplo de como lograste pasar una imagen , de un equipo a otro por medio de un stream, te prometo que tan pronto termine el algoritmo de comrpesion te lo envio de vuelta funcionando _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Sab 17 May, 2003 3:25 am Asunto: |
|
|
Plz. ejemplo de envio de imagen a travez de un stream!!
leo plz plz
ya ven que siempre les ayudo a todos lo mas que puedo ahora necesito su ayuda no seais egoistas
Gracias por anticipado _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Mar 20 May, 2003 12:51 pm Asunto: |
|
|
//Para enviar
void __fastcall TFormMain::SendBtnClick(TObject *Sender)
{
//Paso de BMP a JPEG mi imagen y guardo en un stream
TJPEGImage *jp = new TJPEGImage();
jp->Assign(Image2->Picture->Bitmap);
TMemoryStream *mystr=new TMemoryStream();
jp->SaveToStream(mystr);
NMStrm1->Host = Edit2->Text;
NMStrm1->FromName = Edit1->Text;
NMStrm1->PostIt(mystr);
mystr->Free();
delete jp;
}
//En el evento del componente NMStrmServ1, recupero del stream la imagen
//---------------------------------------------------------------------------
void __fastcall TFormMain::NMStrmServ1MSG(TComponent *Sender,
const AnsiString sFrom, TStream *strm)
{
TJPEGImage *jp2 = new TJPEGImage();
jp2->LoadFromStream(strm);
Image3->Picture->Assign(jp2);
delete jp2;
} |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Mar 20 May, 2003 7:31 pm Asunto: |
|
|
Gracias!!! _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
Niteman Lt

Registrado: 19 Dic 2002Mensajes: 92Ubicación: Sant Boi (Barcelona)
|
Publicado: Mie 21 May, 2003 11:16 am Asunto: |
|
|
Una cosa.
No se como acceder al frame para poder guardarlo en un stream (si no lo es) para poder enviarlo. No quiero guardarlo en un fichero.
Como se hace? No me aclaro con las funciones del API:capVideoStreamCallback
capSetCallbackOnFrame
y otras.
Salu2. |
|
| Volver arriba |
|
 |
cmhicham Invitado
|
Publicado: Sab 21 Jun, 2003 2:16 pm Asunto: como guardamos dos jpeg en una misma stream |
|
|
me pregunta es para el invitado, tu codigo es el siguiente
void __fastcall TFormMain::SendBtnClick(TObject *Sender)
{
//Paso de BMP a JPEG mi imagen y guardo en un stream
TJPEGImage *jp = new TJPEGImage();
jp->Assign(Image2->Picture->Bitmap);
TMemoryStream *mystr=new TMemoryStream();
jp->SaveToStream(mystr);
NMStrm1->Host = Edit2->Text;
NMStrm1->FromName = Edit1->Text;
NMStrm1->PostIt(mystr);
mystr->Free();
delete jp;
}
imaginate que ahora antes de enviara stream queremos guardar en ella una segunda imagen en formato jpg, como lo harias por favor
void __fastcall TFormMain::SendBtnClick(TObject *Sender)
{
//Paso de BMP a JPEG mi imagen y guardo en un stream
TJPEGImage *jp = new TJPEGImage();
jp->Assign(Image2->Picture->Bitmap);
TMemoryStream *mystr=new TMemoryStream();
jp->SaveToStream(mystr);
//aqui donde se debe guardar la segunda imagen
//jp->Assign(Image3->Picture->Bitmap);
//.....................................
NMStrm1->Host = Edit2->Text;
NMStrm1->FromName = Edit1->Text;
NMStrm1->PostIt(mystr);
mystr->Free();
delete jp;
} |
|
| Volver arriba |
|
 |
tony26 Invitado
|
Publicado: Mar 24 Feb, 2004 11:49 am Asunto: webcam |
|
|
hola, estoy probando el codigo y algo estoy haciendo mal y no me sale, no lo tendreis alguno ya hecho para echarlo un vistazooo.
MUCHAS GRACIAS |
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Vie 20 Ago, 2004 9:50 pm Asunto: |
|
|
Alguien logró evitar guardar en disco y preparar el stream directamente en memoria?
creo q con esto la cosa iría más rápido.
atte _________________ Adrián
http://adrian.org.ar |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Dom 22 Ago, 2004 5:13 pm Asunto: |
|
|
adrian.. hice el codigo y si no me equio logre que lo haga en memoria, dejame lo encuentro y te lo envio..sale?
aunque siendo practico.. a mis clientes les vendo ahora camaras IP.. (nos cuestan unos 380 dolares) ..solo la conectas al router y entras a ellas desde cualquier navegador (sabiendo el ip o haciendo una resolucin dinamica) y mira..te evitas 1000 problemas funciona 10,000 veces mejor (por que tiene un procesador integrado solo para la compresion y trasmision) y no dependes de ningun equipo para que funciono
a menos que lo hagas con fines de diversion, no vale la pena invertir mas tiempo en la trasmision con web cams
saludos
Gabriel _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|