[WinRT] 動画を表示する2GBの自作アプリを作ろう

Community Open Day 2013 用のネタの続き

Acer w500 に Windows 8 を入れて、Vaio のノートを Windows 8 に変えてから常々悩んでいたのが、セカンドモニタ(実際にはセカンドPC)への動画表示です。自宅で作業をしているのもあり、PCファンの音を消すためもあり、動画を流し続けていることが良くあります。本体のPCパワーを喰われたくないので、ノートPCかタブレットPCで動かしていることが多いのですが、ちょっと動画の切り替えが面倒。動画はストア版のVideoで動かします。*.mp4か*.aviであれば、そのまま表示できるのでこれで。*.mkv の場合はちょっとパワーが足りなくて(特に Acer w500 の場合)、ってことで Video で。

さて、ストア版の Video ではいちいちファイルを開くで、*.mp4 を選択しないといけません。


続けて作業をするのに、いちいちピッカーを開くのは面倒です。

なので、もっぱらデスクトップから mp4 を動かすのですが、エクスプローラーのアイコンが小さくて、ちまちま押すが面倒です。大きなアイコンを使えばいいのですが、これもなかなか妙な感じで使いづらい。

そんな訳で、

  • 指定フォルダから、さっくりと mp4 を再生させたい
  • Surface RTで動かすからストアアプリで

ってことを考えていた訳です。子供に映画を見せるのに、エクスプローラーから選ぶってのも大変なので、そのたりも考えて。

■真面目な方法を考える

真面目に考えると、「ストアアプリでは実現できません」という結論になります。ストアアプリのセキュリティ上、ビデオファイルの選択はユーザーの手に委ねられるので、これの抜け道はありません。かつ、マイドキュメントやマイピクチャじゃなくて、ネットワークドライブ上(ほかのPCなど)に置かれているファイルはアクセスできません。おしまい、ってな感じですね。

ストアに出したい場合はそこでおしまいなのですが、ストアに出さないのであれば、いろいろ考えられます。

■私的に利用するだけを考える

いくつかアイデアを並べてみると、

  • 動画を流すためのストリームサーバーを用意して、ストリームを受けるストアアプリを作る。
  • 初回だけ、アプリローカルに保存する動作をさせて、ローカルフォルダから起動する。
  • アプリに動画を含めてしまう。

正式にはストリームサーバーを用意するのが良いのですが、うーん、なんか面倒そうだし良くわかりません(これは、後で調べて実現したいかと)。初回だけコピーってのもいいけど、作りが面倒。なわけで、アプリに動画を含めてしまう方式をとってみました。

ワイドロゴも用意してみました。


プロジェクトに avi ファイルを追加していきました。


画面はこんな感じで。


コードはこんな感じで。

/// <summary>
/// ビデオを再生する
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void VideoClick(object sender, RoutedEventArgs e)
{
    string path = "";
    switch ( (string)((Button)sender).Content)
    {
        case "第1話": path = "hidamari-01.avi"; break;
        case "第2話": path = "hidamari-02.avi"; break;
        case "第3話": path = "hidamari-03.avi"; break;
        case "第4話": path = "hidamari-04.avi"; break;
        case "第5話": path = "hidamari-05.avi"; break;
        case "第6話": path = "hidamari-06.avi"; break;
        case "第7話": path = "hidamari-07.avi"; break;
        case "第8話": path = "hidamari-08.avi"; break;
        case "第9話": path = "hidamari-09.avi"; break;
        case "第10話": path = "hidamari-10.avi"; break;
        case "第11話": path = "hidamari-11.avi"; break;
        case "第12話": path = "hidamari-12.avi"; break;
    }
    if (path == "") return;
    path = @"video\" + path;
    var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(path);
    var ret = await Windows.System.Launcher.LaunchFileAsync(file);
}

■出来上がったファイルを Surface RT に転送する

お手軽私的利用のアプリを早速Surface RTに転送する訳ですが、リモート接続で転送しようとすると video フォルダ内が 2GB ぐらいあって、ちょっとやそっとじゃ終わらない。なので、パッケージを作って転送しています。アプリケーション パッケージのローカルな共有 (Windows ストア アプリ) パッケージを作って、かつインストールします。

で、なんやかやでインストールができると、無事自作アプリからビデオで動画が表示できます。画像がついていないボタンなので内容がわかりづらいですが、子供用に画像をつけてやれば、それっぽいアプリになるかと。

日曜大工気分でプログラムは30分、転送などが1時間(苦笑)というパターンで出来上がるって訳です。

カテゴリー: C#, WinRT パーマリンク