0

Catalyst(Perl MVCフレームワーク)とJWplayerを使用して、オンラインで複数のビデオを提供するサイトを開発しています。ランダムなポイントからビデオを開始する機能を備えた、クライアントプレーヤーにビデオをストリーミングする安定した方法が必要です。 。

Webでそれを行う方法をいくつか検索しましたが、Catalystで実装する簡単な方法(RTMPまたはHTTP疑似ストリーミング)が見つかりません。私が見つけた唯一の簡単な例は、MP3をストリーミングする古いCatalystスクリプト(http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Streaming/lib/Streaming.pm)でしたが、私は知りませんでしたそのテクニックをビデオに適用すれば、それが期待どおりに機能するかどうか。

複雑ではない方法でCatalyst/Perlでオンラインビデオを提供するための良いアプローチは何でしょうか?またはそれを行うための推奨される方法は何ですか?

みんなありがとう!

4

2 に答える 2

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 に答える
0

最後に、apacheとx_send_fileプラグインを使用して(範囲バイトシークを使用して)webmビデオを配信し、Amazonクラウドフロントを使用してmp4ビデオとmp4でのストリーミングを配信します。

編集:Catalystと安全に通信するためのカスタムプラグインを備えたWowzaStreamingServerの使用を終了しました。特にビジネス向けに、専用のビデオサーバーなしでビデオをストリーミングする信頼できる方法はありません。

于 2012-11-25T23:50:50.040 に答える