perlRTMP JWPlayerのプレイリストを作る


perlRTMPの情報とセットになっているのが「JWPlayer
FLASHの動画プレーヤーだがストリーミングに対応しており、プレイリストやその他もろもろ高機能らしい。残念ながらあまりプレイリストの情報がないのでメモしておく。

プレーヤーの設置とHTMLについては「perlRTMPでストリーミング」に簡単にメモしたのでみてください。

playlist.xmlのサンプル

<rss version="2.0" xmlns:jwplayer="http://developer.longtailvideo.com/">
<channel>
<title>playlist</title>
<item>
<title>xxx</title>
<date>Sat Feb  5 00:22:59 2011 JST</date>
<description>説明</description>
<author>管理者</author>
<enclosure length="512654984" type="video/mp4" url="files/xxxx.mp4"></enclosure>
<jwplayer:playlist.image>thumbs/thmb_xxxx.jpg</jwplayer:playlist.image>
<jwplayer:streamer>rtmp://www.xxxxx.jp/</jwplayer:streamer>
</item>
</channel>
</rss>

↓こんな感じでプレイリストが画面の右側にでます。

JWplayerサンプル画面

あとはこのxmlを書き出すperlスクリプトを書けばOKかな。またぼちぼちメモしよう。

追記:プレイリストを書き出すプログラム

以前radikoのpodcast化で使ったものをほぼそのまま流用でできました。JWplayerには対応してなさそうなdateやauthorもそのままですが、問題なく動いてるのでそのままにしてます。

#!/usr/bin/perl</pre>
#-------------------------------------------
 # 動画ストリーミングRSS生成CGI
 #-------------------------------------------
 use strict;
 use warnings;
 use Encode;
 use Jcode;
 use XML::DOM;
 use XML::Twig;
 use MP4::Info;
 my $mas_dir = '/mnt/stream/'; #ルートディレクトリ
 my $mas_files = 'files/'; #元ファイル
 my $thumb_files = 'thumbs/'; #サムネールファイル
 my $dir = $mas_dir . $mas_files; # 対象ディレクトリ名
 my $xml_out_dir = $mas_dir . 'playlist.xml'; # 出力xmlディレクトリ・ファイル
 #-------------------------------------------
 # ファイル一覧を取得
 #-------------------------------------------
 # ファイルステータス関連
 my @files;
 my @filetmp;
 my @filestat;
 # MP4タグ関連
 my $filename;
 my $filesize;
 my $filetime;
 my $filetitle;
 my $filecomment;
 my $mp4;
 opendir DH, $dir or die "$dir:$!";
 my @dir_files = readdir DH;
 my @sort_dir_files = sort @dir_files;
 my @reverse_dir_files = reverse @sort_dir_files;
 foreach $filename (@reverse_dir_files) {
 next if $filename =~ /^\.{1,2}$/; # '.'や'..'も取れるので、スキップする
 utf8::decode($filename) unless utf8::is_utf8($filename); # utf8へ
 $filesize = -s $dir.$filename; # ファイルサイズ
 @filestat = stat $dir.$filename;
 $filetime = localtime($filestat[9]); # 更新時刻
 $mp4 =get_mp4info($dir.$filename); # MP4タグ取得
 $filesize = $mp4->{SIZE};
 $filetitle = $mp4->{TITLE};
 $filecomment = $mp4->{CMT};
 @filetmp = ($filename , $filesize , $filetime , $filetitle , $filecomment); # 配列へファイル情報をpush
 push(@files, [ @filetmp ]);
 }
 closedir DH;
 #-------------------------------------------
 # プレイリストXMLを生成
 #-------------------------------------------
 &xml_create;
 exit;
 #============================================
 # RSS生成
 #============================================
 sub xml_create {
 my $xmlSrc = <

 ストリーミング配信


 DATA
 # XMLを解析しビデオのノードを生成
 my $parser = new XML::DOM::Parser;
 my $dom = $parser->parse($xmlSrc);
 foreach my $filedata ( @files ) {
 # @$filedata[0] :ファイル名
 # @$filedata[1] :ファイルサイズ(バイト)
 # @$filedata[2] :更新日時
 # @$filedata[3] :番組タイトル
 # @$filedata[4] :コメント
 # アイテムノードを作成
 my $item = $dom->createElement("item");
 # title
 my $title = $dom->createElement("title");
 $title->appendChild($dom->createTextNode(@$filedata[3]));
 # description
 my $description = $dom->createElement("description");
 $description->appendChild($dom->createTextNode(@$filedata[4]));
 # author
 my $author = $dom->createElement("author");
 $author->appendChild($dom->createTextNode("turbomaru"));
 my $enc = $dom->createElement("enclosure");
 $enc->setAttribute("url",$mas_files . @$filedata[0]);
 $enc->setAttribute("type","video/mp4");
 $enc->setAttribute("length",@$filedata[1]);
 # thumbs
 my $thumbs = $dom->createElement("jwplayer:playlist.image");
 $thumbs->appendChild($dom->createTextNode($thumb_files ."thmb_".@$filedata[0].".jpg"));
 # pubDate
 my $pubdate = $dom->createElement("date");
 $pubdate->appendChild($dom->createTextNode(@$filedata[2]." JST"));
 # streamer
 my $streamer = $dom->createElement("jwplayer:streamer");
 $streamer->appendChild($dom->createTextNode("rtmp://www.turbomaru.net/"));
 # 本ノードにエレメントを追加
 $item->appendChild($title);
 $item->appendChild($pubdate);
 $item->appendChild($description);
 $item->appendChild($author);
 $item->appendChild($enc);
 $item->appendChild($thumbs);
 $item->appendChild($streamer);
 # ルートからchannelノードを取り出し本ノードを追加
 $dom->getElementsByTagName("channel")->item(0)->appendChild($item);
 }
 # インデントを付加して整形
 my $twig= new XML::Twig;
 $twig->set_indent(" "x4);
 $twig->parse($dom->toString);
 $twig->set_pretty_print("indented");
 # ファイルへ出力
 open(OUTXML, ">".$xml_out_dir);
 print OUTXML Encode::encode_utf8($twig->sprint);
 close(OUTXML);
 }

投稿者: ちゅう たろう

ネットワーク・サーバー周りをちょっと知っているだけの普通の人です。