![]() |
Не работает NetStream.Seek()
Добрый день,
Cтолкнулся вот с какой проблемой: Средствами NetStream воспроизвожу видео (локально или с любого возможного адреса). Некоторое видео содержит Метадату. Из метадаты получаю массив в котором есть array значение seekpoints. Значение имеет такой вот вид: Код:
seekpoints(:Array) = [Код AS3:
Подскажите - есть ли возможность перемещать позицию в видео средствами seek, к примеру, на +/- пол секунды? Буду благодарен за информацию о тонкостях позиционирования! |
На сколько я знаю, перематывает только на положение кейфрейма. Чем реже кейфреймы в видео тем менее точно может быть сделан seek.
Почему не работает seek вперед - хз... у меня такое было только с недогруженным видео. У вас прогрессивная загрузка или потоковое вещание? перемотка на +-0.5 сек: Код AS3:
|
На сколько я понимаю, то для этого нужно, чтобы видео было в буффере. В смысле то место, куда вы собираетесь переходить. Если оно еще не загрузилось, то как бы не получится... А вообще, если вы можете использовать эту фичу, т.е. версия плеера позволяет, так я бы делал URLStream + appendBytes, так хоть контроль есть за тем что и когда загружается. Ю-тьюб тоже так делает. Доверять адобовским АПИ в том что связано с точностью или надежностью, уже столько раз обжигался, что ну его задумываться :) Как правило все все равно заканчивается тем, что нужно делать используя какие-то обходные пути с минимальной привязкой к высокоуровневым АПИ. (Уже не говоря о маразматическом дизайне - какого-то лешего размер буффера в Адоби считают в секундах ожидания загрузки - это ж еще додуматься до такого надо было...)
|
Цитата:
Чуть подробнее пожалуйста. |
Мной описанная проблема возникает даже при локальном проигрывании видео файла! Т.е. я осуществляю переход на необходимые мне позиции в видео ролике тогда когда bytesLoaded == bytesTotal. Даже когда буфер заполнен, переход вперед - не работает. Если произвольно баловаться с величиной отступа (nsNetStream.time + N) иногда срабатывает, иногда - нет (т.е. - остаюсь в той же позиции, от которой пытался перематывать). Я так понял что еще многое зависит от видео исходника (загружаемого .flv, .mp4). Видимо величина отступа между keyframe`ами задается еще на стадии кодирования. Пока что во всех моих случаях даже на вооружении с данными из metadata - все равно ничего не хочет работать, или работает - но с какими то видео роликами - да, а с какими то - нет. Найти золотую середину - не получается, ...хотя даже если я задам отступ на +/- 15 секунд то это не решает мою задачу. Основное требование - это смещение кадров хотя бы на пол секунды вперед/назад. Это вообще возможно?
|
Цитата:
Корректно ли ролики воспроизводятся другими проигрывателями? |
Воспроизведение корректно!!! Все замечательно показывает, проблема только с функцией seek(). Мне нужно создать покадровый переход вперед/назад с отступом минимум в пол секунды. Т.е. я перехожу в режим паузы и начинаю seek`ать видео - ...и вот на этом самом месте встречаюсь с кучей трудностей.
|
ERrorMAKros
Вам нужно смотреть всякие backBufferLength, backBufferTime, bufferLength, bufferTime, bufferTimeMax и т.п. В том смысле, что это не важно откуда вы его проигываете. Буфер - это очень простая концепция, это просто колличество байт которые хранятся в оперативной памяти, и из которых плеер может тут же забрать и (возможно декодировать, а может и нет) видео. kackbip Я это говорю к тому, что мне совсем не интересны свойства типа bufferTimeMax / maxPauseBufferTime - потому что они все в секундах. Мерять буффер в секундах, это все равно, что мерять расстояние в литрах. Но я не могу задать размер буффера в байтах, никак. Именно по-этому я еще не видел ни одного адекватного плеера во флеше, который мог бы внятно сообщить о том, что он загружает, сколько уже загрузилось, сколько осталось, сколько я уже могу посмотреть и т.п. Почему идиотский дизайн - потому что буфер - это очень просто, и у него технически нет столько параметров и методов, которые откуда-то есть у NetStream, но в совокупности все методы этого класса не позволяют осуществить мимально нужную работу на вменяемом уровне. maxPauseBufferTime - кроме всего остального, ничего вообще не говорит о буфере. Смысл этого свойства - сколько "времени" загружать наперед, если плейбек поставлен на паузу. Естественно, что я не знаю и знать не могу, и без того, что я буду знать сколько байтов нужно для того, чтобы воспроизвести одну "секунду", я могу этот параметр установить только наугад. Я даже порядок не смогу предположить, то ли 1 секунду, то ли 10, то ли 100... |
Реализовал загрузку netStream.appendBytes() - в процессе загрузки получаю onMetaData,
видео благополучно проигрывается от начала до конца. При выполнении netStream.Seek(time + 10) даже в полностью забуференном видео получаю: NetStatusEvent: "NetStream.Seek.Notify" cо значением seekPoint: time + 10 и - все! Больше ничего не происходит! netStream буфер (в соответствии с документацией) - после Seek(); ...сбрасывается, а что мне в NetStream.Seek.Notify делать что бы возобновить проигрывание с нужного участка времени? |
Код AS3:
|
| Часовой пояс GMT +4, время: 15:52. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.