Webカメラの動画を保存し、再生するためのアプリケーションサンプル

2013年3月19日(火)
薬師寺 国安

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。

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

リスト2 (MainWindow.xaml.vb)

Option Strict On

写真、オーディオの録音とビデオのキャプチャを提供するクラスの含まれるWindows.Media.Captur名前空間をインポートします。

Imports Windows.Media.Capture

ファイル、フォルダ、およびアプリケーションの設定を管理するクラスの含まれる、Windows.Storage名前空間をインポートします。

Imports Windows.Storage

ユーザーがファイルを参照し、ファイルを開き、ファイルを保存する時、名前や拡張子、場所、を選択可能にするUI要素を管理するクラスの含まれる、Windows.Storage.Pickers名前空間をインポートします。

Imports Windows.Storage.Pickers

Public NotInheritable Class MainPage
  Inherits Page

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

動画を保存するVideoSaveShowプロシージャを実行します。

  Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    VideoSaveShow()
  End Sub

動画を保存する処理

ビデオライブラリにアクセスし、CreateFolderAsyncメソッドでVideoSampleというサブフォルダを作成します。CreateFolderAsyncにCreationCollisionOption.OpenIfExistsを指定すると、同名フォルダがある場合はそのフォルダを返し、ない場合は新規に作成してくれます。

接続されたカメラから単一のフォトかビデオをキャプチャするクラスである、新しいCameraCaptureUIのインスタンスmyCameraオブジェクトを作成します。
VideoSettings.Formatプロパティにキャプチャされたビデオを格納するための形式を設定します。
CameraCaptureUIVideoFormat.Mp4と指定して、保存するための形式をmp4形式とします。

CaptureFileAsyncメソッドで、ビデオをキャプチャするダイアログを表示するための操作オブジェクトを作成し、変数myFileで参照します。CameraCaptureUIMode.Videoと指定していますので、ユーザーはビデオのキャプチャだけが可能になります。

ビデオのキャプチャが可能であった場合は、ファイルの名前、拡張子、および格納場所をユーザーが選択できるようにするファイルピッカーを表す、新しいFileSavePickerクラスのインスタンスmyPickerオブジェクトを作成します。

SuggestedStartLocationプロパティに、ファイルの保存場所としてビデオライブラリを指定します。ただし実際に保存する場合は、ビデオライブラリのサブフォルダである、先に作ったVideoSampleサブフォルダを選択して、そこに保存します。ビデオライブラリに直接保存しても何ら問題はありません。

FileTypeChoices.Addメソッドで、ファイルに割り当てるようにユーザーが選択できる、有効なファイルのコレクションを追加します。ここではmp4で拡張子が.mp4のファイルだけを指定しています。

SuggestedFileNameプロパティで、ファイル保存ピッカーがユーザーに提示するファイル名を指定します。ここでは、「現在の年月日時間分秒」のファイル名を指定しています。拡張子は自動的に追加されますので、拡張子は省きます。

PickSaveFileAsyncメソッドで、ユーザーがファイルを保存したり、ファイル名、拡張子、およびファイルの保存場所を設定したりできるようにファイルピッカーを表示し、変数mySaveFileで参照します。

保存するファイルがきちんと指定された場合は、MoveAndReplaceAsyncメソッドで、指定したファイルを、指定されたファイルの場所に移動し、その場所の指定されたファイルを置き換えます。

非同期処理で行われるため、メソッドの先頭にAsyncを追加します。Asyncが追加されていると、その処理が非同期で行われることを意味します。

  Private Async Sub VideoSaveShow()
    Dim myStorageFolder As StorageFolder = Windows.Storage.KnownFolders.VideosLibrary
    Dim mySubFolder = Await myStorageFolder.CreateFolderAsync("VideoSample", CreationCollisionOption.OpenIfExists)
    Dim myCamera As New CameraCaptureUI
    myCamera.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4
    Dim myFile As StorageFile = Await myCamera.CaptureFileAsync(CameraCaptureUIMode.Video)
 
    If myFile Is Nothing = False Then
    Dim myPicker As New FileSavePicker
    myPicker.SuggestedStartLocation = PickerLocationId.VideosLibrary

    myPicker.FileTypeChoices.Add("mp4", New List(Of String)() From {".mp4"})
    myPicker.SuggestedFileName = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒")
  
    Dim mySaveFile As StorageFile = Await myPicker.PickSaveFileAsync
    If mySaveFile Is Nothing = False Then
      Await myFile.MoveAndReplaceAsync(mySaveFile)
    End If
  End If
End Sub

[再生]ボタンがクリックされた時の処理

FileOpenPickerクラスの新しいインスタンスOpenPickerオブジェクトを作成します。FileOpenPickerクラスは、ユーザーが選択し、ファイルを開くことのできるUI要素を表すクラスです。

ファイルを開く最初の場所を設定する、SuggestedStartLocationプロパティにビデオライブラリを指定しておきます。ただし、保存された動画ファイルは、ビデオライブラリのサブフォルダであるVideoSampleに保存していると思いますので、VideoSampleフォルダを開いて動画ファイルを指定してください。

開くファイルタイプを指定するFileTypeFilter.Addで「.mp4」を指定して拡張子が.mp4のファイルだけを表示します。
PickSingleFileAsynメソッドで、ユーザーが1つのファイルを選択できるようにファイルピッカーを表示し、変数myFileで参照します。
OpenFileAsyncメソッドで指定したファイルを読み取り専用で開きます。
MediaElementのSetSourceメソッドに、指定されたストリームを使用してSourceプロパティを設定します。
Playメソッドでビデオを再生します。

非同期処理で行われるため、メソッドの先頭にAsyncを追加します。Asyncが追加されていると、その処理が非同期で行われることを意味します。

  Private Async Sub playButton_Click(sender As Object, e As RoutedEventArgs) Handles playButton.Click
    Try
      Dim OpenPicker As New FileOpenPicker
      OpenPicker.SuggestedStartLocation = PickerLocationId.VideosLibrary
      OpenPicker.FileTypeFilter.Add(".mp4")
      Dim myFile = Await OpenPicker.PickSingleFileAsync
      Dim myStream = Await myFile.OpenAsync(FileAccessMode.Read)
      MediaElement1.SetSource(myStream, myFile.ContentType)
      MediaElement1.Play()
    Catch
      Exit Sub
    End Try
  End Sub

[戻る]ボタンがクリックされた時の処理

動画を保存する処理であるVideoSaveShowプロシージャを実行します。

  Private Sub backButton_Click(sender As Object, e As RoutedEventArgs) Handles backButton.Click
    VideoSaveShow()
  End Sub
End Class

今回はここまでです。ありがとうございました。

  • Webカメラの動画を保存し、再生するためのアプリサンプル

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

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

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

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

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