laden & spielen Sie eine mjpeg via flash mit as3 - Socket Fehler

Ich würde gern ein flash-MJPEG-player, so dass nicht unterstützte Browser angezeigt werden kann.

Habe ich versucht 2 Strecken hier, ein mit einem urlStream-und anderen mit-Sockets. Ich werde die Steckdosen, denn es scheint sich immer weiter.

Den MJPEG-Spieler spielen ein-Kamera-stream von einer remote-IP-Kamera. Denn die Kamera befindet sich hinter einem router ist auf port 8006. Ich habe hochgeladen ein crossdomain.xml Datei im Stammverzeichnis der Kamera an, dass port

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="master-only" />
    <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

Dieser befindet sich auf h**p://domainofcam.com:8006/crossdomain.xml

Beigefügt finden Sie mein as3-code, den ich verwende. In meiner flash-Datei habe ich auf frame 1,

Security.loadPolicyFile("xmlsocket:h**p://domainofcam_com:8006/crossdomain.xml"); 
trace("xmlsocket:h**p://domainofcam_com:8006/crossdomain.xml")  
var cam:MJPEG = new MJPEG("h**p://domainofcam.com", "/mjpeg.cgi", 8006);
addChild(cam);

und meine MJPEG-as3-Datei ist wie folgt:

package 
{
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.net.URLRequestHeader;
    import flash.net.URLStream;
    import flash.net.Socket;
    import flash.utils.ByteArray;
    import com.dynamicflash.util.Base64;

    /**
     * This is a class used to view a MJPEG
     * @author Josh Chernoff | GFX Complex
     * 
     */
    public class  MJPEG extends Loader
    {
        private var _user:String;                                   //Auth user name
        private var _pass:String;                                   //Auth user password

        private var _host:String;                                   //host server of stream
        private var _port:int;                                      //port of stream        
        private var _file:String;                                   //Location of MJPEG
        private var _start:int = 0;                                 //marker for start of jpg

        private var webcamSocket:Socket = new Socket();             //socket connection
        private var imageBuffer:ByteArray = new ByteArray();        //image holder


        public function MJPEG (host:String, file:String, port:int = 80, user:String = null, pass:String = null )
        {
            _host = host;
            _file = file;
            _port = port;
            _user = user;
            _pass = pass;

            webcamSocket.addEventListener(Event.CONNECT, handleConnect);
            webcamSocket.addEventListener(ProgressEvent.SOCKET_DATA, handleData);
            webcamSocket.addEventListener(IOErrorEvent.IO_ERROR, IOErrorSocket);
            webcamSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
            webcamSocket.connect(host, port);

        }

        private function IOErrorSocket(event:IOErrorEvent):void {
                var date:Date = new Date();
                trace(event);
        }

        private function securityError(event:SecurityErrorEvent):void {
            var date:Date = new Date();
            trace(event);
        }

        private function handleConnect(e:Event):void 
        {
            //we're connected send a request
            var httpRequest:String = "GET "+_file+" HTTP/1.1\r\n";
            httpRequest+= "Host: localhost:80\r\n";
            if(_user != null && _pass != null){
                var source:String = String(_user + ":" + _pass);
                var auth:String = Base64.encode(source);
                httpRequest += "Authorization: Basic " + auth.toString()+ "\r\n";   
                //NOTE THIS MAY NEEED TO BE EDITED TO WORK WITH YOUR CAM
            }
            httpRequest+="Connection: keep-alive\r\n\r\n";
            webcamSocket.writeMultiByte(httpRequest, "us-ascii");
        }

        function handleData(e:ProgressEvent):void {
            //get the data that we received.
            //append the data to our imageBuffer
            webcamSocket.readBytes(imageBuffer, imageBuffer.length);
            //trace(imageBuffer.length);
            while(findImages()){
            //donothing
            }


        }


        private function findImages():Boolean
        {

            var x:int = _start;
            var startMarker:ByteArray = new ByteArray();    
            var end:int = 0;
            var image:ByteArray;

            if (imageBuffer.length > 1) {
                if(_start == 0){
                    //Check for start of JPG
                    for (x; x < imageBuffer.length - 1; x++) {

                        //get the first two bytes.
                        imageBuffer.position = x;
                        imageBuffer.readBytes(startMarker, 0, 2);

                        //Check for end of JPG
                        if (startMarker[0] == 255 && startMarker[1] == 216) {
                            _start = x;
                            break;                  
                        }
                    }
                }
                for (x; x < imageBuffer.length - 1; x++) {
                    //get the first two bytes.
                    imageBuffer.position = x;
                    imageBuffer.readBytes(startMarker, 0, 2);
                    if (startMarker[0] == 255 && startMarker[1] == 217){

                        end = x;

                        image = new ByteArray();
                        imageBuffer.position = _start;
                        imageBuffer.readBytes(image, 0, end - _start);

                        displayImage(image);

                        //truncate the imageBuffer
                        var newImageBuffer:ByteArray = new ByteArray();

                        imageBuffer.position = end;
                        imageBuffer.readBytes(newImageBuffer, 0);
                        imageBuffer = newImageBuffer;

                        _start = 0;
                        x = 0;
                        return true;
                    }
                }
            }

            return false;
        }

        private function displayImage(image:ByteArray):void
        {
            this.loadBytes(image);
        }

    }

}

Wenn ich Debuggen bekomme ich folgende Ausgabe:

[IOErrorEvent type="ioError" bubbles=false cancelable=false
eventPhase=2 text="Error #2031: Socket-Fehler. URL:
h*p://domainofcam.com"] [SecurityErrorEvent type="securityError"
bubbles=false cancelable=false eventPhase=2 text="Error #2048:
Sicherheits-sandbox-Verletzung:
file:///Repository/Projekte/Surfcam/mjpg/MJPG.swf-Daten nicht laden kann
von h
*p://domainofcam.com:8006."]

InformationsquelleAutor John Hamman | 2011-11-17
Schreibe einen Kommentar