Потоковая передача нескольких файлов FLV через сервлет Java в виде одного файла - PullRequest
2 голосов
/ 07 апреля 2011

Я пытаюсь реализовать сервлет Java, работающий на Tomcat, способный передавать несколько файлов FLV в клиентские браузеры, имеющие JWPlayer.Суть в том, что мне нужно потоковое воспроизведение нескольких файлов по одному и иногда начинать потоковую передачу с середины первого клипа, и мне нужен JWPlayer, чтобы думать, что длительность файла - это длительность всех клипов, вместе взятых.

MyСервлет работал бы хорошо, если бы я объединил все клипы в один FLV-файл, вставил метаданные (используя yamdi) и затем передал их в поток.Но это может быть довольно много времени.Я попытался отправить проигрывателю метаинформацию для файла, который я сначала передаю из середины, а затем продолжаю и передаю из середины, но, похоже, это не работает.Я попытался поработать с параметром duration в метаданных, но безрезультатно.

Я думаю, это потому, что я пропускаю теги, когда начинаю потоковую передачу с середины клипа.Можно ли по-человечески создать теги при обработке потока байтов до того, как сервлет отправит его?

1 Ответ

0 голосов
/ 05 декабря 2011

Вам не нужны метаданные, кроме начального заголовка FLV и описания отдельных кадров. Пока ваши кадры FLV правильно и атомарно запускаются и останавливаются, то, что вы делаете, кажется мне очень возможным. (я подумал сделать что-то подобное, уже написав анализатор FLV.) Не отправляйте заголовок длины. ;) Две вещи могут сделать все это намного проще:

  1. убедитесь, что вы закодировали видео с небольшим интервалом ключевого кадра. Вы не сможете перемещаться между клипами при любом более высоком разрешении, чем это. Все, что меньше 1, вероятно, будет проблематичным, гораздо более высокая скорость видео.
  2. предварительно разберите все ваши видеофайлы на сегменты. Когда сервлет называется,
    1. отправить заголовок FLV
    2. чтение и запись целых файлов сегментов на клиент 1 - для переключения видео, перехода к другой группе файлов сегментов

Пример, который предполагает, что вы хотите отправить каждый оригинальный файл с самого начала:

send(FLV_HEADER)
i = 0
while(send file 1 condition == true)
   send(file-1-segment i++)
i = 0
while(send file 2 condition == true)
   send(file-2-segment i++)

(В качестве альтернативы вы можете отобразить некоторые индексы и использовать их для чтения фреймов из середины файла. Так и было.)

...