2011-04-09 11 views
8

Estoy usando NetStream.appendBytes() para reproducir un video local (sin servidor) en Adobe AIR. Me gustaría utilizar BitmapData.draw() para tomar una imagen de la salida de vídeo, pero estoy consiguiendo este error:¿Cómo puedo usar BitmapData.draw con NetStream.appendBytes?

Error #2123: Security sandbox violation: BitmapData.draw: cannot access null. No policy files granted access.

He aquí algunos ejemplos de código:

package 
{ 
    import flash.display.Sprite; 
    import flash.filesystem.File; 
    import flash.filesystem.FileMode; 
    import flash.filesystem.FileStream; 
    import flash.media.Video; 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    import flash.net.NetStreamAppendBytesAction; 
    import flash.utils.ByteArray; 
    import flash.display.BitmapData; 

    class ByteArrayPlayer extends Sprite 
    { 
     private var _ns:NetStream; 
     private var _nc:NetConnection; 
     private var _video:Video; 

     public function playVideo(path:String):void 
     { 
      _nc = new NetConnection(); 
      _nc.connect(null); 
      _ns = new NetStream(_nc); 

      _video = new Video(); 
      addChild(_video); 
      _video.attachNetStream(_ns); 

      _ns.play(null); 
      _ns.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN); 

      var file:File = new File(path); 
      var fileStream:FileStream = new FileStream(); 
      fileStream.open(file, FileMode.READ); 

      var bytes:ByteArray = new ByteArray(); 

      fileStream.readBytes(bytes); 

      _ns.appendBytes(bytes); 
     } 


     public function getImage(video:Video):BitmapData 
     { 
      var bit:BitmapData = new BitmapData(_video.width, _video.height); 
      bit.draw(_video);   //This will cause the error 
      return bit; 
     } 
    } 
} 

Esto sólo muestra el uso de código para una explicación. El error ocurriría al llamar al método getImage mientras se reproduce el video. El error menciona un archivo de política no encontrado. Como el archivo se carga localmente, no hay realmente un lugar para colocar un archivo de política. ¿Hay alguna configuración de directiva en algún lugar que deba establecerse o la característica BitmapData.draw simplemente no está disponible cuando se usa appendBytes?

+0

estoy en el mismo barco exacta como eras aunque, archivos están llegando desde una ubicación remota. Estaba usando el objeto urlstream para extraer los datos, y anexar como se desea wile modificando, localmente, los encabezados ... todo fue exitoso, pero antes de tratar de atrapar. Esencialmente me pegué un tiro en el pie. ¿Pudo superar los problemas o tiene alguna idea sobre cómo lograr esto con un servidor remoto? Actualmente estoy retirando FMS 4.5 para ver si eso resuelve el problema. Los documentos también apuntan en la dirección de Acceso Flash ... – stat

+0

Después de una noche muy larga, simplemente descubrí que con Http Dynamic Streaming (HDS), el uso del método appendBytes(), no hay forma posible de realizar el píxel manipulación de nivel en el video decodificado. Una posibilidad que queda es piratear una bitcoin secundaria en los archivos f4f, pero eso realmente depende de qué controles se están realizando y si el AVM simplemente ignora todos los indicadores de política en el modelo de transmisión appendBytes ... – stat

+0

¿Alguna vez se le ocurrió una solución para ¿esta? Me estoy encontrando con el mismo problema. – WesleyJohnson

Respuesta

0

Pruebe el conjunto NetStream.checkPolicyFile = true antes de llamar a la función play().

De esta manera:

_ns.checkPolicyFile = true; 
_ns.play(null); 

Lo que la bandera checkPolicyFile hace es que le dice al SWF principal para cargar un archivo de política desde el servidor del SWF cargado. Si no ha especificado ese indicador en el momento de la carga, recibirá SecurityError cuando intente obtener datos de píxeles del flujo cargado a través del BitmapData.draw().

Enlace a Adobe recursos: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#checkPolicyFile

+0

Esto no ayuda. El problema es que no hay servidor, por lo que no hay ningún lugar para cargar el archivo de política. El archivo se está cargando localmente (la máquina incluso puede estar fuera de línea). – Aaron

+0

Ok, mi mal. ¿Estás transmitiendo el video a través de RTMFP? En ese caso, encontré un hilo que te puede resultar interesante. http://forums.adobe.com/thread/16862 – Tjofras

+0

Gracias por el enlace. Sin embargo, el método NetStream.appendBytes solo funciona con el formato flv. Básicamente, estoy leyendo un archivo FLV del disco con FileStream, cambiándolo un poco y luego enviando los bytes al NetStream con appendBytes(). – Aaron

0

tengo una solución para deshacerse del error caja de arena cuando se trata de elaborar un contenido netstream.appendByte().

El SWF recupera un sandbox porque está buscando un archivo de dominio cruzado en la dirección especificada por usted :netstream.play(null). Está buscando algo que no existe.

Bueno, la solución es jugar una URL de vídeo falso, como “netstream.play(http://myserv.com/video.flv)” con un archivo crossdomain genuina en él, y después de eso, sólo hay que cargar el vídeo que desee gracias a la función appendBytes.

¡El SWF es engañado!

Por extraño que parezca, que funcione para mí :-)

+0

Gracias jugaré con esto. Sin embargo, necesito una solución que funcione sin conexión. Para que este método funcione correctamente, es probable que se necesite algún tipo de servidor local. – Aaron

+1

Esto no funciona: la documentación indica claramente que appendBytes() solo se puede invocar cuando ns.play() se invoca con nulo. De lo contrario, recibo un mensaje de error. –

0

No se puede tomar una instantánea de vídeo o audio de un flujo de RTMP a menos que los valores del lado del servidor de llamadas o StreamVideoSampleAccess StreamAudioSampleAccess se establece en true o establecer como este StreamVideoSampleAccess/StramVideoSampleAccess. No he descubierto una manera de hacer esto sin tener acceso al lado del servidor de FMS.

+0

Aquí hay un enlace a la documentación de Adobe al respecto http://help.adobe.com/en_US/FlashMediaServer/3.5_SS_ASD/WS5b3ccc516d4fbf351e63e3d11a11afc95e-7ec3.html#WS5b3ccc516d4fbf351e63e3d11a11afc95e-7fcb – bolnad

+1

Esto no es un flujo de rampa desde un servidor. Estos datos provienen de un archivo local en la máquina de los usuarios. – Aaron

1

Creo que otra solución es usar _ns.play(path) y no usar _ns.appendBytes().

+0

Eso es cierto, pero luego ya no tiene acceso a los bytes que se necesitan en mi caso. – Aaron

+0

Esto tampoco funciona, estoy reproduciendo video local en iOS con este método. Lamentablemente sigo recibiendo el error. – Drahcir

0

Intente colocar el objeto Video en un MovieClip y use bit.draw(_movieclipInstanceName); en lugar del objeto de video. Espero que funcione.

-1

Parece que está intentando llamar al método BitmapData.draw() en un video que no está cargado o cuando el objeto NetStream es nulo.

posible solución: espere hasta el NetStream.Buffer.NetStatus completo se envía antes de llamar a draw()

0

Sé que esta pregunta es realmente antigua ... pero sigue siendo un problema que acabo de enfrentar y sé que otros también lo harán ... Así que quería publicar el enlace para la otra pregunta de Stack donde publiqué el error en Adobe y la solución para que funcione.

Workaround for bug on a duplicate Stack Question