以前miyagawaさんがBlogで「Turn your MT into Google Base!」と題して、MovableTypeをRightFieldsというプラグインを使ってGoogle Baseにしてしまうという記事をポストしていました→RightFields - Turn your MT into Google Base!: blog.bulknews.net。 今回、紹介するのはそのRightFieldsプラグインを利用してMTをYoutube Baseにしてしまうというハックです。
どんな機能かというとMTの管理画面からエントリーを編集するように、映像をアップロードできて、それに対するテキストやタグ付けなどを行って、エントリーを保存すると自動的に映像をFlash形式に変換してくれて、Youtubeのようにウェブで映像が見れるというものです。さらにサムネイル画像を作ることもできます。
というか自分で自作のネタ映像を自前のサイトで公開したいから作りました。実際にできたサイトはこちらになります→yusukebeビデオ。
で、実際にどうやってるかというと、RightFiedsプラグインと独自のPlugin(Video.plという名前)を用意します。VideoプラグインはFFmpegモジュールとFFmpeg::Commandモジュールが必要です。これはちょっと敷居が高いかもしれないですね。というわけでエンコードにはFFmpegを使います。 次にRightFiedsでsourceというfile形式のExtraフィールドを作ります。これを使ってソースとなるビデオをアップロードします。そして独自のVideoプラグインは以下のようなコードになっております。ちょっと設定とか.plファイルに直接書き込むようになっていて作りが甘いですがちゃんと動きます。Videoプラグインは以下のようになります。
package MT::Plugin::Video;
use strict;
use MT;
use MT::Entry;
use MT::Log;
use FFmpeg::Command;
use FFmpeg;
use Data::Dumper;
use lib qw(/path/to/mt/plugins/RightFields/lib);
use RightFields;
my $blog_id = '1';
my $archive_path = '/path/to/archive/';
my $ffc = FFmpeg::Command->new('/usr/local/bin/ffmpeg');
my $ff = FFmpeg->new();
my $log = MT::Log->new;
my $plugin = new MT::Plugin({
name => "Video",
version => '0.01',
author_name => "Yusuke Wada",
author_link => "http://yusukebe.com",
});
MT->add_plugin($plugin);
MT::Entry->add_callback('pre_save', 1, undef, \&pre_save_hdlr);
sub pre_save_hdlr {
my ($eh, $entry) = @_;
my $cfg = RightFields::blog_data('extra', "$blog_id");
my $obj = RightFields::new_obj($cfg,$entry->id);
my $column_value = $obj->column_values();
#ビデオファイル名を取得
my $source_video = $column_value->{'source'};
trace($source_video);
#エントリーIDを取得
my $entry_id = get_entry_id($entry->id);
trace(encode($archive_path . $source_video,$entry_id));
}
sub get_entry_id{
my $old_id = shift;
my $zero_num = 6 - length($old_id);
my $new_id = "0" x $zero_num . $old_id;
return $new_id;
}
sub encode{
my ($input,$entry_id) = @_;
$ffc->input_file($input);
#output flv
$ffc->output_file($archive_path . $entry_id .".flv");
$ffc->options(
'-y',
'-f' => 'flv',
'-s' => '320x240',
'-ar' => '44100',
'-deinterlace',
);
my $result = $ffc->exec();
#output mp4
$ffc->output_options({
file => $archive_path . $entry_id .".mp4",
device => 'ipod',
});
$ffc->exec();
#output jpg
$ff->input_file($input);
my $sg = $ff->create_streamgroup();
my $duration = $sg->duration();
$ffc->input_file($input);
$ffc->output_file($archive_path . $entry_id .".jpg");
$ffc->options(
'-y',
'-f' => 'image2',
'-pix_fmt' => 'jpg',
'-vframes' => 1,
'-ss' => $duration/2,
'-s' => '120x90',
'-an',
'-deinterlace',
);
$ffc->exec();
return 1;
}
sub trace{
my $string = shift;
$log->message($string);
$log->save();
}
flvだけじゃなくてmp4も書き出しています。ファイルは設定したアーカイブページに6桁のエントリーIDをベースとしたファイル名で保存されます。なので flvファイル、mp4ファイル、jpegファイルには
path/archive/<$MTEntryID pad="1"$>.flv
とかでアクセスできます。これをFlash Playerの引数にしたり、Podcasting向けにRSSのenclosureに設定したりすれば立派な動画配信サイトができます。
実際にちゃんと動いて感動。Youtubeをはじめ、こういうインフラはもうすでにたくさんあるのでニーズは少ないだろうが、自分でシステム作るのもまた楽しい。


コメント (4)
はじめまして。現在同じような事をしようと悪戦苦闘しております。
FFmpegモジュールのmakeでエラーになりハマっています(今日で3日目・・・)。
もし可能であれば、Yusukebeさんのサーバー環境(OSの種類・バージョン)を教えて頂けないでしょうか?よろしくお願いします。
投稿者: clicli | 2007年1月21日 19:46
日時: 2007年1月21日 19:46
こちらこそはじめまして。
FFMpegモジュールというのはPerlのモジュールのことでしょうか?XSモジュールなので確かにインストールは大変です。
で、実は僕もFFMpegモジュールはmakeでこけちゃうん(もしくはtestかな?)で force install してます。
実際に動画をエンコードを行なうのはFFMpeg::Commandというモジュールなので、それでも問題なかったです(FFMpegモジュールは動画のdurationを取得するために使ってます、force install で入れてもできました)。
サーバー環境はdebian sargeで、FFMpeg関連で依存しているプログラムはaptでとってきて、FFMpeg自体はソースからインストールしてます。
投稿者: ゆーすけべー
|
2007年1月22日 21:34
日時: 2007年1月22日 21:34
yusukebeさん、
どうもありがとうございます!!!そうだったのですか、force installですか!早速試してみます。本当にありがとうございました。
投稿者: clicli | 2007年1月23日 20:16
日時: 2007年1月23日 20:16
はじめまして。
とても興味深く
見させてもらってます。
ちなみにどのように動作するのかを
見てみたかったんですが、
下記のサイトが、閲覧できないようです?
http://yusukebe.com/video/
なにか、間違っているんでしょうか?
よろしくおねがいします。
投稿者: さんま | 2008年3月27日 15:48
日時: 2008年3月27日 15:48