PDA

Просмотр полной версии : byte position для FLV


Ulya
31.07.2008, 20:03
Hi all,
а можно ли каким-то образом при использовании компонента FLVPlayback отслеживать байтовую позицию для бегунка. То есть как при перетаскивании бегунка отследить событие его отпускания и при
этом получить его байтовую позицию в FLV файле?

Пытаюсь наладить стримминг видео с помощью nginx http://sysoev.ru/nginx/docs/http/ngx_http_flv_module.html.
Модуль ngx_http_flv_module делает специальную обработку передаваемых файлов: при передаче файла, начиная со смещения, указаного в аргументах запроса "start=XXX", добавляет FLV-заголовок перед запрашиваемым файлом.

wvxvw
31.07.2008, 20:27
Не, никак это не узнать, ну, разве что примерно посчитать, но точно - не возможно. Т.е. можно примерно представить сколько байтов нужно на отрисовку одного кадра, но, опять же такой параметр в SWF не передается, т.е. нужно будет его передать вместе с метадатой, например. Ну и уже просто исходя из позиции, где ткнули, считать сколько это кадров * байтов на кадр. Только если есть кью-поинты - это никак не получится принять в рассчет, т.как заранее вы никак не сможете узнать о их наличии/отсутствии.

Ulya
31.07.2008, 20:55
А как же тогда реализована такая фича тут:http://www.rich-media-project.com/php-streaming-products/php-flv-player/ ?
Там есть пхп-скрипт, которому передаётся такой же параметр position=xxxxxx
Я проследила за запросами от флэшки.
Вот тут тоже кое-что пишут: http://www.flashcomguru.com/index.cfm/2005/11/2/Streaming-flv-video-via-PHP-take-two
Но там реализовано через NetStream кажется.

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

crazyone
01.08.2008, 14:43
Мне кажется стандартный FLVPlayback не подходит под эти задачи.
В этом и проблема стандартных компонентов. Они решают стандартные задачи.

Хотя, если потеребить метадату, может быть и можно будет его прикрутить.

FLVPlayback вещает событие metadata, в котором есть всякие параметры, типа:


audiodatarate A number that is the kilobytes per second of audio.

videodatarate A number that is the video data rate of the FLV file.


Запомнить их. Потом ловить событие перетягивания ползунка и переводить из секунд(?) в байты, используя аудиодатарэйт и видеодатарэйт...
Должно быть что-то типа такого:
bytes=seconds*(audiodatarate+videodatarate);

Ulya
01.08.2008, 19:26
crazyone,
а я использую компонент FLV List Gallery от AFComponents. Но он сделан всё равно на основе FLVPlayBack.
Итак, вопрос с передачей байтовой позиции решила.

player.controls_mc.content.bar_mc.widget_mc.onRelease = function() {
//widget_mc - бегунок
delete player.controls_mc.content.bar_mc.widget_mc.onEnterFrame;
stopDrag();
if (_root.metadataReceived) {
//флаг _root.metadataReceived в 1, если получены метаданные флв
var bmcw = player.controls_mc.mask._width-player.controls_mc.content.bar_mc._x-player.controls_mc.content.volume_mc._width;
//рассчитываем длину bar_mc (прогресс-бар)
var phx = player.controls_mc.content.bar_mc.widget_mc._x;//play head _x
secpos = player.metadata.duration*phx/bmcw;//position in seconds;
trace("Pos in Sec "+secpos);
_root.bytepos = Math.floor(secpos*player.bytesTotal/player.metadata.duration)
player.getVideoPlayer(player.activeVideoPlayerIndex).close();//очищаем плеер
player.load(player.contentPath+"?start="+_root.bytepos);//запрашиваем у сервера файл с нужного нам места
}
};





В запросах к серверу видно, что файл действительно запрашивается с нужного места, например, если прокрутить видео до середины, то грузится файл меньшего размера. В это время статус: Connecting to Media. Как только файл грузится до конца, срабатывает статус Media not found. То есть файл грузится с нужной позиции. По идее gninx должен дописывать к нему заголовок так, чтобы плеер понимал, что это flv. Но где-то проблема. У кого какие мысли?
Помогите плиз. я в видео, особенно потоковом полный нуб.
Плиз.:umnik2::umnik2:

Ulya
01.08.2008, 20:12
кажется проблема в том, что передавать нужно не сам позишн, а ближайший к нему кейфрейм.
В связи с этим еще вопрос:
Как через FLVPlayBack получить список кейфреймов.
Через событие metadata никак.

wvxvw
01.08.2008, 22:03
Смотря чем генерился FLV, но, как правило список кифреймов есть в метадате.

crazyone
02.08.2008, 04:07
player.controls_mc.content.bar_mc.widget_mc.onRelease

Make me unsee this!

У кого какие мысли?

Я бы попробовал сохранить файл, который выдаст ngnix на какой-нибудь запрос и потом попытаться бы его воспроизвести.

Ulya
04.08.2008, 16:40
crazyone,
nginx выдает валидный файл только, если передаваемый ему параметр start является keyframe'ом. Когда я считаю приблизительно байтовую позицию плэйхэда- это естественно не ключ. кадр.=>нужно найти ближайший ключевой кадр.=>возникает вопрос, а как же получить список кадров, с помощью каких функций, событие метадата не даёт этот список увы.
wvxvw, вот всё, что дает метадата мне:
Encoded_With = Sorenson Squeeze
Encoded_By = Sorenson Squeeze
creationdate = Fri Aug 01 11:26:42 2008
framerate = 30
audiocodecid = 2
audiodatarate = 48
videocodecid = 2
canSeekToEnd = true
videodatarate = 364
height = 278
width = 480
duration = 901.73

crazyone
04.08.2008, 18:30
Мне кажется, что у вас вес одной секунды считается, как audiodatarate+videodatarate байт(килобайт?). Делите это на framerate, получаете вес одного кадра. Делаете округление байтовой позиции по этому значению и передаете скрипту округленное значение.

Если это не поможет, тогда я не знаю =)

UPD Поищите по поводу flvmdi. Этот софт позволяет добавлять flv-шкам в событие onMetaData массивы с позициями кейфреймов.
Именно так все реализовано на флешкомгуру, куда вы давали ссылку (http://www.flashcomguru.com/index.cfm/2005/11/2/Streaming-flv-video-via-PHP-take-two).

Ulya
04.08.2008, 20:15
crazyone,
да, верно, Соренсон добавлял не всю метадату, с помощью утилиты получилось. Я считала, что Соренсон добавляет, так как там есть галочка ставить кифреймы или нет.
Спасибо.
Буду копать дальше.

crazyone
05.08.2008, 12:06
Незачто.
Может быть Соренсоновские кейфреймы нужно как-то по другому вытягивать просто.
Хотя это может быть вообще что-то другое, про кейфреймы в Соренсоне. Нужно документацию читать ;)
Я сам с пережимом видео особо дела не имел, так что не знаю.