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."]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich konfrontiert mit dem gleichen problem. Die Lösung wurde in der Verwendung der URLStream-statt-Buchse.
Hier arbeitet die source-code mit kleinen änderungen, die ich gemacht habe MXML-Komponente zur Verwendung in Flex.
Ich diese Art der Nutzung:
Ich rate Ihnen, nicht zu verwenden, Loader, wie in Ihrem Beispiel, denn es macht das Bild zucken. In meinem Beispiel funktioniert es auch.
Könnten Sie versuchen, diese:
https://github.com/alloyking/Foscam-Flex
Aussieht, entwickelt für eine mobile app - Android.
bist du den Aufruf der Methode falsch, sollte so sein:
var cam:MJPEG = new MJPEG("192.168.1.10", "/video.mjpeg",8080);
(drop-das führende http://in der host -)