ヤフー株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。LINEヤフー Tech Blog

テクノロジー

番組の盛り上がりを見ながらテレビを操作できるiOSアプリを作ってみた

はじめに

こんにちは、Yahoo! JAPANエンジニアの植田裕司、上地洋祐、赤根稔朗です。先日リリースされました、iOSアプリ「テレViewing」、および、家電コントロールSDKの紹介をいたします。

テレViewingを作った経緯

iOSアプリ「テレViewing」は、2011年Q4(1月~3月)の植田のプロトタイプがもとになっています。

当時、さまざまなハッシュタグベースでツイートを解析している際、あるバラエティ番組で一番ツイートが盛り上がっている部分が、個人的に面白かった部分とマッチしていました。

一方、レコーダーのストレージ容量が増加し、便利な録画方法も増えてきた昨今、レコーダーのヘビーユーザーが、撮りためた番組を全て視聴するのは難しいというのが現状です。

そこで、「録画した番組の面白そうな部分をSeekして再生できないか?」というアプリを、空いた時間でプロトタイプしてみました。

プロトタイプの機能は以下になります。
  • ある特定時間内で、特定放送局ハッシュタグを含んだツイートの数を折れ線グラフとして表示―図中(1)
  • グラフの目盛りを動かすと、指示した時間帯のツイートが表示される―図中(2)
  • ツイートのセルをタップすると、録画番組の途中から再生される―図中(3)

上長にプロトタイプレビューをした結果、

  • この環境(アプリ、テレビ、レコーダーを同じネットワーク内に接続)を作れる人はすごく少なそう
  • リアルタイムの番組に対しては成り立たないか?
  • オリンピックの前にアプリリリースできないか?
などの評価を得て、それを踏まえて「現在放送中の番組に対するユーザーのアクション」にフォーカスしたアプリを作ることになりました。

テレViewingの説明

テレViewingのファーストリリースでは、機能を絞りブラッシュアップを行った結果、以下のようなシンプルな機能に落ち着きました。

  • どの放送局が盛り上がっているかを確認することができる
  • 放送局ごとに、過去2時間さかのぼって、盛り上がりのグラフをみることができる。
  • グラフで過去の盛り上がっているところに目盛りを合わせると、その時間帯のツイートのアーカイブを閲覧できる。
  • グラフで現在の時間のところに目盛りを合わせると、ツイートが自動更新されて閲覧できる。
  • 放送局のハッシュタグを付けてTwitterに投稿できる。
  • ツイートの詳細を閲覧できる。
  • 対象テレビを所持していて、ネットワークの設定を行うと、アプリからテレビのチャンネルを変更できる

以上の機能を備えて、それを使う場面としては以下のようなものを想定しました。
【スポーツ観戦、アイドル総選挙、朝の情報番組内におけるオリーブオイルコーナーなどを、見知らぬ人とでも一緒に盛り上がってテレビを見たい!】

【仕事が終わってないから、テレビ見れない! でも、番組の内容は気になる!】

このように、本アプリはテレビの前にいてもいなくても楽しめるものとなっております。また、チャンネル変更の方法は下記になります。

【ネットワーク準備】
同じWifiネットワーク内に、iOS端末と対応テレビを接続します。

【テレビ側準備】
今回はSHARP製のAQUOS LC-40L5で解説します。リモコンのホームボタン→設定→通信(インターネット)設定→AQUOSリモート設定→詳細設定→ログインID/パスワードの設定を行います。

【アプリ側準備】

アプリを起動して、設定画面に移動します。機器連携をオンにすると、同じネットワーク内にあるテレビが見つかります。先ほど設定したテレビのIDとパスワードを設定すると、準備完了です。アプリで放送局をタップすると、テレビのチャンネルが変わります!

次に、アプリの中で利用している、家電コントロールSDKによるチャンネル変更について、説明します。

家電コントロールSDK

テレViewingでは、IPによるコントロール機能に対応したテレビと連携させることでチャンネル変更を行うことができます。このチャンネル変更に、Yahoo! JAPAN社内で提供している「家電コントロールSDK」と呼んでいるライブラリを利用しています。家電コントロールSDKとは、一言で言うと「複数メーカの複数端末を一元的に制御する為のSDK」です。もともとテレビなどのAV機器を制御する際はIR(赤外線)を利用するのが常識でしたが、近年、IP経由で制御することができるインターフェースが実装されています。これにより、IPを利用してテレビのボリュームを上げたり、内蔵のブラウザーを起動したり、といった遠隔制御が可能になっています。

しかし、メーカごとに詳細仕様は異なっており、家庭内に複数のメーカーの製品がある場合、一元的に制御できないということが課題でした。そこで、「仕様差異の吸収はこちらで受け持つのでメーカ関係なく制御できるようにしましょう!」という提案を実現したのが家電コントロールSDKです。

家電コントロールSDKはiOS版・Android版を用意しており、テレViewingはiOS版を利用しています(iOSのアプリなので当然ですが)。

仕様について

今回は概要レベルでご説明いたします。
  • 家電コントロールSDK処理フロー概要図

1.制御対象のデバイス

  • テレビ・ハードディスクレコーダー・PCなど、家電コントロール機能に対応したさまざまな機器が対象となります
2.発見プロトコル群
  • 各メーカごとの仕様に則した、デバイス発見のプロトコルを実装したクラス群
3.DeviceManager
  • 制御可能なデバイスを管理するクラスSDK利用者はこのインターフェースを経由してデバイスの情報を取得する
4.カタログAPI
  • 発見されたデバイスが、どのような制御命令に対応しているかデータを保持している
5.TreeDevice
  • 発見されたデバイスの情報(デバイス名/実行可能な制御命令など)が格納されたインスタンス
6.IpControlManager
  • デバイスに対しての制御命令を管理するクラス
7.ロジックAPI
  • デバイスへの制御命令に必要な、実行順序、命令プロトコルなどの情報を保持している
8.命令プロトコル群
  • 各メーカごとの仕様に則した、デバイス制御を実行するプロトコルを実装したクラス群

家電コントロールSDKのAPIについて

上記図の通り、家電コントロールSDKは、専用のAPI群を持っています。APIを用意している理由は3つあります。理由1. 必要以上のデータをスマートフォンに含めないため理由2. SDKで制御可能な端末と、その端末に実行できる制御命令を管理するため理由3. 複数の命令を1つの論理命令にまとめて実行するためそれぞれについて以下で説明します。

まず理由1についてです。仕様の違うメーカごとの制御命令を実行する機構を全て家電コントロールSDKの中に含めたのでは、利用するお客様にとって不必要なデータ・機能が含まれてしまうことになります。現在はまだシャープ様のテレビにしか対応していませんが、将来的には対応メーカ・対応機種を増やす予定ですので、どんどんアプリ容量が膨らんでいくことになります。

そういった危惧もあり、基本的には必要なデータは必要になったタイミングでダウンロードする、という設計となっています。「必要になったタイミング」とは「チャンネルを変更する」「URLを指定してブラウザーを起動する」といった制御命令を実行するインターフェースが家電コントロールSDK利用者によって呼ばれた時を指します。

次に理由2についてです。仕様が異なる各メーカごとの機能にも、実現できることが同じなものがあります。これらを一つの命令として統一することで、家電コントロールSDKを利用する側はどのメーカの端末を制御するか、という意識をせずに実際の仕様が異なる制御命令を同じ構文で発行することができます。

最後に、理由3についてです。複数の端末に送ることのできる命令を組み合わせて、それを1つインターフェースとしてアプリ開発者側に提供することが可能です。例えばサーバー側で「家庭内の全ての端末に含まれるコンテンツからキーワード検索をする」という命令を用意するとアプリ開発者側はこのインターフェースをたたくだけで、家庭内にある複数のレコーダー・PCなどのコンテンツサーバーを横断的に検索した結果を取得する事が可能な設計になっています。

SDKのインターフェースについて

インターフェースは基本的に経由してもらうクラスを二つ用意しています。一つ目は「DeviceManager」クラスです。名前の通り、端末(=device)に関する情報を管理するクラスです。このDeviceManagerを経由して、同じネットワークの端末を探したり、いなくなったことを検知したり、端末のリストを最新に保ったりしています。

// DeviceManagerクラスはsingletonです
DeviceManager* dmgr = [DeviceManager sharedInstance];
// searchにより、ネットワーク内に端末検索を実行します
[dmgr search];
// sleep処理などを入れてここで検索待ちをする
TreeDeviceList* deviceList = [dmgr getDeviceList]; // 発見済みデバイスリストを取得します
TreeDevice* device = [deviceList objectAtIndex:0]; // デバイスのインスタンスを取得します(この例では仮に一番目の端末を取得しています)
二つ目のインターフェースは「IpControlManager」クラスです。家電コントロールSDK利用側はこのクラスを通じて端末に制御命令を実行します。また、命令を実行した後に結果を取得するのもこのクラスを経由します。
IpControlManager* ipmgr = [[IpControlManager alloc] initWithDevice:device]; // IpControlManagerクラスのインスタンスは、deviceクラスのインスタンスを引数に生成されます
// パラメータのkey-value mapを生成します
NSDictionary* paramDic = [NSDictionary dictionaryWithObject:@"https://www.yahoo.co.jp" forKey:@"url"]; 
[ipmgr execute:@"KickBrowserWithUrl", paramDic); // 「KickBrowserWithUrl」という制御命令を、↑のパラメータを指定して実行します。deviceで指定した端末のブラウザーが起動し、Yahoo! JAPANのトップページが開かれます。

今後の展望について

家電コントロールSDKについては、対応デバイスを増やしていったり、家庭外から家庭内の機器を操作できるようにしたいと考えています。そして、テレViewingについては、テレビをもっと面白く視聴できるという点にフォーカスをあてて新機能の追加や、Android対応などを目指していくことを考えています。

こちらの記事のご感想を聞かせください。

  • 学びがある
  • わかりやすい
  • 新しい視点

ご感想ありがとうございました

このページの先頭へ