 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mie 17 Mar, 2010 11:06 pm Asunto: VideoConferencia Touchsoftwares y Leo |
|
|
Muy buenas,
Estaba mirando un mensaje de Touchsoftwares, Leo y alguna persona más del 2001 acerca de videoconferencia.
https://cppbuilder.es/viewtopic.php?t=955&highlight=videoconferencia
Mi pregunta es para los dos o para cualquier que lo lea, hay componentes hoy en día para hacer eso? tipo Indy o algo así? o sigue al día la idea de hacerlo por código como vuestro mensaje de hace unos años? es actual con los métodos de compresión de hoy en día? que pensáis acerca de ello?
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 21 Mar, 2010 4:13 pm Asunto: |
|
|
Todo lo que se comenta ahí sigue siendo válido (probado en Windows 7 con una cámara actual), al menos lo que era la pregunta principal. Luego ya depende de lo que quieras usar para enviar o para comprimir la información..
No he usado ningún componente para esto, pero en el siguiente enlace puedes ver alguno por si quieres probar:
http://www.torry.net/pages.php?id=168 |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Lun 22 Mar, 2010 12:49 am Asunto: |
|
|
Muchas gracias Leo,
Mi idea es hacer algo parecido a un videochat por internet, quizas incluso multiple, imagino que es necesaria la compresion por que sino seria imposible que sea fluido el video y el sonido.
Ya te contaré como llevo la cosa,
Muchas gracias.
Carlos |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Lun 22 Mar, 2010 1:37 pm Asunto: |
|
|
Leo,
Una cosita más,
La idea es hacer videoconferencia entre dos equipos por internet, les conecto por tcp y muevo el stream o lo que sea para que vean el video y el audio, eso en un principio no lo veo un problema, imagino entre los mensajes y la pagina que me has dicho lo conseguiré, pero veo otro problema, te cuento.
Como los conecto? me explico, los dos equipos están cada uno detrás de su router, si no se meten en el router y abren el puerto hacia su equipo no se verían, hay alguna forma de que yo haga de intermediario por ejemplo y los dos se conecten conmigo vía TPC y luego les enlace entre ellos y se desconecten de mi?
No se si me explico bien, pero la idea seria que no tengan que abrir puertos del router, tipo lo que hace el messenger.
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Lun 22 Mar, 2010 9:45 pm Asunto: |
|
|
Leo,
He estado haciendo el programa de videoconferencia que pusisteis y funciona perfectamente pero solo durante unos 3 o 4 segundos, una vez pasados el que recibe se queda la imagen congelada y que envia va bien.
He comprobado que el que recibe sigue recibiendo paquete, el problema parece que es con el Image1->Canvas que se debe quedar atascado o algo asi, de que puede ser?
He puesto lo que comentabas en formato JPG, pero no encuentro el problema.
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 22 Mar, 2010 10:32 pm Asunto: |
|
|
| Carlos J. Fernandez escribió: | | hay alguna forma de que yo haga de intermediario por ejemplo y los dos se conecten conmigo vía TPC y luego les enlace entre ellos y se desconecten de mi? |
Lo más sencillo es crear un servidor intermediario que actue de repetidor. Y si lo que quieres es conectar dos routers directamente la cosa no es tan sencilla, hay varios experimentos, prueba buscando por NAT2NAT..
| Carlos J. Fernandez escribió: | | He comprobado que el que recibe sigue recibiendo paquete, el problema parece que es con el Image1->Canvas que se debe quedar atascado o algo asi, de que puede ser? |
No se, habría que ver el código exacto para hacer alguna prueba y reproducir el problema, pero si funciona durante un tiempo suena a que por algún lado hay algún recurso que no se está liberando..
Si quieres enviar alguna cosa con la que pueda reproducir el problema y ver porque puede ocurrir:
leosoftware ARROBA gmail PUNTO com |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Lun 22 Mar, 2010 10:59 pm Asunto: |
|
|
| _Leo escribió: | | Lo más sencillo es crear un servidor intermediario que actue de repetidor. Y si lo que quieres es conectar dos routers directamente la cosa no es tan sencilla, hay varios experimentos, prueba buscando por NAT2NAT.. |
No, no es lo de los routers, es más bien lo del repetidor, no me importaría tener un servidor que les conecte, pero que no esté todo el rato conectado, sino solo para conectarlos y que luego sigan ellos.
| _Leo escribió: | | No se, habría que ver el código exacto para hacer alguna prueba y reproducir el problema, pero si funciona durante un tiempo suena a que por algún lado hay algún recurso que no se está liberando.. |
El código es exacto al que tu pusiste, añadiendo la parte donde enviar en formato jpg en vez de bmp, yo no he cambiado anda, es todo igual, es muy raro la verdad que después de 3 o 4 segundos se bloquee pero siga recibiendo y enviando, simplemente deja de refrescarse la imagen del que recibe.
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 22 Mar, 2010 11:06 pm Asunto: |
|
|
| Carlos J. Fernandez escribió: | | pero que no esté todo el rato conectado, sino solo para conectarlos y que luego sigan ellos |
A esto me refería cuando te decía que probaras a buscar experimentos como el NAT2NAT, esto no es algo sencillo.
| Carlos J. Fernandez escribió: | | El código es exacto al que tu pusiste |
Para enviar estas usando también el C++Builder6 con los componentes NetMasters como sale en la página web ? Porque el problema podría estar ahí, ya eran prácticamente obsoletos en su momento así que imagínate hoy en día. El C++Builder6 los incluía por compatibilidad con versiones anteriores, pero ya se incluían los Indy como sustitución para nuevos proyectos.
Luego hare una prueba a ver si a mi me ocurre lo mismo.. |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mar 23 Mar, 2010 12:22 am Asunto: |
|
|
| _Leo escribió: | | A esto me refería cuando te decía que probaras a buscar experimentos como el NAT2NAT, esto no es algo sencillo. |
Si, exactamente eso, voy a investigar a ver que puedo hacer.
| _Leo escribió: | Para enviar estas usando también el C++Builder6 con los componentes NetMasters como sale en la página web ? Porque el problema podría estar ahí, ya eran prácticamente obsoletos en su momento así que imagínate hoy en día. El C++Builder6 los incluía por compatibilidad con versiones anteriores, pero ya se incluían los Indy como sustitución para nuevos proyectos.
Luego hare una prueba a ver si a mi me ocurre lo mismo.. |
Si, es builder 6, imagino que es ese el problema, como podria hacer lo mismo pero con Indy? lo estuve intentando convirtiendo tu codigo a los Indy pero me da muchos errores, no lo consigo.
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mar 23 Mar, 2010 1:12 pm Asunto: |
|
|
Leo,
Estoy intentando hacer lo mismo pero con Indy, el problema es que me da un error, puedes ver el codigo a ver que puedo estar haciendo mal?
LRESULT CALLBACK fcb(HWND w, LPVIDEOHDR h)
{
BITMAPINFO bi;
ZeroMemory(&bi, sizeof(bi));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = 320;
bi.bmiHeader.biHeight = 240;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
std::auto_ptr<Graphics> bmp(new Graphics::TBitmap);
bmp->PixelFormat = pf24bit;
bmp->Width = bi.bmiHeader.biWidth;
bmp->Height = bi.bmiHeader.biHeight;
SetDIBits(bmp->Canvas->Handle, bmp->Handle, 0,
bi.bmiHeader.biHeight, h->lpData, &bi, DIB_RGB_COLORS);
std::auto_ptr<TJPEGImage> jpg(new TJPEGImage);
jpg->CompressionQuality = 50;
jpg->Assign(bmp.get());
std::auto_ptr<TMemoryStream> stream(new TMemoryStream);
jpg->SaveToStream(stream.get());
// Form1->NMStrm1->PostIt(stream.get());
Form1->IdTCPClient1->IOHandler->Write(stream.get());
return true;
}
Si te fijas lo unico que he cambiado es la linea en la que tu utilizabas el componente NMStrm1 por el de Indy IdTCPClient1, pero no se si estoy haciendo algo mal, el error que me da es el siguiente:
Access violation at address 00401A13 in module Project1.exe:
Read of address 00000000
Estoy con Builder 2007, se te ocurre algo?
Un abrazo.
Carlos[/img] |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 25 Mar, 2010 11:08 pm Asunto: |
|
|
| Carlos J. Fernandez escribió: | | Si te fijas lo unico que he cambiado es la linea en la que tu utilizabas el componente NMStrm1 por el de Indy IdTCPClient1, pero no se si estoy haciendo algo mal |
Me temo que para usar Indy no es suficiente con cambiar una línea, la cosa es más compleja.. si tengo tiempo luego modificaré el ejemplo.. |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Vie 26 Mar, 2010 2:25 am Asunto: |
|
|
Leo,
Gracias, más o menos ya me funciona con Indy, ahora ya solo me queda mover también sonido ademas de vídeo, a ver que se me ocurre.
Y después el tema del Nat2Nat que eso es lo que veo más complejo.
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Vie 26 Mar, 2010 2:33 am Asunto: |
|
|
Leo,
La cosa con Indy me ha quedado bien más o menos y funciona, lo pongo por aquí para ver si a alguien le vale o si se puede mejorar.
Es el código de Leo con algún pequeño cambio para que funcione con Indy.
Funcionar funciona, seguro que Leo lo puede mejorar por que quizás hago cosas que no son del todo correctas.
Leo si puedes mirarlo te lo agradecería.
LRESULT CALLBACK fcb(HWND w, LPVIDEOHDR h)
{
BITMAPINFO bi;
ZeroMemory(&bi, sizeof(bi));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = 320;
bi.bmiHeader.biHeight = 240;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
std::auto_ptr<Graphics> bmp(new Graphics::TBitmap);
bmp->PixelFormat = pf24bit;
bmp->Width = bi.bmiHeader.biWidth;
bmp->Height = bi.bmiHeader.biHeight;
SetDIBits(bmp->Canvas->Handle, bmp->Handle, 0,
bi.bmiHeader.biHeight, h->lpData, &bi, DIB_RGB_COLORS);
TJPEGImage *jpg=new TJPEGImage;
jpg->CompressionQuality = 50;
jpg->Assign(bmp.get());
TMemoryStream *Datos= new TMemoryStream();
jpg->Compress();
jpg->SaveToStream(Datos);
Form1->IdTCPClient1->IOHandler->WriteLn(Datos->Size);
Form1->IdTCPClient1->IOHandler->Write(Datos);
delete jpg;
delete Datos;
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
TMemoryStream *Datos= new TMemoryStream();
AnsiString CuantoMide=AContext->Connection->IOHandler->ReadLn();
AContext->Connection->IOHandler->ReadStream(Datos,CuantoMide.ToDouble(),false);
TJPEGImage *jpg=new TJPEGImage;
Datos->Position=0;
jpg->LoadFromStream(Datos);
Image1->Canvas->Draw(0, 0, jpg);
Image1->Update();
delete Datos;
delete jpg;
}
//---------------------------------------------------------------------------
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 26 Mar, 2010 3:36 am Asunto: |
|
|
| Si a ti te va bien así, entonces no hay ningún problema que solucionar. Saludos. |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Dom 04 Abr, 2010 7:02 pm Asunto: |
|
|
Cuando hicimos esto hace algunos llegamos llegue a la misma conclusion, comprimi en jpg y envie por stream, funciona....pero no es optimo... intente enviarlos a por una compresion mas eficiente; lo cual seria el camino correcto, mientras menos bytes envies mejor, es decir solo enviar los pixeles que cambien con respecto al tiempo y "dibujarlos" del otro lado en las posiciones correctas.
Siendo mas explicito
Es dividir la imagen en cuadros, ponerle un valor numerico a cada cuadro como resultado de sus pixeles (es es la parte compleja encontrar la funcion que respresente al grupo de pixeles), definir un umbral de cambio, cuando el resultado del grupo de un valor diferente (logica difusa) tomar ese grupo de pixeles y enviarlo, y el servidor del otro lado lo dibuja en su posicin correcta.
uff
Ese es el algoritmo, pero en mi caso que tengo una empresa de desarrollo. La utilidad practica y monetaria es nula, asi qeu decidi no hacerlo y enfocarme en lo que me deja dinero.
Cuando mi empresa genere el dinero suficiente para que yo pueda dedicarme a jugar , retornare a ese tipo de programacion. (no falta mucho)
saludos _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| 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.
|