PDA

Просмотр полной версии : Как проиграть видео с определенной секунды


kyzi007
03.01.2010, 02:29
Итак что есть - потоковое видео.


play () метод
public function play(, [start, length, reset, remoteConnection, virtualKey]):void

name:Object Обязательное Имя записанного файла, идентификатор для данных в реальном времени, опубликованных NetStream.publish(), или значение false. Если значение равно false, воспроизведение потока прекращается и любые дополнительные параметры игнорируются. Для получения дополнительной информации о синтаксисе имени файла см. таблицу с форматами файлов ниже следующей таблицы.

start:Number Необязательно Время запуска (в секундах). Допустимые значения: -2, -1, 0 или любое положительное число. Значение по умолчанию: -2. В этом случае сначала идет поиск потока в реальном времени, затем — записанного потока. Если ни один из них не будет найден, то будет открыт поток в реальном времени. Если значение равно -1, воспроизводится только поток в реальном времени. Если значение равно 0 или представлено положительным числом, воспроизводит записанный поток, начиная с секунд, указанных в параметре start.


Вроде все просто и даже очень. Делаем _stream.play('video.flv', 5)
И вуаля - видео будет проигранно с 5 секунды.

Щазз, проигрывает с 0 секунды... play2() - тоже.



var option:NetStreamPlayOptions = new NetStreamPlayOptions();
option.start = persent * _time;
option.streamName = _url;
_stream.play2(option);
trace( persent * _time); // 5
trace(_stream.time); // 0!!!!!


Есть еще штука



seek () метод
public function seek(offset:Number):void

Осуществляет поиск ключевого кадра (так называемого I-кадра), расположенного ближе всего к указанной точке. Ключевой кадр размещается в точке смещения, измеряемой в секундах от начала потока.



Эта штука работает ПОЧТИ как надо - тоесть она _stream.seek(5) проиграет с 5 секунды.
НО! Если там есть ключевой кадр, иначе будет неприятный рывок...

Уже пол дня шерстю хелп не могу найти такую банальную вещь - КАК проиграть видео с определенной секунды!!!

wvxvw
03.01.2010, 02:48
На самом деле вещь не банальная...
Судя по тому, что вы описали, видео у вас не потоковое, а загружается используя буферизацию (т.е. вы не используете FMS / Red5 / Wowza или аналогичные решения), а просто отдаете FLV файл.
Чтобы начать получать видео с нужного кадра вам нужно либо действительно потоковое видео, где серверная часть умеет по требованию вырезать запрошеную часть FLV, приклеить к ней заголовки и отослать так, чтобы флеш плеер это понял.
seek() будет работь и с буферизацией, но, как вы обратили внимание, точность оставляет желать лучшего. Что можно сделать: примерно рассчитать предыдущий ключевой кадр, отключить звук и картинку и проиграть видео до нужного времени, а потом включить все обратно... - недостатки очевидны, медленно и точность все равно может пострадать.
Можно распарсить видео на кадры (если видео короткое) сгенерировать из него MovieClip и проиграть как встроенное видео... - недостатки - ресурсоемко и долго...
Ну или попробовать какой-нибудь из серверов умеющих отдавать потоковое видео. Кроме вышеперечисленных есть интересная разработка:
http://www.flasher.ru/forum/showthread.php?t=134028

kyzi007
03.01.2010, 03:19
Ужас...
Удаффком не приветстуется
Попробую сделать вид что не заметила рывков, и поставить pause/resume где возможно...
А то что видео успело загрузить ту секунду в которую я хочу перейти - это тоже никак не влияет?

wvxvw
03.01.2010, 04:55
>> А то что видео успело загрузить ту секунду в которую я хочу перейти - это тоже никак не влияет?
Нет, это значения не имеет.

kyzi007
03.01.2010, 11:37
Спасибо.