PDA

Просмотр полной версии : mpeg video, проблема в хроме


kyzi007
04.08.2012, 12:47
Такие чудеса - во всех броузерах кроме хрома работает.
В хроме - возвращает 200 статус а потом 2032 ошибку...

package ru.kyzi007.media
{
import flash.display.Loader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLStream;
import flash.utils.ByteArray;

import ru.kyzi007.events.TrackEvent;
import ru.kyzi007.log.Log;

/**
* Created by IntelliJ IDEA kyzi007@rambler.ru
* Date: 04.07.12
* Time: 21:59
*/

public class VideoMpeg extends EventDispatcher
{
private var _loader : Loader = new Loader();
private var _stream : URLStream = new URLStream();
private var _buffer : ByteArray;
private var _write : Boolean = false;
private var _markerDetection : Boolean = false;
private var _request : URLRequest;
private var _isInit : Boolean;

public function VideoMpeg ()
{
}

public function close () : void
{
Log.log('VideoMpeg::close', Log.METHODS);
_stream.close();
}

public function load (url : String, header : String) : void
{
_request = new URLRequest(url);
if (header) _request.requestHeaders = new Array(new URLRequestHeader("Authorization", header));
_stream.load(_request);
_stream.addEventListener(ProgressEvent.PROGRESS, onProgress);
_stream.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatus)
_stream.addEventListener(IOErrorEvent.IO_ERROR, ioError);
_stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, sertError);
Log.log('VideoMpeg::load '+ url, Log.METHODS);
}

private function sertError (event : SecurityErrorEvent) : void
{
Log.log('VideoMpeg::sertError',event, Log.CRIRICAL)
}

private function ioError (event : IOErrorEvent) : void
{
Log.log('VideoMpeg::ioError',event)
}

private function httpStatus (event : Event) : void
{
Log.log('VideoMpeg::httpStatus',event)
}

private function onProgress (event : ProgressEvent) : void
{
Log.log('onProgress' + _stream.bytesAvailable, Log.DATA);

var byte : int;
while (_stream.bytesAvailable > 0)
{
byte = _stream.readUnsignedByte();
if (_write) _buffer.writeByte(byte);
if (_markerDetection)
{
switch (byte)
{
case 0xD8:
_write = true;
_buffer = new ByteArray();
_buffer.writeByte(0xFF);
_buffer.writeByte(0xD8);
break;
case 0xD9:
_write = false;
_buffer.writeByte(0xD9);
_loader.loadBytes(_buffer);
break;
}
}
_markerDetection = (byte == 0xFF);
}
if (_loader.width != 0 && _loader.height != 0 && !_isInit) {
_isInit = true;
dispatchEvent(new TrackEvent(TrackEvent.INIT));
}
}

public function get video () : Loader
{
return _loader;
}

public function get video_width () : int {return _loader.content ? _loader.content.width : 0;}

public function get video_height () : int {return _loader.content ? _loader.content.height : 0;}
}
}

Krusty
04.08.2012, 13:41
Видео, урл - для теста какое?

kyzi007
04.08.2012, 14:09
http://wut911.dyndns.org:8111/stream

wvxvw
04.08.2012, 15:04
А что такое ошибка 2032? Это что-то связанное с настройками безопасности?
Это загружаются картинки так из motion JPEG? :) Там же по-идее в файле должна быть записана длина, чтобы по одному байту не считывать.
Я формат наизусть не знаю, но в любом случае искал бы более гуманный способ загрузки.

kyzi007
04.08.2012, 15:27
Там с камер по другому транслировать не могут.
2032 - поток не найден. IO Error.
В консоли хромовской видно что доступ дал сбой (отменено!).

wvxvw
05.08.2012, 12:01
Не, я имел в виду более гуманный способ - это найти то место где в файле указано размер картинки (длину в байтах) и byteArray.copyBytes() вместо того, чтобы по одному байту копировать, так, ну как минимум будет быстрее. Даже если такого в самом формате нет (в чем я сильно сомневаюсь), то прочитать по байту, а потом все за один раз скопировать - все равно лучше, т.как память под новый массив будет выделятся всего один раз вместо того, чтобы все время нарасчивать.

А ошибка возникает во врема чтения, или еще до того? Возможно, ради эксперимента есть смысл подождать немного и потом начать считывать? Ну и в конце концов, а кто выдает эту ошибку, URLStream или Loader? Может байты не правильно прочитаны и Loader не видит весь файл / там появляются какие-то артифакты?

kyzi007
05.08.2012, 22:23
Там консоль броузера говорит что "отменено" и красит красненьким запрос.
Выдает ошибку URLStream.