 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Samuel Carrion Invitado
|
Publicado: Lun 23 Abr, 2001 2:30 pm Asunto: Captura de Video - a Leo o otros |
|
|
Buenas, Estoy trabajando con la captura video y quisiera enviar la secuencia capturada vía la red (socket) en tiempo real. La captura está trabajando correctamente, pero no descubre cómo tener acceso al contenido capturado. Estoy tentando tener acceso a esta información por las funciones capCaptureSequenceNoFile y capSetCallbackOnFrame (o capSetCallbackOnStream). En esta función la pude poner un contador del frame, por ejemplo, pero no estoy encontrando cómo tener acceso a la información del quadro (o de la stream) para que pudesse enviarla por la red. Alguien sabe como tener acceso a estos datos?
|
|
| Volver arriba |
|
 |
_Leo Invitado
|
Publicado: Lun 23 Abr, 2001 9:29 pm Asunto: Captura de Video - a Leo o otros |
|
|
| Hola Samuel: 'capSetCallbackOnStream' solo se dispara cuando estamos en modo captura, bien con 'capCaptureSequenceNoFile' (sin captura a fichero) o bien con 'capCaptureSequence' (para capturar un .AVI por ejemplo). 'capSetCallbackOnFrame' se dispara cuando estamos en modo preview, con 'capPreview' por ejemplo. El ejemplo adjunto muestra esto. Nos permite capturar los datos del fotograma en el formato que lo entregue la capturadora o camara, en el ejemplo lo he puesto que trabaje sin compresión y a 24bits de color para que fuese mas fácil manipular la imagen. (más detalles en los comentarios del código) Como ejemplo, creamos un proyecto nuevo y añadimos al Form 1 TPanel (Panel1) de 322x242 pixels, 2 TButton (btnStart y BtnSaveFrame) y la cabecera #include <vfw.h> y metemos este código en la Unit1.cpp:
code:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop#include <vfw.h> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //--------------------------------------------------------------------------- TForm1 *Form1; HWND w; // Ventana de captura //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- LRESULT CALLBACK fcb(HWND w, LPVIDEOHDR h) { // En 'h->lpData' tenemos los datos del fotograma // antes de ser visualizado. En este ejemplo a 320x240 24bits, // por lo tanto la información de cada pixel estara del siguiente // modo BLUE-GREEN-RED.... o sea, 3 bytes por cada pixel // En 'h->dwBytesUsed' tenemos la cantidad de bytes de la imagen // Para este ejemplo, como demostración vamos a poner la imagen // en negativo. Aquí podriamos tanto modificar la imagen antes // de ser vista o bien comprimir estos datos y enviarlos por la red... typedef struct {BYTE b,g,r;} PIXEL; for (DWORD i=0; i<h->dwBytesUsed/3; i++) { PIXEL *pixel = &((PIXEL*)h->lpData)[i]; pixel->r = ~pixel->r; pixel->g = ~pixel->g; pixel->b = ~pixel->b; } // devolvemos TRUE para que la función siga capturando mas fotogramas return TRUE; } //--------------------------------------------------------------------------- void __fastcall TForm1::btnStartClick(TObject *Sender) { // Selecciona la ventana de captura w = capCreateCaptureWindow("Mi Video", WS_CHILD | WS_VISIBLE, 1, 1, 320, 240, Panel1->Handle, 0); if (!w) throw Exception("No se pudo seleccionar una ventana de captura"); // Se conecta con el primer dispositivo de captura que encuentra bool bRet; for (int iCapDrv=0; iCapDrv<10; iCapDrv++) { bRet = capDriverConnect(w, iCapDrv); if (bRet) break; } if (!bRet) throw Exception("Error: no se encontraron dispositivos."); // Mostramos en el titulo del form el nombre del driver seleccionado char szNombreDrv[256]; if ( capDriverGetName(w, szNombreDrv, sizeof(szNombreDrv)) ) Caption = szNombreDrv; // Cambiar formato de video a 320x240 24bits de color // tambien podriamos ponerlo manualmente en esta // resolución usando la función 'capDlgVideoFormat(w);' 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; if (!capSetVideoFormat(w, &bi, sizeof(bi))) throw Exception("No se puede cambiar el formato de video"); // Definimos la función que sera // llamada antes de visualizar cada fotograma if (!capSetCallbackOnFrame(w, fcb)) throw Exception("callback no instalado"); // Previsualizar captura capPreviewScale(w, true); capPreviewRate(w, 40); capPreview(w, true); } //--------------------------------------------------------------------------- void __fastcall TForm1::btnSaveFrameClick(TObject *Sender) { // Enviamos un fotograma a un fichero .BMP String FileName = ExtractFilePath(Application->ExeName) + "foto.bmp"; capFileSaveDIB(w, FileName.c_str()); } //---------------------------------------------------------------------------
Saludos.
|
|
| Volver arriba |
|
 |
Samuel Invitado
|
Publicado: Mie 25 Abr, 2001 1:46 pm Asunto: Captura de Video - a Leo o otros |
|
|
| Gracias _Leo! Solo mas una informacion : para apresentar la imagen - en la otra estación de la red - qual es lo metodo mas adecuado ? Estoy intentando via DrawDib, es lo mejor ? O hay una forma de atribuir los datos (h de tu ejemplo) a uno TPanel ? Saludos! |
|
| Volver arriba |
|
 |
_Leo Invitado
|
Publicado: Mie 25 Abr, 2001 5:18 pm Asunto: Captura de Video - a Leo o otros |
|
|
| Una forma sencilla de dibujarlo en caso de pasar los datos tal cual los devuelve la capturadora a 320x240x24bits sin compresión: // DatosDib - el array con los datos DIB // Panel - el panel donde queremos dibujarlo void DibujaDibEnPanel(void *DatosDib, TPanel *Panel) { 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; HDC hdc = GetDC(Panel->Handle); if (hdc) { SetDIBitsToDevice(hdc, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, 0, 0, 0, bi.bmiHeader.biHeight, DatosDib, &bi, DIB_RGB_COLORS); ReleaseDC(Panel->Handle, hdc); } } ---
|
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Vie 08 Ago, 2003 8:14 am Asunto: |
|
|
Como hicieron para ENVIAR el frame capturado en la funcion callback ?
estoy probando con NTMStrm pero no comprendo como enviarlo
Aydua porfavor _________________ 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 08 Ago, 2003 8:26 pm Asunto: |
|
|
Disculpen que lo vuelva a poner arriba, considero que es una pregunta de alto nivel (enviar datos a travez de la red, seria importante para otros y para mi por supuesto la respuesta) Gracias y disculpas otra vez _________________ 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 09 Ago, 2003 8:10 pm Asunto: |
|
|
Esto e spara enviar un archivo, no hay problema aqui , mi duda es como CONVIERTO, llso bytes de la imagen a un STREAM, ayuda porfavor!!!
TFileStream *MyFStream;
MyFStream = new TFileStream(OpenPictureDialog1->FileName, fmOpenRead);
try
{
NMStrm1->Host = Edit2->Text;
NMStrm1->FromName = Edit1->Text;
NMStrm1->PostIt(MyFStream);
}
catch(...)
{
}
MyFStream->Free(); _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
Xpto Lt

Registrado: 24 Abr 2003Mensajes: 92Ubicación: Pamplona
|
Publicado: Sab 09 Ago, 2003 9:29 pm Asunto: para Touchsoftwares |
|
|
Hola Touchsoftwares, leíste tu correo privado???
Gracias |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
|
| Volver arriba |
|
 |
Xpto Lt

Registrado: 24 Abr 2003Mensajes: 92Ubicación: Pamplona
|
Publicado: Dom 10 Ago, 2003 12:01 pm Asunto: Componente |
|
|
Que hay compañero, ya lo puse en el foro, está en esta dirección :
https://cppbuilder.es/viewtopic.php?p=13295&highlight=#13295
Son unos ejemplos de : probabilidad de movimiento, videoconferencia...
están en delphi.
Aparte tengo el activeX y el componente para delphi, pero haciendo unos apaños vale para builder, este componente está muy bien (a mi gusto), ya que captura video y audio con sólo poner dos líneas de código.
Para todo el que lo quiera que me lo diga y se lo mando a partir del lunes ya que lo tengo en otro ordenata y ya os diré para instalar lo que hay que borrar porque ahora no me acuerdo pero era fácil, para que así funcione el componente y compile.
Saludos Touchsoftwares |
|
| Volver arriba |
|
 |
Natalia Cdt

Registrado: 24 Ago 2002Mensajes: 16
|
Publicado: Dom 10 Ago, 2003 3:17 pm Asunto: |
|
|
Eso me interesa.....
Tengo la captura de video aparcada desde hace mucho tiempo.
Mi e-mail es: natalia_bcb@terra.es
Muchas gracias _________________ -
Saludos. |
|
| Volver arriba |
|
 |
MAC Lt

Registrado: 11 Ago 2002Mensajes: 77
|
Publicado: Dom 10 Ago, 2003 5:42 pm Asunto: |
|
|
Si no es mucha molestia te agradeceria me lo enviaras
progmac@hotmail.com
Gracias... |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Dom 10 Ago, 2003 7:49 pm Asunto: |
|
|
La captura devideo no es problema, en tips coloque un objeto que lo hace (sin necesidadde componenetes externos), lo que me gustaria me ayudaran es como convertir la informacion caturaraa en callback de video en un stream (que tipo de stream?) para enviar por ntmstr (a travez de una red local)
Aclaro que lo logre hacerlos funcionar un stream tipo file , leyendo un archivo guardado (frame, como esta en el ejemplo que trae builder), pero no es lo suficientemete rapido .a que lo maneje todo en memoria TStreamMemory ? o TStreamSocket ?
Ayuda porfavor
Al qu e lei nterese captura video y tomar fotos:
https://cppbuilder.es/viewtopic.php?t=5592 _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
Xpto Lt

Registrado: 24 Abr 2003Mensajes: 92Ubicación: Pamplona
|
Publicado: Dom 10 Ago, 2003 11:02 pm Asunto: Instalación del componente |
|
|
Bueno lo acabo de instalar el el builder 6 y funciona :
Ir a instalar componente, el primero que debeis instalar y sólo éste, luego lo demás, es el JLCVideo.pas (El tipo de extensión es pas ojo para poder verla), lo instalais y da 29 errores( ami por lo menos). Ahora lo desinstalais y aceptais todo lo que salga y cerrais builder.
Si saltan errores habiendo cerrado builder apagais el ordenador.
Abrimos otra vez buirder y ahora instalamos el JLCVideo.pas, el avi captura.pas y el activeX JLCVideoXControl.ocx. Ahora no tiene que dar error. Cerrais builder.
Si saltan errores habiendo cerrado builder apagais el ordenador.
Una vez instalado el componente, el activeX y sus hpp, cogemos una form1 y ponemos sobre ella un JLCVideo1 y nada más, Compilamos y nos dan tres errores, Borramos las líneas de error y volvemos a compilar, ya no da errores. Cerramos el proyecto, no guardamos los cambios del proyecto pero sí guardar los cambios en el hpp para que cuando lo useis no tengais que volver a borrar las tres lineas.
En el builder 5 me parece que sólo había que hacer los dos últimos pasos.
Espero que os sirva a tod@s
Saludo2 |
|
| Volver arriba |
|
 |
Xpto Lt

Registrado: 24 Abr 2003Mensajes: 92Ubicación: Pamplona
|
Publicado: Dom 10 Ago, 2003 11:28 pm Asunto: Ejemplo |
|
|
Ahí va un ejemplo muy simple con JLCVideo1 :
Este es un ejemplo muy muy simple :
Colocaís en un form1 un JLCVideo1, y 8 botones :
Abrir cámara, cerrar cámara, sacar foto, formato vídeo, fuente vídeo, compresión vídeo, grabar vídeo, parar vídeo.
Existen bastantes opciones, pero esto es para que veais que simple es capturar imágenes.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
JLCVideo1->Activo=true;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
JLCVideo1->Activo=false;
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
JLCVideo1->GrabarImagenDisco;
};
void __fastcall TForm1::Button4Click(TObject *Sender)
{
JLCVideo1->GrabarVideoDisco;
}
void __fastcall TForm1::Button5Click(TObject *Sender)
{
JLCVideo1->StopVideo;
}
void __fastcall TForm1::Button6Click(TObject *Sender)
{
JLCVideo1->SeleccionarFormato;
}
void __fastcall TForm1::Button7Click(TObject *Sender)
{
JLCVideo1->SeleccionarFuente;
}
void __fastcall TForm1::Button8Click(TObject *Sender)
{
JLCVideo1->SeleccionarCompresion;
}
Saludo2 |
|
| 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.
|