T

【Titanium Mobile】新しいアプリを作成しました

ぐっどうぃる博士の音ライブラリ - For One First Inc.ぐっどうぃる博士の音ライブラリ

今回はリモートの音声データをストリーミング再生、またはダウンロードして保存するアプリを作成しました。音声データは今後どんどん追加されていきますが、新着データがあればトップ画面を表示中にTwitterクライアントみたいに勝手に追加されていきます。

TEDみたいな感じで、回線状況に関係なく再生したい方はダウンロード、ちょっと聴いてみたい方はストリーミングを選べるようになっています。ダウンロードしたデータはプレーヤー画面のスライダーを操作して好きなところから再生することができます。

再生画面

Titanium Mobileで苦労したところはこの再生画面で、最終的にはTitanium Mobile自体に手を入れてしまいました。プラグインにしてもよかったのですが、それは今後の課題です。簡単な変更で動画プレーヤーの実装が楽になるので、これは実装してほしいんですけどねえ。

Titanium Mobile側の変更は以下の通り:

diff --git a/iphone/Classes/TiMediaVideoPlayerProxy.m b/iphone/Classes/TiMediaVideoPlayerProxy.m
index 93cd37c1..3ad7116 100644
--- a/iphone/Classes/TiMediaVideoPlayerProxy.m
+++ b/iphone/Classes/TiMediaVideoPlayerProxy.m
@@ -660,6 +660,11 @@ NSArray* moviePlayerKeys = nil;
        }
 }
 
+-(void)setCurrentPlaybackTime:(NSNumber*)time
+{
+  [movie setCurrentPlaybackTime:[time doubleValue]];
+}
+
 -(NSNumber*)currentPlaybackTime
 {
        ONLY_IN_3_2_OR_GREATER(currentPlaybackTime)
@@ -1172,4 +1177,4 @@ NSArray* moviePlayerKeys = nil;
 
 @end

これでスライダー付きの動画プレーヤーが簡単にできちゃうんですが、実は困ったことに1.8系からは現在の再生時間をこれまでと1,000倍も違うミリ秒単位で返すようになったので、スライダ部分は今後は更新が必要になります。地味に嫌な仕様変更です。

音声再生中にsetIntervalしたobserverが再生状況をみてスライダーを同期させるので、手で触ってスライダーを動かしたのと区別する必要があります。そこでtouchstartイベントを取得して、終わったらtouchendで解放するようにしました。

###
playerはTi.Media.createVideoPlayerしたオブジェクト
progressはTi.UI.createProgressBarしたオブジェクト
###

moved_by_user = false

progress.addEventListener('touchstart', (e)->
  moved_by_user = true
  return
)
progress.addEventListener('touchend', (e)->
  slider_value = e.value
  if player.duration
    to = parseInt(player.duration * (slider_value / 100))
    player.setCurrentPlaybackTime(to)
  moved_by_user = false
  return
)

observer = ()->
  if moved_by_user == false
    if player.currentPlaybackTime > 0
      current_time = player.currentPlaybackTime 
      val = current_time / player.duration * 100
      progress.value = val
      return
timer = setInterval(observer, 1000)

こんな感じで実装しました。フォーワンファースト社のみなさん、辛抱強くお付き合い頂きありがとうございました。

Posted by on 1月 17, 2012 in Titanium

コメントを残す