Изъять кадры с FLV файла не загружая его целиком.

AlexDIXI

Новичок
Изъять кадры с FLV файла не загружая его целиком.

Здравствуйте!
Столкнулся с такой проблемой.
Задача: максимально быстро сохранить по ссылке FLV файла, 10 кадров с разных мест FLV файла.
Начал решать задачу таким образом:
1) Получаем CURL'ом заголовок файла, сохраняем размер FLV.
2) Делим размер на 10 частей.
3) Качаем с первой по 10ю часть.
4) Обрабатываем части с помощью FFMPEG получаем кадры и сохраняем в JPG

Первый файл обрабатывает а остальные нет. Пробовал "склеить" первую часть с 3м 4м., но получить кадры с этих частей не получается. Дает только с первого.
Причина такой реакции думаю из-за того что идет обрыв первого файла и когда состыковываешь третий, то из-за не продолжения второго куска, возникает ошибка. Т.е. третий файл имеет кадры но не имеет начало с целого кадра он начинается с куска кадра или что-то в этом роде. Помогите решить проблему, и получить кадры с остальных файлов. Качать полностью FLV можно и потом обрабатывать, но на это с учетом скорости загрузки и размер файла, уйдут годы. Поэтому решил качать по частям с разных мест, и потом выдергивать кадры.
 

Фанат

oncle terrible
Команда форума
"хозяин жалел собаку, и поэтому рубил ей хвост не сразу, а по частям"...
 

Вурдалак

Продвинутый новичок
Сомнительная задача. Тупо на 10 делить нельзя, естественно, т.к. есть заголовок файла, длина каждого тега может разниться, есть аудио теги etc. Ты скорее сделаешь ещё хуже.

-~{}~ 05.11.10 22:32:

http://www.adobe.com/devnet/f4v.html
 

Активист

Активист
Команда форума
Тут лучше наверное почитать на тему Flv Streaming и по спецификации протокола. В любом случае, если файл в исходном виде отдается через веб сервер (без взяких примочек на бекэнде), то сначала нужно получить заголовки (File Header + Metadata), а потом, добавлять эти заголовки к каждой части.

-~{}~ 06.11.10 10:17:

Под заголовками подразумевается заголовок файла (его первые байты), содержащие служебную информацию.

-~{}~ 06.11.10 10:24:

Вот это в помощь FLV Specification, читать с 68 странице.
 

AlexDIXI

Новичок
Активист, спасибо за информацию. Как выдернуть с помощью php этот заголовок не знаю. Искал в интернете но не нашел информацию подходящей для изъятия заголовка (

Ребята помогите изъять кадр с куска FLV файла, можно задействовать первый кусок для того что бы изъять заголовок.
Заплачу 50 вмз.
 

Вурдалак

Продвинутый новичок
Чудак-человек. Я тебе говорю, что забей на это. Чтобы получить N-й кадр, нужно считать как минимум информацию о всех предыдущих. А их много. Тухлая идея, качать надо всё.
 

AlexDIXI

Новичок
2Вурдалак я видел реально работающий скрипт. Так что я знаю о чем говорю.
 

Активист

Активист
Команда форума
AlexDIXI
Есть готовая либа getid3 (PHP) - посмотри как там реализовано выдергивание заголовка. Я использовал эту либу для вытаскивания формата, продолжительности, ширины и высоты роликов. Вытаскивается обычным бинарным чтением, далее обрабатывается по спецификации.

Ты вообще про стриминг почитал?

Вурдалак
Странно, тот же плеер YouTube может проигрывать с любого места. Кроме того, по спецификации видно, как обозначается начало кадра.

PS:
PHP:
/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at [url]http://getid3.sourceforge.net[/url]                 //
//            or [url]http://www.getid3.org[/url]                         //
//                                                             //
//  FLV module by Seth Kaufman <seth@whirl-i-gig.com>          //
//                                                             //
//  * version 0.1 (26 June 2005)                               //
//                                                             //
//  minor modifications by James Heinrich <info@getid3.org>    //
//  * version 0.1.1 (15 July 2005)                             //
//                                                             //
//  Support for On2 VP6 codec and meta information by          //
//  Steve Webster <steve.webster@featurecreep.com>             //
//  * version 0.2 (22 February 2006)                           //
//                                                             //
//  Modified to not read entire file into memory               //
//  by James Heinrich <info@getid3.org>                        //
//  * version 0.3 (15 June 2006)                               //
//                                                             //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio-video.flv.php                                  //
// module for analyzing Shockwave Flash Video files            //
// dependencies: NONE                                          //
//                                                            ///
/////////////////////////////////////////////////////////////////
-~{}~ 06.11.10 21:31:

Но анализировать тебе хеадер не нужно, просто взять его и добавить к куску.

-~{}~ 06.11.10 21:48:

Да, бегло почитал спецификацию, у FLV рамер фрейма (физический) вроде постоянен, да и есть указатели начала и конца фрейма.
 

AlexDIXI

Новичок
2Активист спасибо огромное, за старание я не обижу если получится.
Да я и говорю что flash проигрыватель понимает кусок видео а FFmpeg нет.

> Ты вообще про стриминг почитал?
Да но чем именно оно помочь может я так и не понял.
 

Вурдалак

Продвинутый новичок
Активист, не вижу в спецификации никакого намёка на то, что вычислить смещения необходимых тегов можно сразу. Я даже не уверен, что каждый видео тег будет фиксированного размера (там ещё требуется спецификацию по SWF смотреть). Т.е. нужно прыгать от одного тега к другому. Это не по файлу указателем бегать, поэтому мне и кажется затея странной.
 

Активист

Активист
Команда форума
> Да я и говорю что flash проигрыватель понимает кусок видео а
> FFmpeg нет.
Дк, технология стриминга, к любому куску фреймов добавляется заголовок , в одном из PHP Inside описывалось подробно, поищи в журналах.

Вурдалак
Там работы уж точно не на беглый просмотр спецификации.

AlexDIXI
Здесь работы не на 50 баксов, нужно перерыть спецификацию, можно проанализировать опенсоурсные декодеры и т.п.
 

Фанат

oncle terrible
Команда форума
я все-таки спрошу
объясните мне плиз, в чем принципиальная разница между
"загружая целиком"
и
"Делим размер на 10 частей. Качаем с первой по 10ю часть."
?
 

Активист

Активист
Команда форума
*****
Ему надо кусками брать, т.е., взять один ролик скажем длинной 10 секунд, потому сделать снимок, например 2, 5, 8, 10 секунды, для снижения трафика - он не хочет качать все.
 

AlexDIXI

Новичок
>Здесь работы не на 50 баксов, нужно перерыть спецификацию, можно проанализировать опенсоурсные декодеры и т.п.
2Активист договримся. Дам больше )

-~{}~ 07.11.10 09:14:

>Дк, технология стриминга, к любому куску фреймов добавляется заголовок , в одном из PHP Inside описывалось подробно, поищи в журналах.

Смысл мне в нем если мы можем это сделать сами с помощью ID3?

-~{}~ 07.11.10 09:14:

***** умом Россию не понять )
 

fixxxer

К.О.
Партнер клуба
О да. Там ответят. :D

Если сервер поддерживает отдачу с определенного оффсета (как модуль nginx flv) - то все относительно просто. Иначе придется дергать через Range и ручками искать начало кадра.
 

Нубокот

Новичок
— полезно читать тред перед ответом.
Я тред читал) И даже примерно представляю себе, зачем топикстартеру это нужно.
ТС - слушай, что про модуль нгинкс сказали. Нгинкс добавляет хедер и твой расчет летит к чертям. Рассчитывай позицию с учетом этого.

Кстати, вот, похоже, его топик на мастере:
http://www.master-x.com/forum/topics/143045/
 
Сверху