Как я могу использовать BitmapData.draw с NetStream.appendBytes? - PullRequest
8 голосов
/ 09 апреля 2011

Я использую NetStream.appendBytes () для воспроизведения локального видео (без участия сервера) в Adobe AIR . Я хотел бы использовать BitmapData.draw(), чтобы сделать снимок видео, но я получаю эту ошибку:

Ошибка № 2123: нарушение изолированной программной среды безопасности: BitmapData.draw: невозможно получить доступ к нулю. Нет доступа к файлам политики.

Вот пример кода:

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;
        }
    }
}

Это только пример использования кода для объяснения. Ошибка произойдет при вызове метода getImage во время воспроизведения видео. В ошибке упоминается, что файл политики не найден. Поскольку файл загружается локально, на самом деле нет места для размещения файла политики. Есть ли где-то параметр политики, который нужно установить, или функция BitmapData.draw просто недоступна при использовании appendBytes?

Ответы [ 7 ]

1 голос
/ 11 августа 2011

Я думаю, что другое решение - использовать _ns.play(path), а не _ns.appendBytes().

0 голосов
/ 26 марта 2015

Я знаю, что этот вопрос действительно старый ... но я все еще сталкиваюсь с этой проблемой, и я знаю, что другие тоже будут ... Поэтому я хотел опубликовать ссылку на другой вопрос стека, где я разместил сообщение об ошибке наAdobe и обходной путь, чтобы заставить его работать.

Обходной путь для ошибки при дублировании вопроса стека

0 голосов
/ 24 мая 2012

Похоже, вы пытаетесь вызвать метод BitmapData.draw () для видео, которое не загружено, или когда объект NetStream имеет значение null.

возможное исправление: дождитесь отправки NetStream.Buffer.Full NetStatus перед вызовом draw ()

0 голосов
/ 13 марта 2012

Попробуйте поместить объект Video в MovieClip и используйте bit.draw(_movieclipInstanceName); вместо видеообъекта. Я надеюсь, что это работает.

0 голосов
/ 05 августа 2011

Вы не можете сделать снимок видео или аудио из потока rtmp, если для параметров на стороне сервера, называемых StreamVideoSampleAccess или StreamAudioSampleAccess, не установлено значение true или значение, подобное этому StreamVideoSampleAccess / StramVideoSampleAccess.Я не нашел способа сделать это, не имея доступа к стороне сервера FMS.

0 голосов
/ 01 июня 2011

У меня есть решение избавиться от ошибки песочницы при попытке нарисовать netstream.appendByte() контент.

SWF-файл получает «песочницу», потому что он ищет файл междомена по указанному вами адресу :netstream.play(null). Он ищет что-то, чего не существует.

Что ж, решение состоит в том, чтобы воспроизвести поддельный URL-адрес видео, например «netstream.play(http://myserv.com/video.flv)», с подлинным кросс-доменным файлом, и после этого вам просто нужно загрузить необходимое видео благодаря функции appendBytes.

SWF обманут!

Как бы странно это ни звучало, у меня это работает :-)

0 голосов
/ 09 апреля 2011

Попробуйте установить NetStream.checkPolicyFile = true перед вызовом функции * 1002. *загрузить файл политики с сервера загруженного SWF.Если вы не указали этот флаг во время загрузки, вы получите SecurityError при попытке получить данные пикселей из загруженного потока через BitmapData.draw().

Ссылка на ресурс Adobe: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#checkPolicyFile

...