2010-01-21 8 views
8

Estoy tratando de grabar el video y el audio de una cámara web en un archivo FLV almacenado en el disco duro local de los usuarios. Tengo una versión de este código en funcionamiento que usa NetConnection y NetStream para transmitir el video a través de una red a un servidor FMS (Red5), pero me gustaría poder almacenar el video localmente para situaciones de redes con poco ancho de banda/escamosa. Estoy usando FLex 3.2 y AIR 1.5, por lo que no creo que haya restricciones de espacio aislado que impidan que esto ocurra.¿Cómo grabo video en un disco local en AIR?

cosas que he visto:

  • FileStream - Permite reading.writing archivos locales, pero sin .attachCamera y methids .attachAudio para crear un FLV.
  • flvrecorder - Produce capturas de pantalla de la cámara web y crea su propio archivo flv. No es compatible con Audio. La licencia prohíbe el uso comercial.
  • SimpleFLVWriter.as - Similar a flvrecorder sin la licencia extraña. No es compatible con audio
  • This stackoverflow post - Lo que demuestra la reproducción de un video del disco local usando NetConnection/NetStream.

Dado que ya tengo una versión que usa NetStream para transmitir al servidor, pensé que la última era la más prometedora y seguí y armé esta aplicación de demostración. El código se compila y se ejecuta sin errores, pero no tengo un archivo FLV en el disco que haga clic en el botón de detención. -

<mx:Script> 
    <![CDATA[ 

     private var _diskStream:NetStream; 
     private var _diskConn:NetConnection; 
     private var _camera:Camera; 
     private var _mic:Microphone; 

     public function cmdStart_Click():void { 
      _camera = Camera.getCamera(); 
      _camera.setQuality(144000, 85); 
      _camera.setMode(320, 240, 15); 
      _camera.setKeyFrameInterval(60); 

      _mic = Microphone.getMicrophone(); 

      videoDisplay.attachCamera(_camera); 

      _diskConn = new NetConnection(); 
      _diskConn.connect(null); 

      _diskStream = new NetStream(_diskConn); 
      _diskStream.client = this; 
      _diskStream.attachCamera(_camera); 
      _diskStream.attachAudio(_mic); 
      _diskStream.publish("file://c:/test.flv", "record"); 

     } 

     public function cmdStop_Click() { 
      _diskStream.close(); 
      videoDisplay.close(); 
     } 

    ]]> 
</mx:Script>  
    <mx:VideoDisplay x="10" y="10" width="320" height="240" id="videoDisplay" /> 
    <mx:Button x="10" y="258" label="Start" click="cmdStart_Click()" id="cmdStart"/> 
    <mx:Button x="73" y="258" label="Stop" id="cmdStop" click="cmdStop_Click()"/> 

</mx:WindowedApplication> 

Me parece que hay algo mal, ya sea con el código anterior que se impide que trabaje, o NetStream simplemente no se puede abusar de este wany para grabar vídeo.

Lo que me gustaría saber es, a) ¿Cuál (si acaso) es malo en el código anterior? b) Si NetStream no es compatible con la grabación en el disco, ¿hay alguna otra alternativa que capture Audio Y Video en un archivo en el disco duro local del usuario?

¡Gracias de antemano!

+0

Por qué no utilizar el aire 2.0? Puede ser que sea más fácil usar las funciones de AIR 2.0 para la grabación de micrófonos ... Por cierto, con AIR 2.0 podrás al menos comprimir videos (sin usar Alchemy) ... O tal vez puedas al menos probar si tu transmisión es reproducible simplemente tratando de reproducirlo, no para escribir en el Sistema de archivos – Rella

+0

Al momento de solicitar AIR 2.0 todavía estaba en versión Beta. Lo investigué y no parecía tener API adicionales para la cámara o los objetos FileStrewam que lo harían posible. Sin embargo, si AIR 2.0 permite la grabación local de una cámara, definitivamente la usaría. –

Respuesta

2

No se puede transmitir video directamente al disco local sin usar algún servicio de transmisión como el codificador de Windows Media o Red5 o el servidor de medios de Adobe u otra cosa.

He intentado todas las muestras en Internet sin solución hasta la fecha.

vistazo a este enlace para obtener otra posibilidad:

http://www.zeropointnine.com/blog/updated-flv-encoder-alchem/

0

También estoy tratando de hacer lo mismo, pero los desarrolladores de avchat.net me han dicho que no es posible hacer esto con AIR en este momento. ¡Si descubres cómo hacerlo, me encantaría saber!

También encontré este enlace, no está seguro de lo útil que es http://www.zeropointnine.com/blog/webcam-dvr-for-apollo/

+0

Hola, el backend de grabación de video detrás de la cámara web DVR es el SimpleFLVRecorder.as que me gustaba más arriba. El principal problema para mí con SimpleFLVWriter.as es que no admite la grabación de audio junto con el video de la webcam. En mi aplicación, el audio es muy importante (en realidad, es una solución que solo graba audio y ningún video sería mejor que el video sin audio). –

0

Bueno, solo creo que dejar que se conectan a la nada (NULL) no funciona. Ya le he dejado tratar de conectarse a localhost, pero tampoco funcionó. No creo que esto sea posible. La transmisión de video funciona solo con Flash Media Server y Red5, no local. ¿Tal vez podrías instalar Red5 en tu PC?

+0

El objetivo es proporcionar una "aplicación" que el usuario descargue desde el sitio web (idealmente instalada tan perfectamente como AIR lo permite) que pueden usar para grabar videos y luego subirlos a un servidor Red5. Instalar Red5 en la máquina local significaría que necesitaríamos crear una aplicación de instalación separada que instaló nuestra aplicación y Red5 para el usuario. No es la experiencia seamles que estamos esperando. –

0

Tristemente el soporte de video en flash de cámaras es muy pobre. Cuando se transmite en crudo, el problema es que hay que codificar en FLV y hacerlo en tiempo real requiere una computadora muy rápida. Los conceptos de la primera generación escribirían mapas de bits sin formato en un archivo (o serializarían una matriz), luego un segundo método convertiría el archivo a FLV. Básicamente tienes que sondear la cámara y guardar cada fotograma como un mapa de bits y luego apilar en una matriz. Esto es muy limitado y no podría hacer audio. También fue muy difícil superar los 5-10 fps.

El caballero en el punto cero nueve, se le ocurrió una nueva versión y está en el camino correcto.Mira the new flv recorder. Pasé mucho tiempo trabajando con esto, pero nunca funcionó para mis necesidades (dos cámaras). Simplemente no pude obtener el FPS que necesitaba. Pero podría funcionar para ti. Fue mucho más rápido que el método original.

La única otra opción de trabajo que conozco es hacer que el Red5 guarde el video y lo descargue de nuevo a la aplicación.

2

Mi solución fue incrustar Red5 en AIR. compartir con ustedes mi artículo

http://mydevrecords.blogspot.com/2012/01/local-recording-in-adobe-air-using-red5.html

En general, la solución es la de insertar servidor de medios de comunicación libres Red5 en el aire como un activo. Por lo tanto, el servidor estará presente en la carpeta de la aplicación de AIR. Luego, a través de NativeProcess, puede ejecutar Red5 y tener su instancia en la memoria. Como resultado, puede tener una grabación de video local sin problemas de red.

+0

¡Bienvenido a Stack Overflow! Si bien esto puede responder teóricamente a la pregunta, [sería preferible] (http://meta.stackexchange.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. –

+0

Hola Peter. Gracias. El problema es que es un poco difícil describir la solución solo en el cuerpo de los comentarios. En general, la solución es incrustar el servidor de medios gratuito Red5 en AIR como un activo. Por lo tanto, el servidor estará presente en la carpeta de la aplicación de AIR. Luego, a través de NativeProcess, puede ejecutar Red5 y tener su instancia en la memoria. Como resultado, puede tener una grabación de video local sin problemas de red. – walv

+0

Gracias. He puesto tu comentario en tu respuesta. –

Cuestiones relacionadas