動画を撮影して分離ストレージに保存し、再生する

2012年1月16日(月)
PROJECT KySS

次に、MainPage.xamlを展開して表示される、MainPage.xaml.vbをダブルクリックしてリスト2のコードを記述します。

ロジックコードを記述する

リスト2 (MainPage.xaml.vb)

Option Strict On
Silverlight ベースのアプリケーション内の描画、テキスト、オーディオ コンテンツ、ビデオ コンテンツなどのメディアを提供するクラスの含まれる、System.Windows.Media名前空間をインポートします。
Imports System.Windows.Media

仮想ファイルシステムを作成および使用するための型が含まれている、System.IO.IsolatedStorage名前空間をインポートします。分離ストレージによって、安全なクライアント側のストレージが提供されます。
Imports System.IO.IsolatedStorage
Partial Public Class MainPage
  Inherits PhoneApplicationPage

  ' コンストラクター
  Public Sub New()
    InitializeComponent()
  End Sub

ビデオ キャプチャに関連付けられている、キャプチャ デバイスから使用するためのメソッドを提供する、新しいCaptureSourceクラスのインスタンス、mySourceをメンバ変数として宣言します。
  Dim mySource As New CaptureSource

ビデオキャプチャに Windows PhoneのSilverlight をファイルに保存するために使用する、新しいFileSinkクラスのインスタンス、fsをメンバ変数として宣言します。
  Dim fs As New FileSink

ビデオコンテンツで領域を塗りつぶす、VideoBrushクラス型のメンバ変数myVideoBrushを宣言します。
  Dim myVideoBrush As VideoBrush

保存されるビデオのファイル名はsample.mp4と固定しておきます。全てこのファイル名に上書きされます。
  Const fileName As String = "sample.mp4"

ページがアクティブになった時の処理

変数isostoreを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言します。FileExistsメソッドでsample.mp4というファイルが存在しているかどうかをチェックし、存在している場合は、[再生画面へ遷移]ボタンを使用可能にします。それ以外は使用不可とします。
  Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs)
    Using isostore As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication
      If isostore.FileExists(fileName) = True Then
        playButton.IsEnabled = True
      Else
        playButton.IsEnabled = False
      End If
    End Using
    MyBase.OnNavigatedTo(e)
  End Sub

[開始]ボタンがタップされた時の処理

CaptureDeviceConfiguration.GetDefaultVideoCaptureDeviceメソッドで、クライアント上の既定のビデオキャプチャデバイスを表すVideoCaptureDevice オブジェクトを取得します。
CaptureDeviceConfiguration.GetDefaultAudioCaptureDeviceメソッドで、クライアント上の既定のオーディオキャプチャデバイスを表すAudioCaptureDevice オブジェクトを取得します。
CaptureSourceのVideoCaptureDeviceプロパティに既定のビデオキャプチャデバイス(myVideo)を指定します。
CaptureSourceのAudioCaptureDeviceプロパティに既定のオーディオキャプチャデバイス(myAudio)を指定します。
VideoBrushクラスの新しいインスタンス、myVideoBrushオブジェクトを作成します。VideoBrush.SetSourceメソッドで、CaptureSourceを指定し、VideoBrushのソースを設定します。
Rectangle内を、Fillプロパティに、VideoBrushソースの設定されたmyVideoBrushを指定して塗りつぶします。これで、Rectangle内にビデオが表示されます。
変数isostoreを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言します。FileExistsメソッドでsample.mp4というファイルが既に存在する場合は、DeleteFileメソッドでsample.mp4ファイルをいったん削除します。
分離ストレージ内のファイルを表すIsolatedStorageFileStreamクラス用オブジェクト変数myStream変数を用意し、IsolatedStorageFile.CreateFileメソッドで、分離ストレージ内にsample.mp4ファイルを作成します。
FileSinkクラスのIsolatedStorageFileNameプロパティに、sample.mp4のファイル名を指定します。IsolatedStorageFileNameプロパティには、関連付けられている分離ストレージファイルの名前を指定します。
FileSinkクラスのCaptureSourceプロパティに、mySourceオブジェクトを指定します。CaptureSourceプロパティは、この FileSink が関連付けられているキャプチャソースを取得します。
CaptureSourceのStartメソッドで、CaptureSource に関連した、全てのキャプチャデバイスからのキャプチャを開始します。[終了]ボタンの使用を可能にします。
  Private Sub startButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles startButton.Click

    Dim myVideo As VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice
    Dim myAudio As AudioCaptureDevice = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice

    mySource.VideoCaptureDevice = myVideo
    mySource.AudioCaptureDevice = myAudio
 
    myVideoBrush = New VideoBrush
    myVideoBrush.SetSource(mySource)
 
    Rectangle1.Fill = myVideoBrush
 
    Using isostore As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication
      If isostore.FileExists(fileName) = True Then
        isostore.DeleteFile(fileName)
      Else
        Dim myStream As IsolatedStorageFileStream = isostore.CreateFile(fileName)
        myStream.Close()
      End If
    End Using
    fs.IsolatedStorageFileName = fileName
    fs.CaptureSource = mySource
    mySource.Start()
    endButton.IsEnabled = True
  End Sub

[終了]ボタンがタップされた時の処理

CaptureSourceのStopメソッドで、CaptureSourceに関連した、全てのキャプチャデバイスからのキャプチャを停止します。FileSinkのCaptureSource、IsolatedStorageFileNameプロパティにNothingを指定し、全てのオブジェクトの関連付けを破棄します。[再生画面へ遷移]ボタンの使用を可能にします。
  Private Sub endButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles endButton.Click
    mySource.Stop()
    fs.CaptureSource = Nothing
    fs.IsolatedStorageFileName = Nothing
    playButton.IsEnabled = True
  End Sub

[再生画面へ遷移]ボタンがタップされた時の処理

これから作成する、VideoPlayPage.xamlに遷移します。
  Private Sub playButton_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles playButton.Click
    NavigationService.Navigate(New Uri("/VideoPlayPage.xaml", UriKind.Relative))
  End Sub
End Class

「Windows Phone 縦向きのページ」(VideoPlayPage.xaml)の作成

VS2010メニューの[プロジェクト(P)/新しい項目の追加(W)]と選択し、「Windows Phone 縦向きのページ」を選択します。「名前(N)」にはVideoPlayPage.xamlと入力します(図3)。

図3:「Windows Phone 縦向きのページ」(VideoPlayPage.xaml)を作成する(クリックで拡大)
  • 「動画を撮影して分離ストレージに保存し、再生する」のサンプルファイル

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています