0

我正在开发一个网站,使用 Catalyst(A perl MVC 框架)和 JWplayer 在线提供多个视频,我需要一种稳定的方式将视频流式传输到客户端播放器,并能够从随机点启动视频.

我在网上搜索了一些方法来做到这一点,但我找不到在 Catalyst(RTMP 或 HTTP 伪流)中实现它的简单方法。我发现的唯一简单示例是流 MP3 的旧 Catalyst 脚本(http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Streaming/lib/Streaming.pm)但我不知道如果我将该技术应用于视频,是否会按预期工作。

以不复杂的方式在 Catalyst/Perl 中提供在线视频的好方法是什么?或者推荐的方法是什么?

多谢你们!

4

2 回答 2

0

最后,我使用带有 x_send_file 插件的 apache 来提供 webm 视频(使用范围字节搜索)和亚马逊云前端来提供 mp4 视频和 mp4 流媒体。

编辑:结束使用带有自定义插件的 Wowza Streaming Server 与 Catalyst 进行安全通信。如果没有专用的视频服务器,就没有可靠的视频流媒体方式,尤其是对于企业而言。

于 2012-11-25T23:50:50.040 回答
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
    }
}

要添加伪流,您需要创建一个控制器来查找开始查询参数,然后查找它,并将其发送$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 流页面:

注意:某些 FLV 编码器在编码视频时不包含搜索点元数据。如果没有这些数据,HTTP 伪流将无法工作。如果您怀疑您的视频没有元数据,请使用我们的Metaviewer 插件检查视频。应该有一个搜索点或关键帧列表。如果不存在,请使用 FLVMDI 工具解析您的 FLV 视频并注入此元数据。

于 2012-08-28T22:01:31.117 回答