PDA

Просмотр полной версии : OSMF как же сделать скриншот видео?


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

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

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
пробовал. Попробовал еще раз.
при

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 (если есть аппаратная возможность), так оно рисуется и работает значительно быстрее, но есть ряд ограничений (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/media/StageVideo.html) "You cannot bitmap cache the video or use BitmapData to access it."
Чтобы отключить отрисовку в stageVideo нужно просто поставить флаг
OSMFSettings.enableStageVideo = false;

ZergMaster
28.08.2014, 16:51
УРАааа!
Огромное спасибо, Nooob!

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

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

там, где делаем скрин -

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
С прошлой проблемы справился при помощи МЕГА-костыля


//эта функция повешена на кнопке "сделать скрин" на панели плеера
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()

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