2012-08-28 35 views
0

我正在開發一個網站,使用Catalyst(一個perl MVC框架)和JWplayer在線服務多個視頻,而且我需要一種穩定的方式將視頻流傳輸到客戶端播放器具有從隨機點開始視頻的能力。使用催化劑框架爲Flash/html5播放器流視頻

我搜索了網絡的一些方法來做到這一點,但我找不到在Catalyst(RTMP或HTTP Pseudostreaming)中實現它的簡單方法。我發現的唯一簡單例子是一個流式傳輸MP3的舊版Catalyst腳本(http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Streaming/lib/Streaming.pm),但我不知道如果將該技術應用於視頻,該功能是否會按預期工作。

在Catalyst/Perl中以非複雜的方式提供在線視頻的好方法是什麼?或者推薦的方法是什麼?

謝謝你們!

回答

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 streaming頁:

注:編碼視頻時,有些FLV編碼器不包括seekpoints元數據。 沒有這些數據,HTTP Pseudostreaming將不起作用。如果您懷疑自己的視頻沒有元數據,請使用我們的Metaviewer plugin檢查視頻。應該有一個查找點或關鍵幀列表。如果它不存在,請使用FLVMDI工具解析您的FLV視頻並注入此元數據。

+0

Static :: Simple插件會在玩家請求的任何開始位置向玩家提供視頻(使用FLV格式)?我今天沒有時間測試它,但我會測試它併發布結果! – h3ct0r

+0

看起來我錯了。我的視頻即時緩衝,所以我沒有注意到你無法通過緩衝部分。看起來我們可能需要實現[pseudo-streaming](http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/12534/video-delivery-http-pseudo-streaming #mechanism),捕獲開始參數,並在Streaming.pm中尋找它。至少它是以字節爲單位的。嘿。 –

+0

感謝您的信息,我仍然在尋找穩定而簡單的流式傳輸方式。如果我成功了,我會把如何在這裏! – h3ct0r

0

最後,我使用帶有x_send_file插件的apache來傳遞webm視頻(使用範圍字節搜索)和亞馬遜雲前端來傳送mp4視頻和使用mp4進行流式傳輸。