2013年6月19日水曜日

UTCamera風 jQueryプラグイン作った

UTCamera風な画像をブラウザでできるプラグイン作った。
※WebRTCの機能が対応してて、有効設定されてるブラウザのみで動作します。ご注意ください。
※PC版のChromeなら動きます。

以下にソースを公開してあります。

https://github.com/wakasamasao/bcam/

使い方は以下のソースを参照ください。
https://github.com/wakasamasao/bcam/blob/master/bcam.html

流れとしては
  1. WebRTCの機能を用いてブラウザがWebCamにアクセスを試みる
    -> ブラウザから使用許可を求められるので許可が必要です
  2. 200ms毎(ブラウザの処理によって遅延することが多い)にカメラ画像を取得
  3. 10回撮影したら画像を合成しGIFアニメに変換
  4. base64にエンコードした文字列が返ってくる
という形です。
設定で撮影秒間や回数、ループするしない、フィルムロールのようにコマ撮り写真にするなどいろいろ変更できます。

とりあえず、こんなのが作成できます。
GIFアニメのはループリバースがかかってるため、自然に繰り返してるように見えます。



なお読み込み時のJSですが、GIFアニメ化するかしないかで必要とするプラグイン変わるのですが、
<script src="js/gifencoder/b64.js"></script>
<script src="js/gifencoder/LZWEncoder.js"></script>
<script src="js/gifencoder/NeuQuant.js"></script>
<script src="js/gifencoder/GIFEncoder.js"></script>
に関してはGIFアニメ化するのに必要なライブラリです。読み込まなかったらGIFアニメにはできず、フィルムロールタイプしか生成できません。

パラメータは以下のような感じで設定すると色々変わります。

width:200, // 生成される画像の横幅
height:200, // 生成される画像の縦幅
times:10, // 繰り返し回数
timing:200, // 取得タイミング(ms)
type:"animation", // 出力タイプ animation:GIFアニメ , pict:Film roll風
playtiming:100, // GIFアニメの場合の再生スピード
format:"png", // typeでpict指定の場合の出力フォーマット png | jpeg
layout:"horizontal", // 現在使ってないが設定
reverse:true, // アニメーション終了後に逆再生して繰り返しに違和感無いにするかどうか
videoObj:null, // ここにvideo tagのオブジェクトを指定するとそこにカメラ画像を表示
insertvideo:false, // 実行してるdomにキャプチャ用のvideoを表示するかどうか
oncomplete:null,  // 終了後のイベント
onend:null, // キャプチャ終了後のイベント
onstart:null, // キャプチャ開始のイベント
onerror:null, // エラー時のイベント
onwarning:null, // 警告時のイベント

万華鏡タイプのエフェクトとか色々やろうとは思ってるんですが頓挫中。
他にフィルムロール状態が縦並びとか正方形とか色々並べ替えたり・・いやなんでもない。
そもそもこれを使ったサービスを先に作れ・・と・・・・・・。ゴフゥ(吐血
あ、アイディアはあるんですよ?つ、作ってたら凝りだして・・いや・・ね・・(汗


2013年6月11日火曜日

html5のVideoタグでLive配信をするApple

Appleの基調講演の配信ページがsafari限定になっていて、何をやってるのか見てみた。

埋め込みタグは
<video id="movie" class=" video" src="http://p.events-delivery.apple.com.edgesuite.net/13oygadvoyibawefpiuawefpiuawdf6/sl_mvp.m3u8" x-webkit-airplay="allow" autohref="true" width="848" height="480" autoplay="autoplay" jsonurl="/apple-events/scripts/ac_media_jsons/june_2013_event.json" expectingmoviejson="true" spec="" style="width: 848px; height: 480px; "></video>
となっています。
おおお!Videoタグ!
たしか前回はObjectタグでQT呼び出しだったはず。
コントローラーは<div>で自作されていた。ShadowDOMな感じではない状態で。

srcには .m3u8 という拡張子のファイルを呼び出しています。
このm3u8はプレイリスト用のよくあるフォーマットです。
http://ja.wikipedia.org/wiki/M3U 
src指定されてるものは最初の画面関連の動画プレイリストのようです。
あと気になるところとして jsonurl という謎のアトリビュートが設定されています。
このjsonファイルも見てみると、これもm3u8のプレイリストを呼び出しています。
で、m3u8のファイル辿ってみると約9秒毎の .ts ファイルを連続再生させています。
中の .ts ファイルは srcで指定されてるのは開始タイミングで行われていたものが定義されています。jsonurlで指定されてるものは、常時更新されているようです。

この配信方法はhttpのライブ配信では王道のアルゴリズムではあるが、将来Videoタグでライブ配信するときに使われるスタンダードになっていくのだろうか?
W3CなどでLive配信についてはどう議論されてるか追えていないのでよくわかってはいませんが・・後で調べてみます。
DRMかけてセッションがないとDLできない、帯域をデバイスやネットワークなどで常時変更しまくったり、共有しようとしても細切れまくってるから共有するのがめんどくさくなるなどは実現できそうな気はする。
あと、プレイリストの生成をどうなるかがわからないけど、WebRTCな感じでP2Pな方法で動画ファイル送りまくるという方法がうまく使えるかな?

ただ、どうも不安定なようで、再生中に突然src属性で指定されていた最初の動画が流れてしまったり、動画の切替で1フレーム程度白いものが入って変にフラッシュするような挙動になったり、取得できなかった動画をスキップしまくったりしていました。

追記:
HTTP Live Streaming ですねと教えてもらいました。
http://en.wikipedia.org/wiki/HTTP_Live_Streaming
この方法にはiOS時代になって(Flashがないので・・)一気に普及した方法です。
YoutubeLiveもiOS対応になるのがこのあたりで時間かかった感じだったと思います。
videoタグにもとうとうHTTP Live Streamingがやってきたかというのが胸熱。