Я хотел бы создать Flash MJPEG-плеер, чтобы его могли просматривать неподдерживаемые браузеры.
Я пробовал 2 маршрута здесь: один с urlStream, а другой с Sockets.Я собираюсь с сокетами, потому что, кажется, все дальше.
Плеер MJPEG будет воспроизводить поток с удаленной IP-камеры.Поскольку камера расположена за маршрутизатором, она находится на порте 8006. Я загрузил файл crossdomain.xml в корень камеры на этот порт
<?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>
. Он расположен на h ** p://domainofcam.com:8006/crossdomain.xml
В приложении вы найдете мой код as3, который я использую.В моем флеш-файле у меня есть кадр 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);
, и мой файл MJPEG as3 выглядит так:
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);
}
}
}
Когда я запускаю отладку, я получаю следующий вывод:
[IOErrorEvent type = "ioError" пузыри = ложь отменить = ложь eventPhase = 2 text = "Ошибка # 2031: ошибка сокета. URL: h * p: //domainofcam.com"] [SecurityErrorEventtype = "securityError" bubbles = false cancellable = false eventPhase = 2 text = "Ошибка # 2048: нарушение изолированной программной среды безопасности: file: ///Repository/projects/Surfcam/mjpg/MJPG.swf не может загрузить данные из h *p: //domainofcam.com: 8006. "]