這只是一個部分的答案,因爲我目前還堅持這一點。
如果文件已經是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視頻並注入此元數據。
Static :: Simple插件會在玩家請求的任何開始位置向玩家提供視頻(使用FLV格式)?我今天沒有時間測試它,但我會測試它併發布結果! – h3ct0r
看起來我錯了。我的視頻即時緩衝,所以我沒有注意到你無法通過緩衝部分。看起來我們可能需要實現[pseudo-streaming](http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/12534/video-delivery-http-pseudo-streaming #mechanism),捕獲開始參數,並在Streaming.pm中尋找它。至少它是以字節爲單位的。嘿。 –
感謝您的信息,我仍然在尋找穩定而簡單的流式傳輸方式。如果我成功了,我會把如何在這裏! – h3ct0r