我正在开发一个网站,使用Catalyst(一个perl MVC框架)和JWplayer在线提供多个视频,我需要一种稳定的方式将视频流式传输到客户端播放器,并具有启动视频的能力随机点。
我在网上搜索了一些方法,但我找不到在Catalyst(RTMP或HTTP Pseudostreaming)中实现它的简单方法。我找到的唯一简单示例是一个旧的Catalyst脚本流式传输MP3(http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Streaming/lib/Streaming.pm),但如果我将该技术应用于视频,我不知道这是否会按预期工作。
以非复杂的方式在Catalyst / Perl中提供在线视频的好方法是什么?或者推荐的方法是什么?
谢谢你们!
答案 0 :(得分:0)
这只是一个部分答案,因为我现在也坚持这个。
如果文件已经是FLV格式,那么Static :: Simple插件就可以了。我已经使用root / static /目录中的文件和$c->serve_static_file
方法对其进行了测试。下面是我的jwplayer设置(包含在JQuery的ready函数中。
<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
}
}
要添加伪流,您需要创建一个查找start查询参数的控制器,然后搜索它,并将$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能够搜索的元数据中的关键帧。
来自jwplayer的HTTP streaming页面:
注意:某些FLV编码器在编码视频时不包含搜索点元数据。 没有这些数据,HTTP Pseudostreaming将无法正常工作。如果您怀疑自己的视频没有元数据,请使用我们的Metaviewer plugin检查视频。应该有一个搜索点或关键帧列表。如果不存在,请使用FLVMDI工具解析您的FLV视频并注入此元数据。
答案 1 :(得分:0)
最后,我使用带有x_send_file插件的apache来提供webm视频(使用范围字节搜索)和亚马逊云前端来提供mp4视频和使用mp4进行流式传输。
编辑: 使用带有自定义插件的Wowza Streaming Server与Catalyst安全通信。没有专用视频服务器,没有可靠的流媒体视频方式,特别是对于商业用途。