|
|
|||||
OSMF как же сделать скриншот видео?
Привет друзья!
Замучился со своим вопросов... перерыл пол интернета, в том числе и этот форум. Там и не могу понять, как же реализовать screenshot во Flash по технологии OSMF? Стандартные методы дают только пустой белый битмап...
__________________
while(live()) { hope(); } |
|
|||||
пробовал. Попробовал еще раз.
при 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 минут А ведь казалось бы - что может быть проще принтскрина?.. =\ абалдеть..
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
Дело в том что по умолчанию OSMF рисует видео не в дисплей листе, а в слое stageVideo (если есть аппаратная возможность), так оно рисуется и работает значительно быстрее, но есть ряд ограничений "You cannot bitmap cache the video or use BitmapData to access it."
Чтобы отключить отрисовку в stageVideo нужно просто поставить флаг |
|
|||||
УРАааа!
Огромное спасибо, Nooob! Все заработало. Значит так. Перед созданием MediaPlayerSprite пишем там, где делаем скрин - 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"); }
__________________
while(live()) { hope(); } |
|
|||||
На самом деле какой-то отстой....
Косяк в том, что скрин получается фигового качества. А если развернуть плеер на весь экран - то качество остается, буд-то оно маленькое. И неудивительно, ведь он фоткает саму флешку... По сему надо как-то менять метод. Расскажите, кто может быть знает, есть ли какая-то возможность достать из потока напрямую кадр? Как добраться непосредственно до массива битов, подгружаемых в плеер? Тогда можно было бы делать стоп-кадр независимо от размера самого плеера - просто дергать из потока кадр в высоком разрешении... Есть у кого-нибудь быть может мысли, куда топать?
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
может потому что JPGEncoder? попробуй PNGEncoder
|
|
|||||
не, не помогает
Добавлено через 56 минут вопрос больше в том - как вытащить кадр из видео потока?
__________________
while(live()) { hope(); } |
|
|||||
С прошлой проблемы справился при помощи МЕГА-костыля
//эта функция повешена на кнопке "сделать скрин" на панели плеера 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 пишет дравить пробовал уже всё, что можно. Ни в какую. Печально и то, что кое-где из англоязычных источников написано, что это вроде как вообще невозможно! Что представляется мне очень странным. Неужели это в действительности так?
__________________
while(live()) { hope(); } |
Часовой пояс GMT +4, время: 12:41. |
|
« Предыдущая тема | Следующая тема » |
Теги |
osmf , screenshot |
|
|