ActionScript 3: постановка в очередь FLV с использованием netstatus и cuepoints
Я создаю флеш-сайт, который использует видео-переходы для перехода из раздела в раздел. Фон каждого раздела представляет собой фотографию в кадре с более высоким разрешением, чем сами видео перехода, которые масштабируются во время перехода. Первый кадр каждого видеоперехода является текущим фоновым изображением, а последний кадр каждого видеоперехода является фоновым изображением пункта назначения. Грубо говоря, это предполагаемый поток навигации по сайту:
Состояние покоя:
высокое разрешение изображения на переднем плане, без элементов видео
Пользователь нажимает на элемент на навигации:
Flash подготавливает FLV через объект netstream и буферизирует его, что достигается с помощью функции netstream.play(). После получения события Netstatus.Buffer.Full объект netstream приостанавливается и присоединяется к видеообъекту, который затем добавляется в список отображения позади изображения высокого разрешения на переднем плане. Как только видео объект был добавлен на сцену, изображение высокого разрешения на переднем плане альфа-канала (через анимацию движения), оставляя только фоновое видео. Когда на переднем плане заканчивается анимация, воспроизводится видео на заднем плане. Как только NetStream.Play.Stop получен, процесс происходит в обратном порядке; то есть новое изображение переднего плана с высоким разрешением переворачивается поверх видеослоя, и видео удаляется со сцены, как только это будет сделано.
Я не думаю, что есть что-то не так (по крайней мере, в принципе) с потоком, который я обрисовал выше, и не похоже, что это должно быть так сложно сделать. Однако у меня не было конца проблем с первоначальной настройкой объекта FLV/video. Сначала казалось, что FLV не выстраивался в очередь должным образом, и я имею в виду, что изображение на переднем плане высокого разрешения перевернулось, обнажив белый экран, и видео появилось и начало воспроизводиться только через секунду или две. (Первый кадр FLV определенно не белый).
Я понятия не имел, что могло быть причиной такого поведения, но хакерски добавил таймер, который воспроизводит netstream в течение примерно 100 мс после получения "Buffer.Full", тем самым продвигая видео дальше того, что могло вызывать белый экран. Это работало хорошо локально, но как только я поместил сайт на хост разработки, он вернулся к белому экрану во время переходов. Раздражает то, что увеличение хакерской задержки примерно до 2 с избавило от проблемы белого экрана на удаленных серверах, но результаты были непредсказуемыми; в зависимости от скорости соединения вы можете видеть, что все работает отлично, или вы можете попасть в видео, которое уже воспроизводилось в течение секунды или двух.
Я также пробовал подобные подходы, используя bytesLoaded/bytesTotal вместо событий netStatus, но безрезультатно. Мой последний эксперимент был с использованием контрольных точек; во время кодирования FLV я добавлял ключевую точку 0,2 секунды в FLV и ждал ТО, прежде чем перевернуть передний план; еще раз, это работало локально, но я был обработан к промежуточному белому прежде, чем видео сработало при тестировании на удаленном сервере.
У меня действительно заканчиваются идеи, и я буду очень признателен за любые советы, которые вы, ребята, можете дать. Большое спасибо за ваше время и внимание!
Джастин
1 ответ
FLVs - иногда хитрые звери.
Я собираюсь посмотреть, смогу ли я выкопать некоторый код, который я написал некоторое время назад, чтобы справиться со всем этим. Тем временем мне нравится твоя идея о контрольных точках, и я знаю, почему у тебя с ними проблемы. Контрольные точки фактически привязаны к ключевым кадрам - поэтому вам нужно убедиться, что ваша ключевая точка размещена ПОСЛЕ вашего второго ключевого кадра - это обеспечит отображение по крайней мере первого ключевого кадра видео.