Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не работает NetStream.Seek() (http://www.flasher.ru/forum/showthread.php?t=158045)

ERrorMAKros 14.06.2011 15:39

Не работает NetStream.Seek()
 
Добрый день,
Cтолкнулся вот с какой проблемой:
Средствами NetStream воспроизвожу видео (локально или с любого возможного адреса).

Некоторое видео содержит Метадату. Из метадаты получаю массив в котором есть array значение seekpoints.
Значение имеет такой вот вид:
Код:

seekpoints(:Array) = [
[0] = {offset: 3209009, time: 0},
[1] = {offset: 3662767, time: 10},
[2] = {offset: 4084599, time: 20},
[3] = {offset: 4165723, time: 21.72},
...
]

В забуференном участке видео пытаюсь переходить на существующие (руководствуясь значениями в массиве) временные отрезки:
Код AS3:

nsNetStream.inBufferSeek = true;
nsNetStream.seek(seekpoints[3].time); // переход на 21.72

Но - безрезультатно (( Так же безрезультатен переход в любые другие позиции которые описаны в массиве, но что странно что это проблема только когда я пытаюсь делать переход вперед от текущей позиции, переход в обратную сторону (назад) работает, ...но как то странно, с неточным отступом. Хотелось бы разобраться как в "паузе" осуществить переход в любую позицию видео строго по значению минута:секунда.

Подскажите - есть ли возможность перемещать позицию в видео средствами seek, к примеру, на +/- пол секунды?
Буду благодарен за информацию о тонкостях позиционирования!

kackbip 14.06.2011 15:59

На сколько я знаю, перематывает только на положение кейфрейма. Чем реже кейфреймы в видео тем менее точно может быть сделан seek.
Почему не работает seek вперед - хз... у меня такое было только с недогруженным видео.

У вас прогрессивная загрузка или потоковое вещание?

перемотка на +-0.5 сек:
Код AS3:

ns.seek(ns.time+-0.5);


wvxvw 14.06.2011 16:00

На сколько я понимаю, то для этого нужно, чтобы видео было в буффере. В смысле то место, куда вы собираетесь переходить. Если оно еще не загрузилось, то как бы не получится... А вообще, если вы можете использовать эту фичу, т.е. версия плеера позволяет, так я бы делал URLStream + appendBytes, так хоть контроль есть за тем что и когда загружается. Ю-тьюб тоже так делает. Доверять адобовским АПИ в том что связано с точностью или надежностью, уже столько раз обжигался, что ну его задумываться :) Как правило все все равно заканчивается тем, что нужно делать используя какие-то обходные пути с минимальной привязкой к высокоуровневым АПИ. (Уже не говоря о маразматическом дизайне - какого-то лешего размер буффера в Адоби считают в секундах ожидания загрузки - это ж еще додуматься до такого надо было...)

kackbip 14.06.2011 16:05

Цитата:

Сообщение от wvxvw (Сообщение 1003660)
размер буффера в Адоби считают в секундах ожидания загрузки

Чего-чего? :)
Чуть подробнее пожалуйста.

ERrorMAKros 14.06.2011 16:12

Мной описанная проблема возникает даже при локальном проигрывании видео файла! Т.е. я осуществляю переход на необходимые мне позиции в видео ролике тогда когда bytesLoaded == bytesTotal. Даже когда буфер заполнен, переход вперед - не работает. Если произвольно баловаться с величиной отступа (nsNetStream.time + N) иногда срабатывает, иногда - нет (т.е. - остаюсь в той же позиции, от которой пытался перематывать). Я так понял что еще многое зависит от видео исходника (загружаемого .flv, .mp4). Видимо величина отступа между keyframe`ами задается еще на стадии кодирования. Пока что во всех моих случаях даже на вооружении с данными из metadata - все равно ничего не хочет работать, или работает - но с какими то видео роликами - да, а с какими то - нет. Найти золотую середину - не получается, ...хотя даже если я задам отступ на +/- 15 секунд то это не решает мою задачу. Основное требование - это смещение кадров хотя бы на пол секунды вперед/назад. Это вообще возможно?

kackbip 14.06.2011 16:22

Цитата:

Я так понял что еще многое зависит от видео исходника (загружаемого .flv, .mp4). Видимо величина отступа между keyframe`ами задается еще на стадии кодирования.
Да, это так. Думаю проблема именно в исходнике файла. Попробуйте скачать с ютуба пару тройку файликов и проверьте на них. Если проблема не воспроизведтся то вполне возможно у вас битые файлы.
Корректно ли ролики воспроизводятся другими проигрывателями?

ERrorMAKros 14.06.2011 17:35

Воспроизведение корректно!!! Все замечательно показывает, проблема только с функцией seek(). Мне нужно создать покадровый переход вперед/назад с отступом минимум в пол секунды. Т.е. я перехожу в режим паузы и начинаю seek`ать видео - ...и вот на этом самом месте встречаюсь с кучей трудностей.

wvxvw 14.06.2011 18:05

ERrorMAKros
Вам нужно смотреть всякие backBufferLength, backBufferTime, bufferLength, bufferTime, bufferTimeMax и т.п. В том смысле, что это не важно откуда вы его проигываете. Буфер - это очень простая концепция, это просто колличество байт которые хранятся в оперативной памяти, и из которых плеер может тут же забрать и (возможно декодировать, а может и нет) видео.

kackbip
Я это говорю к тому, что мне совсем не интересны свойства типа bufferTimeMax / maxPauseBufferTime - потому что они все в секундах. Мерять буффер в секундах, это все равно, что мерять расстояние в литрах. Но я не могу задать размер буффера в байтах, никак. Именно по-этому я еще не видел ни одного адекватного плеера во флеше, который мог бы внятно сообщить о том, что он загружает, сколько уже загрузилось, сколько осталось, сколько я уже могу посмотреть и т.п.
Почему идиотский дизайн - потому что буфер - это очень просто, и у него технически нет столько параметров и методов, которые откуда-то есть у NetStream, но в совокупности все методы этого класса не позволяют осуществить мимально нужную работу на вменяемом уровне.
maxPauseBufferTime - кроме всего остального, ничего вообще не говорит о буфере. Смысл этого свойства - сколько "времени" загружать наперед, если плейбек поставлен на паузу. Естественно, что я не знаю и знать не могу, и без того, что я буду знать сколько байтов нужно для того, чтобы воспроизвести одну "секунду", я могу этот параметр установить только наугад. Я даже порядок не смогу предположить, то ли 1 секунду, то ли 10, то ли 100...

ERrorMAKros 14.03.2012 20:08

Реализовал загрузку netStream.appendBytes() - в процессе загрузки получаю onMetaData,
видео благополучно проигрывается от начала до конца.

При выполнении netStream.Seek(time + 10) даже в полностью забуференном видео получаю:
NetStatusEvent: "NetStream.Seek.Notify"
cо значением seekPoint: time + 10

и - все! Больше ничего не происходит!
netStream буфер (в соответствии с документацией) - после Seek(); ...сбрасывается,
а что мне в NetStream.Seek.Notify делать что бы возобновить проигрывание с нужного участка времени?

Genzo 15.03.2012 11:37

Код AS3:

netStream.seek(netStream.time-3);
netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK);



Часовой пояс GMT +4, время: 15:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.