2013年07月20日

Kamcord - Using the Kamcord API

Using the Kamcord API

このセクションは、4つのセクションに分かれており、完全に動作する Kamcord インテグレーションを入手し実行できます:

我々はまた、インテグレーションの基礎を通してガイドするためのクイックビデオも一緒に置いておきます。

Kamcord Initialization

  1. Kamcord をあなたのアプリのデリゲートにインポートして下さい:
    #import < Kamcord / Kamcord.h >
    
  2. あなたのデベロッパキーとデベロッパシークレット、アプリ名とあなたのアプリが初期化するときの親ビューコントローラを設定して下さい。

    あなたは、あなたのデベロッパキーとシークレットを、メール経由で、http://kamcord.com/signup にて Kamcord にサインアップしてから受け取る必要があります。 どのデベロッパキー/秘密情報のペアも1つのアプリに対してだけ有効です。 もしあなたが Kamcord を複数のアプリに統合しようと計画しているのであれば、必要なだけのキー/シークレットのペアを入手するために、 support@kamcord.com にて我々にメールして下さい。 アプリ名パラメータは、異なるアプリからのアップロードを追跡するために使われるので、正しく設定されるようにお願いします。

    // Tell Kamcord your app key, secret, app name, and parent view controller
    // that will present the Kamcord UI.
    [Kamcord setDeveloperKey:@"My_Developer_Key"
             developerSecret:@"My_Developer_Secret"
                     appName:@"My_Game_Name"
        parentViewController:parentViewController];
    

Video Recording

録画インタフェースは、一本の動画というコンセプトに基づいて構築されており、一本の動画は一つまたは複数のクリップを有します。 ほとんどの動画はちょうど一つのクリップを有しますが、もしあなたのゲームが中断されると(例えば、ユーザが電話に出た場合など)、一本のシームレスな動画となるように一緒に連結される必要のある複数のクリップを有することになります。 Kamcord は、あなたがアプリのライフサイクルにおいて適切な箇所で録画を一時停止したりレジュームしたりする間、シーンの向こう側のすべてをハンドリングします。

API は以下の通りです:

+ (void)startRecording;
+ (void)stopRecording;
+ (void)pause;
+ (void)resume;

[Kamcord startRecording] は動画の録画を開始し、 [Kamcord pause][Kamcord resume] で一時停止とレジュームが行えます。 あなたが動画全体を録画し終えたら、[Kamcord stopRecording] を呼出して下さい。 我々が推奨するのは、ゲームのレベルの始まりで [Kamcord startRecording] を、レベルの終わりで [Kamcord stopRecording] を自動的に呼び出すというものです。

The Video Replay and Sharing View

ここで、ユーザがゲームプレーをやり遂げ、その動画の録画に成功すると、 以下の API を呼び出すことで Kamcord UI をユーザに提示することができます:

+ (void)showView;

これは以下のようなモーダルビューを提示します:

サムネイルをタップすることで、最後に録画された動画(最後の [Kamcord stopRecording] の呼出し)が再生されます。 ユーザが彼女の再生を見ている間、彼女は、我々の洒落た、ビルトインのトリミング UI を使って、もっとも面白い部分に動画をトリミングすることができます。

ユーザがこのビュー上で Facebook, Twitter もしくは YouTube ボタンを押す最初のタイミングで、関連する認証情報と許可を入力するように促されます。 我々は、 iOS 5+ に対してビルトインの Twitter 認証を、 iOS 6+ に対してビルトインの Facebook 認証をうまく活用しています。 ユーザが 'Share Replay' ボタンを押すと、彼女の動画は Kamcord で共有され、彼女が選択した追加のネットワーク上でも共有されるでしょう。

我々は動画を Kamcord サーバにアップロードします。 我々は Facebook や Twitter に動画を埋め込みます。 メール共有は Kamcord.com ページのリンクを含み、そこに動画がホストされます。 もしユーザが YouTube で動画を共有すると、我々は動画を Kamcord へアップロードし、それから我々のサーバから YouTube に動画をアップロードします。 我々は可能な限り少ないクリックで動画を共有できるように努力しています。

すべてのアップロードと共有は、バックグラウンドスレッドで行われます。 このことはより優れたユーザエクスペリエンスを生み出しますが、なぜならそれはあなたのユーザは可能な限り速やかにあなたのゲームのプレーに戻れるからです。

The Watch View

ユーザが上述の Share View の "Watch" タブを押すと、彼女は我々のウォッチエクスペリエンスを入力することになるでしょう。 我々のソーシャルウォッチエクスペリエンスは、ユーザに、コンテンツの様々なストリームを見せます - 'ウォークスルーストリーム' や 'ハイスコアストリーム' や '最新ストリーム' - '好きな'動画といった感じです。 あなたはまたユーザにウオッチオンリービューを見せることもでき、それは以下のメソッドのいずれかの呼出しを経由してあなたのゲームから素晴らしいコンテンツを特集します:

+ (void)showWatchView;
+ (void)showWatchViewInViewController:(UIViewController *)parentViewController;

我々が推奨するのは、一つ前のレベルのスクリーン上のボタンを経由してウォッチオンリービューをあなたにユーザに入力させるというものです。

次に、我々が議論するのは、それぞれのユーザによる共有を最大限活用するために、それぞれの動画に関連付けられるメタデータをカスタマイズするためのメソッドについてです。

Next section: Using the Kamcord API: Video Metadata Options


目次へ戻る

FruitsFields - 寄付代わりに購入いただけると嬉しいです。
Icon-72.png as_available_appstore_icon_20091006.png

サポートページはこちら。
http://cbbandtqb.toypark.in/FruitsFields/index_jpn.html

posted by cbbandtqb at 07:42| Comment(0) | TrackBack(0) | 備忘録 | このブログの読者になる | 更新情報をチェックする

2013年07月10日

Kamcord - Integrating Kamcord into your game engine

Integrating Kamcord into your game engine

もしあなたが cocos2d/cocos2d-x を使っているのであれば、このセクションをスキップし、次のセクション:Using the Kamcord API へ移って下さい。 Kamcord はあなたが cocos2d/cocos2d-x を使っているか自動的に調べて、環境立ち上げの統合を進めるでしょう。

Recording Video

あなたのゲームエンジンにゲームプレー録画を統合するのは、 KamcordRecorder クラスによるシンプルなプロセスです。 4つのキーとなる統合上のポイントがあり、それはあなたのゲームエンジンのライフサイクルにおける以下の"イベント"に関係しています:

イベントそれぞれに対して、 KamcordRecorder に対するひとつづつの呼出しがあります。

+ (BOOL)initWithEAGLContext:(EAGLContext *)context layer:(CAEAGLLayer *)layer;
+ (BOOL)createFramebuffers:(GLuint)defaultFramebuffer; // Non-MSAA
+ (BOOL)createFramebuffers:(GLuint)defaultFramebuffer  // MSAA
           msaaFramebuffer:(GLuint)msaaFramebuffer;
+ (void)deleteFramebuffers;
+ (BOOL)beforePresentRenderbuffer:(GLuint)framebuffer;
+ (BOOL)afterPresentRenderbuffer;

我々は以下のセクションでそれらについて議論しますが、例として cocos2d-2.0 の CCGLView.mCCES2Renderer.m を使います。

Initializing KamcordRecorder

まず最初に確認して欲しいのは、あなたのプロジェクトに #import <Kamcord/Kamcord.h> があるかです。 KamcordRecorder に何かさせる前に、あなたはあなたのゲームの EAGLContextCAEAGLayerKamcordRecorder を初期化しなければなりません。 例えば、 CCGLViewsetupSurfaceWithSharegroup の内部は以下のようになっています:

- (BOOL)setupSurfaceWithSharegroup:(EAGLSharegroup*)sharegroup
{
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

    eaglLayer.opaque = YES;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithBool:preserveBackbuffer_], kEAGLDrawablePropertyRetainedBacking,
                                    pixelformat_, kEAGLDrawablePropertyColorFormat, nil];

    // ES2 renderer only
    renderer_ = [ [CCES2Renderer alloc] initWithDepthFormat:depthFormat_
                                            withPixelFormat:[self convertPixelFormat:pixelformat_]
                                             withSharegroup:sharegroup
                                          withMultiSampling:multiSampling_
                                        withNumberOfSamples:requestedSamples_];

    NSAssert( renderer_, @"OpenGL ES 2.0 is required");

    if (!renderer_)
        return NO;

    context_ = [renderer_ context];

    discardFramebufferSupported_ = [ [CCConfiguration sharedConfiguration] supportsDiscardFramebuffer];

    CHECK_GL_ERROR_DEBUG();

    [KamcordRecorder initWithEAGLContext:context_ layer:eaglLayer];

    return YES;
}

Creating Kamcord Framebuffers

Kamcord のフレームバッファを生成するための呼出しは、あなたのゲームのデフォルトフレームバッファを生成するための呼出しの後に置かれるべきです。 渡されるパラメータは、もしマルチサンプリングが可能であれば、オプションの msaaFramebuffer によってフォローされるデフォルトフレームバッファです。 Kamcord フレームバッファは、あなた自身のゲームのデフォルトフレームバッファを生成するところで生成されるべきでしょう。 CCES2Renderer.m において、 resizeFromLayer 内部で Kamcord フレームバッファを生成するのがベストでしょう。

- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer
{
    // ...
    // Code to create default framebuffer
    // ...

    GLenum error;
    if ( (error=glCheckFramebufferStatus(GL_FRAMEBUFFER)) != GL_FRAMEBUFFER_COMPLETE)
    {
        CCLOG(@"Failed to make complete framebuffer object 0x%X", error);
        return NO;
    }

    if (multiSampling_)
    {
        [KamcordRecorder createFramebuffers:defaultFramebuffer_
                            msaaFramebuffer:msaaFramebuffer_];
    }
    else
    {
        [KamcordRecorder createFramebuffers:defaultFramebuffer_];
    }

    return YES;
}

Deleting Kamcord Framebuffers

同様に、Kamcord フレームバッファは、あなたのゲームエンジンがデフォルトフレームバッファを削除するときに削除されるべきでしょう。 CCES2renderer.m

- (void)dealloc
{
    CCLOGINFO(@"cocos2d: deallocing %@", self);

    // Tear down GL
    if (defaultFramebuffer_) {
        glDeleteFramebuffers(1, &defaultFramebuffer_);
        defaultFramebuffer_ = 0;
    }

    if (colorRenderbuffer_) {
        glDeleteRenderbuffers(1, &colorRenderbuffer_);
        colorRenderbuffer_ = 0;
    }

    if( depthBuffer_ ) {
        glDeleteRenderbuffers(1, &depthBuffer_ );
        depthBuffer_ = 0;
    }
   
    if ( msaaColorbuffer_)
    {
        glDeleteRenderbuffers(1, &msaaColorbuffer_);
        msaaColorbuffer_ = 0;
    }
   
    if ( msaaFramebuffer_)
    {
        glDeleteRenderbuffers(1, &msaaFramebuffer_);
        msaaFramebuffer_ = 0;
    }

    [KamcordRecorder deleteFramebuffers];

    // Tear down context
    if ([EAGLContext currentContext] == context_)
        [EAGLContext setCurrentContext:nil];

    [context_ release];
    context_ = nil;

    [super dealloc];
}

Before and after presenting the main renderbuffer

KamcordRecorder は、あなたがあなたのゲームエンジンの最初の主要なレンダバッファを作る前と後にいくつかの作業をしなければなりません。 そのようなことをするための2つの呼出しは、以下の通りです:

+ (BOOL)beforePresentRenderbuffer:(GLuint)framebuffer;
+ (BOOL)afterPresentRenderbuffer;

[KamcordRecorder beforePresentRenderbuffer:] への呼出しは、レンダバッファの内容がスクリーンに表示される前に呼ばれるべきです(すなわち、 [context_ presentRenderbuffer:GL_RENDERBUFFER] への呼出しの前)。 [context_ presentRenderbuffer:GL_RENDERBUFFER] への呼出しの後に、 [KamcordRecorder afterPresentRenderbuffer] メソッドが呼び出されるべきです。 これらのメソッドの両方とも、それらが成功したときには YES が戻り、そうでないときには NO が戻るでしょう。 両方ともに渡されるパラメータは、デフォルトのフレームバッファです。 それらは以下のように CCGLViewswapBuffers において使われます:

- (void)swapBuffers
{
    // IMPORTANT:
    // - preconditions
    //  -> context_ MUST be the OpenGL context
    //  -> renderbuffer_ must be the RENDER BUFFER

    if (![KamcordRecorder beforePresentRenderbuffer:defaultFramebuffer_])
    {
        if (multiSampling_)
        {
            /* Resolve from msaaFramebuffer to resolveFramebuffer */
            glDisable(GL_SCISSOR_TEST);
            glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, [renderer_ msaaFrameBuffer]);
            glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, [renderer_ defaultFrameBuffer]);
            glResolveMultisampleFramebufferAPPLE();
        }

        if( discardFramebufferSupported_)
        {
            if (multiSampling_)
            {
                if (depthFormat_)
                {
                    GLenum attachments[] = {GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT};
                    glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 2, attachments);
                }
                else
                {
                    GLenum attachments[] = {GL_COLOR_ATTACHMENT0};
                    glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 1, attachments);
                }

                glBindRenderbuffer(GL_RENDERBUFFER, [renderer_ colorRenderBuffer]);
            }

            // not MSAA
            else if (depthFormat_ ) {
                GLenum attachments[] = { GL_DEPTH_ATTACHMENT};
                glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, attachments);
            }
        }
    }

    if (![context_ presentRenderbuffer:GL_RENDERBUFFER])
        CCLOG(@"cocos2d: Failed to swap renderbuffer in %s\n", __FUNCTION__);

    if (![KamcordRecorder afterPresentRenderbuffer])
    {
        // We can safely re-bind the framebuffer here, since this will be the
        // 1st instruction of the new main loop
        if( multiSampling_ )
            glBindFramebuffer(GL_FRAMEBUFFER, [renderer_ msaaFrameBuffer]);
    }
   
    CHECK_GL_ERROR_DEBUG();
}

注記:フレームバッファへの描画目的のためにフレームバッファをバインドするようなコードにおける箇所では、スクリーンへ表示されるでしょう。

以下のように glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); における `defaultFramebuffer` を `[KamcordRecorder kamcordFramebuffer]` に置き換えて下さい:

glBindFramebufferOES(GL_FRAMEBUFFER_OES, [KamcordRecorder kamcordFramebuffer]);

Recording Audio

OpenAL

もしあなたがサウンドソリューションとして OpenAL を使っているなら、我々は Kamcord.framework にバンドルされている OpenAL の置き換えを行い、ものがすぐに使えるようにすべきです! あなたの Build Phases ==> Link Binary With Libraries から OpenAL.framework を取り除くよう注意して下さい。 もしあなたが録画した動画の中でゲーム音楽が聞こえないようなら、 support@kamcord.com にメールして下さい。

FMOD or Custom Audio Engine

もしあなたが FMOD のようなサウンドエンジンか、ロー(raw)オーディオバイトストリームにアクセスする Core Audio 上に構築されたカスタムオーディオエンジンを有しているなら、動画の録音されたオーディオも追加することができます。 そのようにするためには、2つのことをする必要があります:

  1. Kamcord にあなたのオーディオを AudioStreamBasicDescription を教えて下さい。
  2. 録音して Kamcord に送信したいオーディオストリームをインターセプトして下さい。

Setting the AudioStreamBasicDescription

もしあなたのオーディオストリームの AudioStreamBasicDescription が変数 asbd に格納されているようなら、以下のように Kamcord に教えているか確認して下さい:

[Kamcord setASBD:asbd];

この呼出しは、何かオーディオバイト列が書き込まれる前になされるべきです。 これは一度だけ実施する必要があります。

Sending the audio stream to Kamcord

numSamples に格納されたオーディオサンプルの数を伴った data ポインタ中のオーディオバイトストリームをインターセプトしたら、以下のようにそれらを Kamcord に送信します:

[Kamcord writeAudioBytes:data numSamples:numSamples];
 

これで、あなたのゲームプレー動画を録画し共有するために Kamcord を使う準備ができました。

Next section: Using the Kamcord API


目次へ戻る

FruitsFields - 寄付代わりに購入いただけると嬉しいです。
Icon-72.png as_available_appstore_icon_20091006.png

サポートページはこちら。
http://cbbandtqb.toypark.in/FruitsFields/index_jpn.html

posted by cbbandtqb at 00:25| Comment(0) | TrackBack(0) | 備忘録 | このブログの読者になる | 更新情報をチェックする

2013年07月08日

Kamcord - Installation

Installation

あなたのゲームに Kamcord をどうやってインストールするか見ていきましょう!

Framework

  1. Kamcord.embeddedframework をあなたのプロジェクトにドラッグ&ドロップして下さい。
    以下のスクリーンショットは、フォルダをどこからドラッグすべきかを示しています:

    以下のスクリーンショットは、フォルダをどこへドロップすべきかを示しています:

    確認して欲しいのは、フレームワークをリンクしたいターゲットアプリの隣のボックスにチェックが入っているかどうかです。
  2. Build Phases ==> Link Binary With Libraries のもとで、以下のフレームワークがあるか確認して下さい:
    • Accounts
    • AdSupport (Optional)
    • AudioToolbox
    • AVFoundation
    • CoreImage (Optional)
    • CoreGraphics
    • CoreMedia
    • CoreVideo
    • Foundation
    • Kamcord
    • MediaPlayer
    • MessageUI
    • OpenGLES
    • QuartzCore
    • Security
    • Social (Optional)
    • SystemConfiguration
    • Twitter (Optional)
    • UIKit

    ご丁寧にも iOS 4 のデプロイメントをサポートするのであれば、オレンジ色のボックス(以下のスクリーンショット参照)の内側を Optional に設定して下さい。こうすることで、あなたのアプリを iOS 4 のデバイス上で走らせられます。

次に、ゲームプレー動画の録画をあなたのゲームエンジンに統合する方法を見ていきましょう。

Next section: Integrating Kamcord into your Game Engine


目次へ戻る

FruitsFields - 寄付代わりに購入いただけると嬉しいです。
Icon-72.png as_available_appstore_icon_20091006.png

サポートページはこちら。
http://cbbandtqb.toypark.in/FruitsFields/index_jpn.html

posted by cbbandtqb at 21:12| Comment(0) | TrackBack(0) | 備忘録 | このブログの読者になる | 更新情報をチェックする