Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

VideoConferencia Touchsoftwares y Leo
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: VideoConferencia Touchsoftwares y Leo Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si a ti te va bien así, entonces no hay ningún problema que solucionar. Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.