私も現在これに固執しているので、これは部分的な答えにすぎません。
ファイルがすでに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ビデオを解析し、このメタデータを挿入します。