Потоковое видео для проигрывателя flash/html5 с использованием фреймворка Catalyst

Я разрабатываю сайт с несколькими видео в Интернете, используя Catalyst (фреймворк Perl MVC) и JWplayer, и мне нужен стабильный способ потоковой передачи видео на клиентский проигрыватель с возможностью запуска видео из случайной точки. .

Я искал в Интернете несколько способов сделать это, но не могу найти простой способ реализовать это в Catalyst (RTMP или HTTP-псевдопоток). Единственным простым примером, который я нашел, был старый скрипт Catalyst, транслирующий MP3 (http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Streaming/lib/Streaming.pm), но я не знал, будет ли это работать должным образом. если я применяю эту технику к видео.

Что было бы хорошим подходом для обслуживания онлайн-видео в Catalyst/Perl несложным способом? Или как это рекомендуется сделать?

Спасибо, парни!


person h3ct0r    schedule 28.08.2012    source источник


Ответы (2)


Это только частичный ответ, так как я тоже застрял на этом.

Если файлы уже в формате FLV, то плагин Static::Simple будет работать нормально. Я протестировал его с файлом в каталоге root/static/ и методом $c->serve_static_file. Ниже приведена моя настройка jwplayer (обернутая в готовую функцию JQuery.

<script type="text/javascript" src="[% c.uri_for('/static/js/mediaplayer-5.10') %]/jwplayer.js"></script>
<script type="text/javascript">
$(function() {
        jwplayer('mediaplayer').setup({
        'flashplayer': "[% c.uri_for('/static/js/mediaplayer-5.10/player.swf') %]",
        'id': 'playerID',
        'width': '480',
        'height': '270',
        'file': "[% c.uri_for('/download') %]/dump/ffs/root/static/transcode_jEfhmk.flv"
    }); 
});
</script>

Если файл находится в другом формате, его необходимо перекодировать. Ниже приводится моя текущая попытка. Он отлично перекодирует его, и вы даже можете передать файл для загрузки, но у меня возникли проблемы с тем, чтобы заставить jwplayer воспроизводиться из перекодированного потока.

use IPC::Open3;

#path comes in as /flv/path/to/file.avi
sub index :Path :Args {
    my ( $self, $c, @path ) = @_; 
    @path = grep($_ ne '..', @path);
    my $path = join('/',@path);
    my $abs_path = $c->config->{'serve_dir'} . '/';
    $abs_path .= join("/", @path);

    if (-r $abs_path){
        my ($stdin, $stdout, $stderr, $pid);
    #avconv 
    # -i input_file
    # -b:v video bitrate
    # -s video size
    # -r video framerate
    # -an no audio (having trouble with the audio settings)
    # -f format
    # pipe:1 send transcoded video to STDOUT
        $pid = open3($stdin, $stdout, $stderr, "avconv -i \"$abs_path\" -b:v 600k -s 320x240 -r 25 -f flv -an pipe:1");

        $c->response->content_type("video/x-flv");
        $c->response->header('Content-Disposition' => "filename=transcode.flv");
        my $chunk_size = 1048576;
        do {
            read( $stdout, my $buffer, $chunk_size );
            $c->write( $buffer );
        } while (kill(0, $pid)); #loop while transcoding process is alive
    }
}

Чтобы добавить псевдопоток, вам нужно создать контроллер, который ищет параметр запуска запроса, затем ищет его и отправляет $c->response->body дескриптору файла.

open(my $fh, "<", $path);
binmode($fh);
if ($c->req->param('start')){
    seek($fh, $c->req->param('start'), 0); 
}
$c->response->body($fh);

Одно предостережение: видео должно иметь ключевые кадры в метаданных, чтобы jwplayer мог их искать.

Из HTTP-поток страница:

Примечание. Некоторые кодировщики FLV не включают метаданные точек поиска при кодировании видео. Без этих данных HTTP-псевдопотоковая передача не будет работать. Если вы подозреваете, что в ваших видео нет метаданных, используйте наш плагин Metaviewer, чтобы проверить видео. Должен быть список точек поиска или ключевых кадров. Если его там нет, используйте инструмент FLVMDI, чтобы проанализировать FLV-видео и внедрить эти метаданные.

person Community    schedule 28.08.2012
comment
Плагин Static::Simple будет предоставлять видео (в формате FLV) проигрывателю в любой начальной позиции по запросу проигрывателя? У меня не было времени протестировать его сегодня, но я протестирую его и опубликую результаты! - person h3ct0r; 29.08.2012
comment
Похоже, я был неправ. Мое видео мгновенно буферизировалось, поэтому я не заметил, что вы не можете выполнить поиск, пропустив буферизованную часть. Похоже, нам может понадобиться реализовать псевдопотоковая передача, перехватываем параметр start и ищем его, как в Streaming.pm. По крайней мере, в байтах. Хе. - person ; 29.08.2012
comment
Спасибо за информацию, я все еще ищу стабильный и простой способ потоковой передачи. Если у меня получится, я положу, как здесь! - person h3ct0r; 06.09.2012

В конце концов, я использую apache с плагином x_send_file для доставки веб-видео (используя поиск диапазона байтов) и Amazon Cloud Front для доставки видео в формате mp4 и потоковой передачи с mp4.

Изменить: прекращено использование потокового сервера Wowza с пользовательским плагином для безопасной связи с Catalyst. Не существует надежного способа потоковой передачи видео без выделенного видеосервера, особенно для бизнеса.

person h3ct0r    schedule 25.11.2012