« Perlで映像ファイルのサムネイルを作成する | メイン | 昨日買った本、「エンジニアのための時間管理術」とかWeb2.0の本 »

Turn your MT into Youtube Base! / MTをYoutubeみたいにしちゃう

以前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ビデオ

video.gif

で、実際にどうやってるかというと、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をはじめ、こういうインフラはもうすでにたくさんあるのでニーズは少ないだろうが、自分でシステム作るのもまた楽しい。

トラックバック

このエントリーのトラックバックURL:
http://yusukebe.com/mt/mt-tb.cgi/1995

この一覧は、次のエントリーを参照しています: Turn your MT into Youtube Base! / MTをYoutubeみたいにしちゃう:

» yusukebeビデオ スタート! 送信元 ゆーすけべー日記
俺と愉快な仲間たちによるネタ映像、例えば少林寺のカタとかボケましょうとかですね、を配信する専用サイト「yusukebeビデオ」を昨日からスタートさせ... [詳しくはこちら]

» Trick or Treat! 24 送信元 BLUE NORTH
くー@ あはーん(* --* 918 ただ今、テストちぅ。 OverLibを本日のアーカイブのほうに搭載してみました。 トップのほうにはまだ付けてません... [詳しくはこちら]

» you tubeドラマ 送信元 you tubeでドラマを見たい!
you tubeドラマについての情報一覧 you tubeを楽しみましょう。 [詳しくはこちら]

コメント (4)

clicli:

はじめまして。現在同じような事をしようと悪戦苦闘しております。
FFmpegモジュールのmakeでエラーになりハマっています(今日で3日目・・・)。
もし可能であれば、Yusukebeさんのサーバー環境(OSの種類・バージョン)を教えて頂けないでしょうか?よろしくお願いします。

こちらこそはじめまして。
FFMpegモジュールというのはPerlのモジュールのことでしょうか?XSモジュールなので確かにインストールは大変です。
で、実は僕もFFMpegモジュールはmakeでこけちゃうん(もしくはtestかな?)で force install してます。
実際に動画をエンコードを行なうのはFFMpeg::Commandというモジュールなので、それでも問題なかったです(FFMpegモジュールは動画のdurationを取得するために使ってます、force install で入れてもできました)。

サーバー環境はdebian sargeで、FFMpeg関連で依存しているプログラムはaptでとってきて、FFMpeg自体はソースからインストールしてます。

clicli:

yusukebeさん、
どうもありがとうございます!!!そうだったのですか、force installですか!早速試してみます。本当にありがとうございました。

さんま:

はじめまして。
とても興味深く
見させてもらってます。

ちなみにどのように動作するのかを
見てみたかったんですが、
下記のサイトが、閲覧できないようです?

http://yusukebe.com/video/

なにか、間違っているんでしょうか?

よろしくおねがいします。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


ブログSEO対策:track word seo