Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   OSMF как же сделать скриншот видео? (http://www.flasher.ru/forum/showthread.php?t=208780)

ZergMaster 27.08.2014 23:56

OSMF как же сделать скриншот видео?
 
Привет друзья!
Замучился со своим вопросов... перерыл пол интернета, в том числе и этот форум.
Там и не могу понять, как же реализовать screenshot во Flash по технологии OSMF?

Стандартные методы дают только пустой белый битмап...
Код AS3:

var raw:BitmapData = new BitmapData(300, 450);
                                raw.draw(videoStream.mediaPlayerSprite, new Matrix());
                        var bit:Bitmap = new Bitmap(raw);
                                bit.x = 30
                        main._this.addChild(bit);


GBee 28.08.2014 00:09

а если фоткать контейнер плеера?

ZergMaster 28.08.2014 00:22

пробовал. Попробовал еще раз.
при
Код AS3:

                        var raw:BitmapData = new BitmapData(300, 450);
                                raw.draw(videoStream.mediaPlayerSprite.mediaContainer, new Matrix());
                        var bit:Bitmap = new Bitmap(raw);
                                bit.x = 30
                        main._this.addChild(bit);;

та же самая фигня - показывает просто белый прямоугольник

Добавлено через 43 секунды
может кто-нить знает, где раздобыть нормальную документацию на OSMF? а то стандартная адобовская вообще какая-то куцая совсем...

Добавлено через 48 минут
А ведь казалось бы - что может быть проще принтскрина?.. =\ абалдеть..

GBee 28.08.2014 01:51

Может там секьюритиеррор проскакивает?

Nooob 28.08.2014 02:26

Дело в том что по умолчанию OSMF рисует видео не в дисплей листе, а в слое stageVideo (если есть аппаратная возможность), так оно рисуется и работает значительно быстрее, но есть ряд ограничений "You cannot bitmap cache the video or use BitmapData to access it."
Чтобы отключить отрисовку в stageVideo нужно просто поставить флаг
Код AS3:

OSMFSettings.enableStageVideo = false;


ZergMaster 28.08.2014 16:51

УРАааа!
Огромное спасибо, Nooob!

Все заработало.
Значит так. Перед созданием MediaPlayerSprite пишем
Код AS3:

import org.osmf.utils.OSMFSettings;
OSMFSettings.enableStageVideo = false;

там, где делаем скрин -
Код AS3:

public function ScreenShot():void {
 
                        main.TRACER('function makeScreen');
 
                        var raw:BitmapData = new BitmapData(videoStream.mediaPlayerSprite.width, videoStream.mediaPlayerSprite.height);
                                raw.draw(videoStream.mediaPlayerSprite, new Matrix());
                        var bit:Bitmap = new Bitmap(raw);
                        var brr:ByteArray = new JPGEncoder().encode(raw);
                        var fil:FileReference = new FileReference();
                                fil.save(brr, "image.jpg");
 
                        }


ZergMaster 19.09.2014 21:43

На самом деле какой-то отстой....
Косяк в том, что скрин получается фигового качества. А если развернуть плеер на весь экран - то качество остается, буд-то оно маленькое. И неудивительно, ведь он фоткает саму флешку...

По сему надо как-то менять метод. Расскажите, кто может быть знает, есть ли какая-то возможность достать из потока напрямую кадр? Как добраться непосредственно до массива битов, подгружаемых в плеер? Тогда можно было бы делать стоп-кадр независимо от размера самого плеера - просто дергать из потока кадр в высоком разрешении... Есть у кого-нибудь быть может мысли, куда топать?

Nooob 19.09.2014 22:40

может потому что JPGEncoder? попробуй PNGEncoder

ZergMaster 20.09.2014 00:04

не, не помогает

Добавлено через 56 минут
вопрос больше в том - как вытащить кадр из видео потока?

ZergMaster 08.04.2015 00:08

С прошлой проблемы справился при помощи МЕГА-костыля

Код AS3:

//эта функция повешена на кнопке "сделать скрин" на панели плеера
public function clickScreen(e:MouseEvent=null):void {
                //здесь добавляю мувик SkrinPanel, делающий маленький скрин и заслоняющий собой видео;
                //в котором строка подтверждения "вы действительно хотите?" и кнопки yes/no;
                skrinPanel = new SkrinPanel(actualPlayer().videoStream.mediaPlayerSprite.mediaContainer));
                //теперь делаю видеопоток, с которого делается скрин, максимально возомжного для потока разрешения
                //пользователь этого не видит, так как видео заслоняет статичная картинка, а видео маскируется
                actualPlayer().videoStream.sizeToSkrin(true);
                }
 
//эта функция вызывается по нажатию кнопки yes в skrinPanel
public function ScreenShot():void {
                //в которой и происходит копирование с видео большого разрешения
                var raw:BitmapData = new BitmapData(videoStream.getmpWIDTH(), videoStream.getmpHEIGHT());
                    raw.draw(videoStream.mediaPlayerSprite.mediaContainer, new Matrix());
                var brr:ByteArray = new ByteArray();
                    brr = new PNGEncoder().encode(raw);
                filArr.push(new FileReference());
                var nameSTR:String = 'streamPlayer_screenshot_'+String(Math.floor(Math.random()*100000))+String(videoStream.hronometrash)+'.png';
                filArr[filArr.length-1].save(brr, nameSTR);
 
                resizePlayer();
              //теперь можно удалять заслонку и возвращать видео к исходному размеру
              videoStream.sizeToSkrin(false);
}

НО

теперь возникла другая проблема. Сейчас требуется расширить плеер, чтобы через него можно было воспроизводить HDS, в данном случае - поток с расширением .f4m . Вот тут все стопорится на самом первом скрине - так как он вообще совсем не хочет скриниться, на первый же .draw пишет
Код:

SecurityError: Error #2123: Security sandbox violation: BitmapData.draw: file:///Z|/home/test1.ru/www/strimPlayer.swf cannot access null. No policy files granted access.
        at flash.display::BitmapData/draw()

дравить пробовал уже всё, что можно. Ни в какую. Печально и то, что кое-где из англоязычных источников написано, что это вроде как вообще невозможно! Что представляется мне очень странным. Неужели это в действительности так?


Часовой пояс GMT +4, время: 21:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.