.-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 comment(-) trackback(-)
.25 2009

ライブストリーミング中に別のビューを重ねる

Tasakiです。

2009年も残すところ、あと1週間を切りました。
今年もいろいろありましたが、来年もどうぞよろしくお願いします。

ということで、前置きが年越しのあいさつ?となってしまいましたが、今回も前回のテーマの延長線上になります。(カテゴリが別ですが)

Appleが提供するサンプルコードの中にMoviePlayerなるものがあります。
この中で、ムービープレイヤー上にオーバレイビューを表示させてありまして、ローカルの動画ファイル再生の場合には、この方法で実現可能です。
以下にその部分を抜き出します。
NSArray* windows = [[ UIApplication sharedApplication] windows];
if([ windows count] > 1 ) {
// Locate the movie player window
UIWindow* moviePlayerWindow = [[ UIApplication sharedApplication] keyWindow];
// Add our overlay view to the movie player's subviews so it is
// displayed above it.
 [ moviePlayerWindow addSubview: self.overlayView ];
}

上のコードについて少し解説しますと、ムービー再生開始後に、ウィンドウが2つ以上存在すれば(つまり、再生が成功すれば)、キーウィンドウにオーバレイビューを追加する、という解釈ができます。
このことから、ムービープレイヤーは別のウィンドウとして生成されることが分かります。
よって、このムービープレイヤーウィンドウに対して、サブビューを追加すれば、オーバレイビューとして表示されることになるわけです。

ただ、HTTPスキーマのURLを渡した場合は、これだとうまくいきません。
理由は簡単で、MPMoviePlayerControllerのplayメソッドを呼んでも、すぐに再生が開始される訳ではないからです。
よって、play呼び出し直後には、まだウィンドウが追加されていません。

これを解決するためには、実際に再生が開始されたことが分かればいいのですが、そのような便利なイベントを取得するためのメソッドは用意されていません。
そこで、別のイベントを代わりに使用します。

それが、キーウィンドウ変更イベントです。
ムービーの再生が開始したということは、ムービープレイヤーウィンドウがキーウィンドウになったということです。
よって、キーウィンドウ変更の際に、上記コードを処理するように変更すればいいわけです。

まず、アプリ側でキーウィンドウ変更イベントの通知を受け取るように修正します。
ムービー再生開始前に以下のコードを追加します。
[[ NSNotificationCenter defaultCenter] addObserver: self selector: @selector( keyWindowChanged: ) name: UIWindowDidBecomeKeyNotification object: nil ];

この結果、キーウィンドウの変更があった場合に、- ( void ) keyWindowChanged:( NSNotification* ) notificationというメソッドが呼ばれようになります。(メソッド名は適宜入れ替えてください)

これで、ストリーミング再生の場合でもオーバレイビューを配置できるようになるはずです。
なお、今回の手法については、以下の点に考慮が必要です。

a. ムービープレイヤーウィンドウであることを直接、識別するためのAPIは現状では見当たらない(ムービープレイヤーウィンドウ自体は、UIWindowのサブクラスのインスタンスですが、そのクラスは公開されていません)

b. aの代替案として、再生開始前のウィンドウ数を保持しておき、playメソッド呼び出し後にウィンドウの総数が増えていれば、再生が開始したと考える

c. キーボード等の別ウィンドウとして定義されるビューを使用する場合、bが上手くいくか動作検証が必要



Appleさん…これ、どうにかなりませんか

スポンサーサイト
.18 2009

HTTPライブストリーミング

Tasakiです。
このところ、更新する機会を持てず3ヶ月ぶりとなってしまいました。
これからは週1では更新していきたいと考えていますので、改めまして宜しくお願い致します。

さて、今回のテーマですが、OS3.0(最新は3.1.2ですが…)で追加された機能の中でも、目玉の1つである HTTP ライブストリーミングについて、触れてみたいと思います。

映像のライブストリーミングと言えば、RTP / RTSPがこれまでの主流だったわけですが、iPhoneOSそしてQuickTimeXに、このテクノロジが導入されたことで、今後どうなっていくのか、個人的にも注目しています。

Appleのドキュメントにもありますが、このテクノロジの魅力は何と言っても、ほぼどのような接続環境でも問題なく視聴が可能だと言う点です。

RTPの場合は、ファイアウォールによってブロックされてしまう可能性があります。
設置型のPCならともかく、ネットブックや携帯電話は、いつ、どのような環境でネットワークに接続するかは分かりませんので、これは障害となります。
一方、どのようなネットワーク環境においても、HTTPがブロックされることは、まず考えられません。
このような点から、モバイルデバイスとの相性も良いといえます。
また、肝心の画質や途切れに関しても、予想以上の結果で非常に驚きでした。

では、実際にiPhone上に実装してみましょう。
iPhone SDKにおける動画プレイヤーといえば、MediaPlayerフレームワークのMPMoviePlayerControllerですが、これの初期化の際に、HTTPライブストリーミング用プレイリストファイルのURLを渡します。
ソースコードは以下の通りです。
NSURL* url = [ NSURL URLWithString: @"http://qthttp.apple.com.edgesuite.net/0909oijasdv/all.m3u8" ];
MPMoviePlayerController* moviePlayer = [[ MPMoviePlayerController alloc ] initWithContentURL: url ];
[ moviePlayer play ];

これをアプリのどこかに追加するだけで、OKです。非常に簡単です。

URLの部分は、ライブストリーミング用プレイリストファイルを指しています。
特にファイルでなくとも、このリクエストのレスポンスがプレイリストファイルと同等であれば構いません。
ただし、ローカルのプレイリストファイルを渡してもストリーミングはされないのでご注意ください。

ちなみに、サンプルのURLは、例の方の講演となっております。

 HOME 

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。