Usando una WebCam con Windows Form – Parte 2: Grabando


Siguiendo la serie de artículos Usando una WebCam  con Window Forms, esta vez crearemos un programa para grabar lo que veamos en la WebCam. En este caso vamos a usar las librerías Aforge.Video (para tener acceso a la clase NewFrameEventArgs), Aforge.Video.DirectShow (para usar la clase VideoCaptureDevice entre otras) y Aforge.Video.VFW (usaremos la clase AVIWriter para grabar un archivo .avi). Como comenté en el artículo pasado, debemos cambiar el Framework de Destino -si usamos .NET Framework 4.0– a .NET Framework 3.5. Vamos a usar un Form sencillo, solo un PictureBox que mostrará la cámara web, un ComboBox que va a contener los diferentes dispositivos de captura, un Button para iniciar el dispositivo seleccionado y otro para iniciar la grabación. El diseño quedaría así:

El código que vamos a usar es casi una copia exacta del artículo pasado, así que esta vez sólo voy a poner el código que he usado para grabar la WebCam.

private bool IsRecording = false;
private AVIWriter writer = null;
private Timer timer;

IsRecording nos ayudará a determinar cuándo estamos grabando, writer es la que grabará en disco el video tomado desde nuestra cámara web y timer hará que el video se grabe a 30 fps(frames per second); miremos dónde nos va a ayudar estas variables:

void timer_Tick ( object sender, EventArgs e )
{
    if ( IsRecording )
    {
        Bitmap Imagen = ( Bitmap )webcam.Image;
        this.writer.AddFrame ( Imagen );
    }
}

Como vemos, IsRecording nos “habilitará” el grabar las imágenes que vienen de la cámara web y el writer añadirá imágenes al video. Por último el código asociado al Click del botón Grabar:

private void grabar_Click ( object sender, EventArgs e )
{
    if ( !IsRecording )
    {
        using ( SaveFileDialog sfd = new SaveFileDialog() )
        {
            sfd.AddExtension = true;
            sfd.Filter = "Archivo Avi (*.avi) | *.avi";

            if ( sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK )
            {
                timer = new Timer ();
                timer.Enabled = true;
                timer.Interval = 33;
                timer.Tick += new EventHandler ( timer_Tick );

                /* Para usar wvm3 se debe instalar
                 * http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&id=6191
                 * Se puede usar new AVIWriter ( ); si no se cuenta con el codec wvm3
                 */
                writer = new AVIWriter ( "wmv3" );
                writer.Open ( sfd.FileName, ( int )Math.Ceiling ( ( double )webcam.Image.Width ), ( int )Math.Ceiling ( ( double )webcam.Image.Height ) );

                IsRecording = true;
                label1.Visible = true;
                timer.Start ();
            }
        }
        grabar.Text = "Detener";
    }
    else
    {
        TerminarGrabacion ();
    }
}

Pequeña aclaración: ( int )Math.Ceiling ( ( double )webcam.Image.X ) –> Este código lo único que hace es redondear hacia arriba el ancho y el alto de la imagen. TerminarGrabacion (); –> Llama a un procedimiento que cierra el writer, guarda el video y pone un false en la variable IsRecording. Nuestro programa debería verse de esta manera:

Luego de grabar nuestro video podemos verlo usando nuestro reproductor preferido. Como es costumbre les dejo el proyecto hecho por mí, en C# (RecordWebCam_WF_CSharp.zip) y en VB.NET (RecordWebCam_WF_VB.zip). Les recuerdo cambiar la extensión de .odt a .zip.

Anuncios

22 Respuestas a “Usando una WebCam con Windows Form – Parte 2: Grabando

  1. podes volver a subir el de C#? Gracias

  2. Excelente muchisimas gracias y felicidades por el tutorial.

  3. Podrías arreglar el link de descarga del código de C#?
    muchas gracias por tu aporte

  4. Oye, disculpa, una duda… en la parte del código “writer.Open ( sfd.FileName, ( int )Math.Ceiling ( ( double )webcam.Image.Width ), ( int )Math.Ceiling ( ( double )webcam.Image.Height ) );” al momento de querer grabar me arroja un error “Failed creating compressed stream”. ¿A qué puede deberse?

    • Hola Felipe
      Buscando un poco tu problema, muchas personas le ha servido el cambiar de codec. Intenta con uno nuevo y dime cómo te va.
      Un saludo

      • gracias por tu respuesta, al parecer da el error antes mencionado porque necesita el codec que viene entre comentarios, ya que yo lo descargue y lo instale y ya no me dio mas el error

  5. Buen día, interesante el código, pero noto que en el momento de reproducir lo grabado se ejecuta más rápido que a la velocidad que se ha grabado. Este problema a qué se debe? gracias

  6. hola amigo estoy trabajando en un proyecto y me interesa el codigo para grabar video ya lo baje funciona perfecto pero en entorno x64 y se me presenta un error porque trabajo con mdb de access (oledb4) ya que este motor solo corre en x86. buena amigo por esa casualidad me podes ayudar con tu codigo para solusionar y corran ambas cosas en x86. desde ya mucha gracias.

  7. Enhorabuena por el post, es fantástico.
    Quisiera saber si se puede, además de grabar el vídeo, hacerlo con sonido, osea capturar tanto el vídeo como el audio y guardarlo todo en el mismo avi…
    Gracias!!

  8. muy buen tu tuto, lo lei todo y lo descargue pero a la hora de grabar me sale un error al intentar crear un nuevo archivo y dice “Failed creating compressed stream.”. alguna sugerencia??. Gracias

  9. y existe manera de grabar sonido en el mismo archivo .avi?

  10. Muy buen ejemplo, gracias. Pero tengo alunas dudas:
    – ¿Cómo puedo grabar el audio en el mismo video?
    – ¿Hay algún modo de insertar la hora en la captura?
    – ¿Puedo guardar en otro formato que ocupe menos como .wmv?
    Gracias por todo.
    Un saludo.

  11. Muy buen aporte. ¿Sería posible también grabar video y audio?

    Un saludo.

  12. puedes volve a subir el de C# porfavor

  13. Solo hay que quitar el “wmv3” para el codec y funciona…

  14. me da el mismo error k a Felipe_Zamora

  15. holas disculpa me sale error en la parte del código “writer.Open ( sfd.FileName, ( int )Math.Ceiling ( ( double )webcam.Image.Width ), ( int )Math.Ceiling ( ( double )webcam.Image.Height ) );
    y por favor podrias poner la parte del codigo del TerminarGrabacion (); esq tus links no sirven muchas gracias

  16. Ya no estan los archivos, ayuden con esto por favor

  17. El link de VB no me funciona, podrías arreglarlo o decirme otra forma de descargarlo?

    Muchas gracias

  18. puedes reparar el link de descarga del proyecto en c#
    me urge le agradesco su ayuda

  19. Como se puede grabar el sonido ???
    gracias..

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s