PDA

Просмотр полной версии : Ключевые (опорные) кадры FLV


UnVisible
23.03.2008, 18:39
Здавствуйте!

Появился наболевший вопрос.
Я PHP програмист (в АС пока относительно ламер).
Постала задача сделать плеер, но чтобы при открытии страницы с ним не отображался черный екран, а один (или несколько, в стиле слайдшоу) наилучших по качеству кадров (тоесть опорных (ключевых)) формата FLV.
Была мысль вытянуть опорные кадры средствами DirectShow, но такого модуля под ПХП да ещё и под линукс я не нашел.
Остается только 2 варианта:
1. Средствами ПХП давать запрос AS, и чтобы тот возвращал 1 (или несколько) изображений опорных кадров.
2. AS сам при загрузке вытягивал из видео 1 (или несколько) опорных кадров и делал слайдшоу.

Вопросы:
1. Как, или каким класом, из FLV формата можно выдрать опорный кадр?
2. Сужиствуют ли вообще в FLV формате опорные кадры? (если нет, тогда вопрос вообще теряет смысл).
3. Может кто знает, возможно ли на одном ПХП такое зделать?

P.S. Сколько не роюсь в инете по поводу "Описание FLV формата" или "Работа с FLV форматом" - нахожу один маразм, типа конвертеры, плееры и т.д. :(


Заранее пасибо! :)

silin
24.03.2008, 00:13
не решение, только предположения по теме:

ключевые кадры есть, NetStream.seek(offset:Number) гонит видео в кейфрейм, ближайший к offset (в секундах);
стало быть есть возможность 'сфотографировать' эти кейфреймы - BitmapData.draw(..), правда для этого надо дождаться загрузки всего потока
показать эти скриншоты в самой флешке, понятно, не вопрос..

вернуть сриншоты серверу в плеере ниже 9-ки не получиться..
в 9-ке (AS3) есть возможность послать картинку как ByteArray, декодеров под разные форматы понаписано достаточно, легко нагуглишь..

как это все можно (и можно ли вообще) в ПХП не знаю

UnVisible
24.03.2008, 10:35
Огромное спасибо! =)

Теперь хоть знаю в какую сторону копать! :drinks:

chingachgoog
24.03.2008, 12:50
стало быть есть возможность 'сфотографировать' эти кейфреймы - BitmapData.draw(..), правда для этого надо дождаться загрузки всего потока


Тут где-то на форуме вроде было решение, как не дожидаться загрузки всего потока. (кто-то про ютуб спрашивал по-моему)


вернуть сриншоты серверу в плеере ниже 9-ки не получиться..
в 9-ке (AS3) есть возможность послать картинку как ByteArray, декодеров под разные форматы понаписано достаточно, легко нагуглишь..


Не ByteArray одним жив флеш :)
Можно и ниже 9-ки передать - начиная с ФП поддерживающего битмапдату

UnVisible
26.03.2008, 16:12
Появилась проблема. Поставил Флеш 9 АС3. Загрузка видео и переход на определенный кадр работает. А вот при попытке вывести его через БитМап дает ошибку. Что я не так делаю?

Вот код скрипта:
import flash.display.Bitmap;
import flash.display.BitmapData;

var conteiner:MovieClip = _root.createEmptyMovieClip("conteiner", this.getNextHighestDepth());

var connection_nc:NetConnection = new NetConnection();
connection_nc.connect(null);

var stream_ns:NetStream = new NetStream(connection_nc);

my_video.attachVideo(stream_ns);
stream_ns.play("d:/clip.flv");
stream_ns.pause(true);
stream_ns.seek(78);

var copy_screen:BitmapData = new BitmapData(200,200);

copy_screen.draw(stream_ns);

var bit:Bitmap = new Bitmap(copy_screen);
this.addChild(bit);

Дает ошибку:
The class or interface 'flash.display.Bitmap' could not be loaded.
var bit:Bitmap = new Bitmap(copy_screen);

Total ActionScript Errors: 1 Reported Errors: 1

silin
26.03.2008, 18:18
путаница какая-то: ты пишешь (видимо и публикуешь) под 8-ку (AS2), а пытаешься пользоваться Bitmap'ом, а его там нет, о чем тебе компилятор и докладывает.

UnVisible
26.03.2008, 19:02
Ну вот это же работает (взято с примера):

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.text.TextField;

var tf:TextField = new TextField();
tf.text = "bitmap text";

var myBitmapData:BitmapData = new BitmapData(80, 20);
myBitmapData.draw(tf);
var bmp:Bitmap = new Bitmap(myBitmapData);
this.addChild(bmp);

Ну и пишу я в АС3. :(

iNils
27.03.2008, 01:55
Где вы видите в названиии раздела цифру 3?

wvxvw
27.03.2008, 03:04
Пакет flash.display в АС2 содержит один-единственный класс - BitmapData, а в АС3 их там куча, Bitmap в том числе.
Зайти в Publish Settings - Flash выставить там плеер 9 и АС3 в настройках. Ну и тему запостить в раздел про АС3 %)
ЗЫ. Про Ю-туб я спрашивал. Ну, решение... решение в том, что ФЛВ можно начинать буферить и проигрывать с любой позиции в файле. Если сервер умеет такое. Но правда никаких приемлимых результатов с этим я пока не добился =( Да, и еще, сразу скажу, пока не было события от NetStream'a NetStream.Buffer.Flush заносить чего-то в битмапдату нет смысла.
ЗЫЫ. В примере вы не используете класс Bitmap, само по себе выражение import еще не значит, что компилятор клас добавит в проект, его нужно еще где-нибудь в коде использовать. Иначе импорты типа import flash.display.*; работали бы очень плохо.

UnVisible
27.03.2008, 11:18
Где вы видите в названиии раздела цифру 3?

Я когд регился меня не пустило чето в цифру "3". Да и тема одна и таже - зачем мусорить форум, если можно продолжить здесь - и всем будет ясна суть моей проблемы в целом! =)

iNils
27.03.2008, 11:40
В раздел по AS3