kamaitachi によるマルチメディアサイトの構築

YAPC::Asia 2010 Tokyo

October 16th, 2010

For english speakers

About me

...

About me

...

About me

kamaitachi とは

...

kamaitachi とは

FMS とは?

...

FMS とは?

...

FMS とは?

...

FMS とは?

FMS で何が出来るのか

...

FMS で何が出来るのか

...

FMS で何が出来るのか

...

FMS で何が出来るのか

...

FMS で何が出来るのか

いまさら FMS?

...

いまさら FMS?

...

いまさら FMS?

...

いまさら FMS?

2010年に FMS を使う理由

...

2010年に FMS を使う理由

...

2010年に FMS を使う理由

FMSを使用している実際のサイト

...

FMSを使用している実際のサイト

...

FMSを使用している実際のサイト

...

FMSを使用している実際のサイト

...

FMSを使用している実際のサイト

...

FMSを使用している実際のサイト

...

FMSを使用している実際のサイト

kamaitachi とは

...

kamaitachi とは

AnyEvent?

...

AnyEvent?

...

AnyEvent?

...

AnyEvent?

AnyEvent - Danga::Socketとの違い

AnyEvent - Danga::Socketとの違い

...

AnyEvent - Danga::Socketとの違い

...

AnyEvent - Danga::Socketとの違い

...

AnyEvent - Danga::Socketとの違い

...

AnyEvent - Danga::Socketとの違い

...

AnyEvent - Danga::Socketとの違い

kamaitachi とは

...

kamaitachi とは

kamaitachi 以外の選択肢

...

kamaitachi 以外の選択肢

...

kamaitachi 以外の選択肢

...

kamaitachi 以外の選択肢

kamaitachi 以外の選択肢

...

kamaitachi 以外の選択肢

使い方

必要知識

...

必要知識

...

必要知識

...

必要知識

AS3

...

AS3

...

AS3

...

AS3

...

AS3

...

AS3

AS3

FMSへ接続

var nc:NetConnection = new NetConnection();
nc.addEventListener( ... ); // 各種イベント登録

nc.objectEncoding = ObjectEncoding.AMF0;
nc.connect("rtmp://example.com/app_name");

AS3

サーバー側の関数呼び出し

nc.call(
    "method_name",
    new Responder(resultCallback, errorCallback),
    "foo", "bar"
);

AS3

サーバー側からの関数受付

nc.client = this;

public function onMessage(message:String):void {
    // ...
}

AS3

Webカムからの映像を送信

var ns:NetStream = new NetStream(nc);
var camera:Camera = Camera.getCamera();
ns.attachCamera(camera);
ns.publish("channel_name");

AS3

マイクからの音声を送信

var ns:NetStream = new NetStream(nc);
var var mic:Microphone = Microphone.getMicrophone();
ns.attachCamera(mic);
ns.publish("channel_name");

AS3

Webカムからの映像+マイクからの音声

var ns:NetStream = new NetStream(nc);
var camera:Camera = Camera.getCamera();
ns.attachCamera(camera);
var var mic:Microphone = Microphone.getMicrophone();
ns.attachCamera(mic);
ns.publish("channel_name");

AS3

FMSから映像、音声を再生

var ns:NetStream = new NetStream(nc);
ns.play("channel_name");

AS3との対応

// AS3
nc.connect(...)

// RTMP
connect

# kamaitachi
on_invoke_connect

AS3との対応

// AS3
ns = new NetStream(nc);

// RTMP
createStream

# kamaitachi
on_invoke_createStream

AS3との対応

// AS3
ns.publish(...)

// RTMP
publish

# kamaitachi
on_invoke_publish

AS3との対応

// AS3
ns.play(...)

// RTMP
play

# kamaitachi
on_invoke_play

AS3との対応

// AS3
ns.publish(...)

// RTMP
publish

# kamaitachi
on_invoke_publish

AS3との対応

// AS3
ns.close()

// RTMP
closeStream

# kamaitachi
on_invoke_closeStream

AS3との対応

// AS3
// NetStreamオブジェクトがガベージコレクトされたとき

// RTMP
deleteStream

# kamaitachi
on_invoke_deleteStream

kamaitachi アプリケーション

package MyApp;
use Any::Moose;

extends 'Kamaitachi::Service';

sub on_invoke_connect { ... }
sub on_invoke_play { ... }

:

kamaitachi アプリケーション

kamaitachi アプリケーション

sub on_invoke_sum {
    my ($self, $session, $req) = @_;

    my $res = $req->response(
        undef, $req->args->[1] + $req->args->[2]);

    return $res;
}

kamaitachi アプリケーション

sub on_invoke_sum {
    my ($self, $session, $req) = @_;

    my $t; $t = AnyEvent->timer(
        after => 10,
        cb    => sub {
            my $res = $req->response(...);
            $session->io->write($res);
            undef $t;
        },
    );

    return;
}

kamaitachi アプリケーション

sub on_invoke_sum {
    my ($self, $session, $req) = @_;

    my $t; $t = AnyEvent->timer(
        after => 10,
        cb    => sub {
            my $res = $req->response(...);
            $session->io->write($res);
            undef $t;
        },
    );

    return;
}

kamaitachi アプリケーション

kamaitachi 起動スクリプト

use Kamaitachi;

my $kamaitachi = Kamaitachi->new;
$kamaitachi->add_handler( port => 1935 );

$kamaitachi->register_services(
    'application_name' => 'MyApp',
);

$kamaitachi->run;

kamaitachi 起動スクリプト

use Kamaitachi;

my $kamaitachi = Kamaitachi->new;
$kamaitachi->add_handler( port => 1935 );

$kamaitachi->register_services(
    'application_name' => 'MyApp',
);

$kamaitachi->run;

kamaitachi 起動スクリプト

// AS3
nc.connect("rtmp://example.com/application_name");

定義済みサービス

定義済みサービス

package MyApp;
use Any::Moose;

extends 'Kamaitachi::Service';

with 'Kamaitachi::Service::AutoConnect';

# on_invoke_connect 定義済み

定義済みサービス一覧 (1)

定義済みサービス一覧 (2)

実行例

組み込みサンプルサーバー

$ git clone git://github.com/typester/kamaitachi.git
$ cd kamaitachi
$ git checkout anyevent

$ perl -Ilib ./example/server.pl

Example 0, echo

Example 1, チャット

Example 2, ライブ配信

Example 3, ライブ配信の録画

AnyEventモジュールの活用

Job Worker との連携

Job Worker との連携実例

AnyEvent::Gearmanの場合

$gearman->add_task(
    $function => $data,
    on_complete => sub {
        my $res = $_[1];

        ...
    },
);

Job Worker との連携実例

AnyEvent::HTTPの場合

http_get "http://example.com/api/foo", sub {
    my ($data, $headers) = @_;

    ...
};

Job Worker との連携実例

...

Job Worker との連携実例

...

Job Worker との連携実例

まとめ

...

まとめ

...

まとめ

...

まとめ

...

まとめ

宣伝

...

宣伝

...

宣伝

...

宣伝

ご静聴ありがとうございました!