Это только частичный ответ, так как я тоже застрял на этом.
Если файлы уже в формате 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