none
Grabar Avi con la WebCam en Silverlight RRS feed

  • Pregunta

  • ¡Buenas noches!

     

    Llevo una semana intentando pasar a VB.net el ejemplo:  http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2009/12/28/silverlight-4-yet-more-on-capturing-video-from-webcams.aspx

    Consigo ejecutarlo en C# sin problemas aunque en un principio me dio unos cuantos quebraderos de cabeza. ;-)

    Debido a que hay muy poca desarrollo de Silverlight en VB.net me animé a pasar el código a VB.net;

    En su día David me hecho una mano (y no al cuello precisamente ;-). Gracias David):

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/9a3abcaf-3ad5-4f14-a5df-154bdb013f8a

    Consigo compilarlo sin errores pero no puedo leer el Avi para que lo reconozca el play. Creo que el error esta en la traducción de las clases de la carpeta Recording (primero pasé un traductor de C# a vb.net y luego fuí clase por clase repasando las traducciones).

    Hay una función en la que no estoy muy seguro si la traducción es la correcta (en la clase: RiffChunk), pero es compilada y ejecutada. Me he asegurado de ello.

     Private Sub WriteDataAsync(ByVal code As RiffAviFourCCCode, ByVal sample As Byte(), ByVal callback As Action)
    
      WriteFourCC(code)
    
      WriteDWORD(sample.Length)
    
      Me.sizeBookmark.Value += CUInt(sample.Length)
    
    
    
      _stream.BeginWrite(sample, 0, sample.Length, Sub(iar)
    
                   ' TODO - throws!
    
                   _stream.EndWrite(iar)
    
                   If Not callback Is Nothing Then
    
                    callback()
    
                   End If
    
                  End Sub, Nothing)
    
    
    
     End Sub
    
    

    La función original en C# es:

     void WriteDataAsync(RiffAviFourCCCode code, byte[] sample, Action callback)
    
     {
    
      WriteFourCC(code);
    
      WriteDWORD(sample.Length);
    
      this.sizeBookmark.Value += (uint)(sample.Length);
    
    
    
      stream.BeginWrite(sample, 0, sample.Length, iar =>
    
      {
    
      // TODO - throws!
    
      stream.EndWrite(iar);
    
    
    
      if (callback != null)
    
      {
    
       callback();
    
      }
    
      }, null);
    
     }
    
    

    Bueno, os dejo el código que he empleado por si alguno se anima a mirarlo. Tal vez se encuentre donde yo me pierdo y pueda compartir ese conocimiento con nosotros. Digo yo que habrá algún experto en VB.net entre nosotros ;-).

    http://cid-81c429ca4b9fb876.office.live.com/self.aspx/P%C3%BAblico/WebCamCapture%20-%20vb.zip

    Gracias por vuestras aportaciones.

    Un saludo,

     

     

    martes, 7 de septiembre de 2010 21:31

Todas las respuestas

  • Hola Corsario.

    He probado tu ejemplo y no parece tener ningun error.

    Lo unico que veo es que no se reproduce el video en el reproductor, pero lo que yo creo es que no se crea bien el stream avi, ya que he intentado abrirlo con VLC y lo abre pero no reproduce nada, es como si el archivo no se formara correctamente.

    No obstante, este es un metodo de prueba supongo, ya que 3 segundos me consume la friolera de 150 MB, asi que yo pensaria en buscar algun tipo de compresion en lugar de intentar hacer este funcionar.

    A parte, he probado el ejemplo real en c# y tampoco me ha funcionado, de modo que creo que el ejemplo inicial a parte de estar obsoleto por usar una Beta de silverlight es un ejemplo de muestra pero no valido.

    En cualquier caso, graba el archivo AVI, de modo que el problema debe estar en la clase que genera el stream AVI para unir audio y video.

    Ya intente buscar algun tipo de codificador, pero el problema es que solo se pueden añadir librerias de silverlight, ya que este corre en una sandbox y no lo permite el contexto de seguridad.

    No obstante he encontrado esto que puede que te sirva:

    http://directshow4sl.codeplex.com/

    es una portabilidad de directShow a Silverlight, hay un ejemplo para probarlo, pero no se toda la funcionalidad que te puede ofrecer.


    Saludos
    David González
    MCP.
    Visita mi Blog en: http://www.dgzornoza.com/
    jueves, 16 de septiembre de 2010 16:15
  • ¡Hola David!

    Gracias por tomarte la molestía de mirarlo ;-)

    Es cierto que no reproduce el  avi que crea por eso indico que: "Creo que el error esta en la traducción de las clases de la carpeta Recording" en la entrada.

    Tienes razón, el ejemplo en C# está desarrollado en la versión Beta. En tantos intentos, conseguí hacerlo funcionar en C# para la versión 4 del framework. No  me ocupa tanto como indicas, pero tiene la pega de que al reproducir lo hace a excesiva velocidad (Esto también conseguí solucionarlo jugando con el timer de creación del AVI). Creo que conservo el código en C# pero sin el cambio de la velocidad (me paso el día borrando y modificando que suelo hacer limpieza de mucho código ;-)), si lo necesitas te lo paso ;-)

    Para llegar a la conclusión de que el problema está en la clases de la carpeta Recording lo que hice es complilar una solución de librería en C# con el código que conseguí hacerlo funcionar. Y desde VB.Net llamaba a esa dll. De esta forma he conseguido localizar el problema en ese paquete de clases.

    Respecto a DirectShow recuerdo haberlo mirado pero es un proyecto del 2009 que no esta actualizado y no puedo ejecutar los ejemplos para investigar sobre el tema. Creo que la versión para WPF si que esta al día y hasta llegué a intentar compilarla para Silverlight pero sin mucho éxito. Como veía que igual me metía en una vía muerta y que me llevaría mucho tiempo, opté por lanzar la pregunta porque igual alguién ha hecho el esfuerzo y desea compartir ese conocimiento con el resto.

    Gracias por la ayuda. Un abrazo,

     

    jueves, 16 de septiembre de 2010 18:54
  • Hola Corsario.

    La verdad es que esta es una pregunta que hacia falta dejarla por aqui, ya que no hay nada novedoso al respecto, con el ultimo silverlight se puede acceder bien a la webcam y obtener el stream de video y audio, pero no hay nada al respecto para la compresion de estos datos, el envio o grabacion del RAW es algo muy costoso y no se puede realizar a no ser que dispongas de una red gigabyte.

    yo pense cuando escribi el articulo en hacer algun tipo de compresion, pero cuando mas entraba en el tema menos salida veia y era meterme en camisas de once baras, lo unico que pude llegar a hacer es comprimir el audio en formato voip (creo que era la especificacion g711) y los frames en jpg lo cual ya es algo, de este modo se puede trasmitir el audio y video por separado en streaming que es lo minimo para realizar una videoconferencia, pero unirlo para crear un mpeg u otro formato era una tarea compleja.

    Es posible que algun dia si tengo tiempo dedique algo para ver los sistemas abiertos basados en c/c++ y cree alguna libreria (aunque necesitare ayuda, igual abro algun proyecto en codeplex al respecto) pero hasta entonces, a ver si va saliendo algo y la gente lo postea aqui.

    El directShow es dificil de mantener para silverlight es una libreria muy grande, lo ideal seria una libreri de codificacion/decodificacion unicamente, algo sencillo de usar y que no sea muy extensa.

    De todas formas si tienes por ahi el proyecto compilado correctamente del ejemplo pasamelo y me lo guardo para poder realizar pruebas e intentar comenzar la libreria de compresion. (yo lo hice compilar pero no me funciono y no le pude dedicar mucho tiempo).

     


    Saludos
    David González
    MCP.
    Visita mi Blog en: http://www.dgzornoza.com/
    viernes, 17 de septiembre de 2010 9:16
  • ¡Buenas tardes David!

    En mis averiguaciones encontré a un chico aleman que publicó una clase de codificación y descodificación muy sencilla (sólo video) pero el problema es que sólo podía decodificarse con un play que empleara su clase de descodificación.

    Respecto a la compresión del audio si que encontré más información y sobretodo mayor número de formatos procesados

    Si te animas a abrir un proyecto en Codeplex y consideras que mi colaboración puede ser útil no dudes en comunicármelo. Yo encantado de participar en tal empresa contigo ;-)

    Un abrazo, campeón.

     

    viernes, 17 de septiembre de 2010 13:16