Windows 8 Store Applicationプログラミング(基本編) 10

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

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

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

リスト2 (MainWindow.xaml.vb)

Option Strict On

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

Imports Windows.Media.Capture

プロパティのメディア フォーマットを作成するために必要な、その他のプログラミング要素を提供するクラスの含まれる、Windows.Media.MediaProperties名前空間をインポートします。

Imports Windows.Media.MediaProperties

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

Imports Windows.Storage

シーケンシャルとランダム アクセスのストリームの読み書きを提供するクラスの含まれる、Windows.Storage.Streams名前空間をインポートします。

Imports Windows.Storage.Streams

Public NotInheritable Class MainPage
  Inherits Page

MediaCaptureクラスの型のmyMediaCaptureオブジェクトメンバ変数を宣言します。MediaCaptureクラスは、フォト、オーディオ録音、およびビデオキャプチャを表すクラスです。

  Dim myMediaCapture As MediaCapture

MediaCaptureオブジェクトの初期化設定を含むクラスである、MediaCaptureInitializationSettings型の、myCaptureInitSettingメンバ変数を宣言します。

  Dim myCaptureInitSetting As MediaCaptureInitializationSettings

オーディオまたはビデオファイルのためのエンコードのプロファイルを表す、MediaEncodingProfile型のメンバ変数、myProfileを宣言します。

  Dim myProfile As MediaEncodingProfile

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

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

GetFileAsyncメソッドで作成したサブフォルダーSoundFile内のファイルを取得してファイルのコレクション変数である、DataFileに格納しておきます。DataFileのCountプロパティでファイルの個数を取得し、ファイルが存在する場合は、[再生]ボタンの使用を可能にします。そうでない場合は使用を不可とします。

新しいMediaCaptureのインスタンスmyMediaCaptureオブジェクトを作成します。同じく、新しい、MediaCaptureInitializationSettingsのインスタンス、myCaptureInitSettingオブジェクトを作成します。

マイクのデバイスIDを表す文字列である DeviceInformation.Id を取得する、AudioDeviceIdプロパティをString.Emptyで初期化します。ストリーミングモードを設定するStreamingCaptureModeプロパティにAudioを設定します。各プロパティの設定されたMediaCaptureInitializationSettingsのインスタンス、myCaptureInitSettingオブジェクトで、MediaCaptureオブジェクトを初期化します。

オーディオまたはビデオファイルのためのエンコードのプロファイルを表す、MediaEncodingProfileのCreateMp4メソッドで、ビデオエンコーディングの形式をAutoと指定して、ビデオのためのエンコーディングプロファイルを作成します。VideoEncodingQuality 列挙体の詳細については、下記URLを参照してください。
→ VideoEncodingQuality enumeration (Windows)

非同期処理で行われるためメソッドの先頭にAsyncを追加します。

  Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    Dim myFolder = KnownFolders.VideosLibrary
    Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists)
    Dim DataFile As IReadOnlyList(Of StorageFile) = Await mySubFolder.GetFilesAsync()
 
    If DataFile.Count > 0 Then
      playButton.IsEnabled = True
    Else
      playButton.IsEnabled = False
    End If
 
    myMediaCapture = New MediaCapture
    myCaptureInitSetting = New MediaCaptureInitializationSettings
    myCaptureInitSetting.AudioDeviceId = String.Empty
    myCaptureInitSetting.StreamingCaptureMode = StreamingCaptureMode.Audio
 
    Await myMediaCapture.InitializeAsync(myCaptureInitSetting)
    myProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto)
  End Sub

カウントダウンが終了した時の処理

[再生]ボタンの使用を可能にします。StopRecordAsyncメソッドで録音を停止します。

非同期処理で行われるためメソッドの先頭にAsyncを追加します。

  Private Async Sub CountdownControl1_CountdownComplete(sender As Object, e As RoutedEventArgs) Handles CountdownControl1.CountdownComplete
    playButton.IsEnabled = True
    Await myMediaCapture.StopRecordAsync()
  End Sub

コンボボックスの秒数が選択された時の処理

コンボボックスの選択された項目のインデックスを変数Indexに格納しておきます。変数Indexの値を数値に変換してmyIndex変数に格納しておきます。

CountdownControlの秒数を表すSecondsプロパティに変数myIndexの値を指定します。コンボボックスから5を選択すると、5秒カウントダウンされることになります。

ビデオライブラリのSoundFileサブフォルダーにアクセスします。

CreateFileAsyncメソッドで、SoundFileサブフォルダーにTest.mp4というファイルを作成します。CreationCollisionOption.ReplaceExistingと指定して、同名ファイルがある場合は上書きします。作成したファイル情報を変数newFileに格納します。ファイルを表すmyStorageFileにnewFileを指定します。

CreationCollisionOption 列挙体については、下記URLを参照してください。
→ CreationCollisionOption enumeration (Windows)

StartRecordToStorageFileAsyncメソッドで、オーディオまたはビデオファイルのためのエンコードのプロファイルを表す、MediaEncodingProfileのインスタンスmyProfileオブジェクトと、ファイル名を保持しているmyStorageFileを指定して、ストレージファイルへの非同期的な記録を開始します。

非同期処理で行われるためメソッドの先頭にAsyncを追加します。

  Private Async Sub ComboBox1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboBox1.SelectionChanged
    Dim Index = DirectCast(ComboBox1.SelectedItem, ComboBoxItem)
    Dim myIndex As Integer = CInt(Index.Content)
    CountdownControl1.Seconds = myIndex
    Dim myFolder = KnownFolders.VideosLibrary
    Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists)
    Dim newFile = Await mySubFolder.CreateFileAsync("Test.mp4", CreationCollisionOption.ReplaceExisting)
    Dim myStorageFile As StorageFile = newFile
    Dim result = myMediaCapture.StartRecordToStorageFileAsync(myProfile, myStorageFile)
  End Sub

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

ProgressRingを使用可能にします。ProgressRing1.IsActiveプロパティにTrueを指定して、進行状況をProgressRingで表示します。

ビデオライブラリのSoundFileサブフォルダーにアクセスします。GetFileAsyncメソッドでTest.mp4ファイルを取得します。OpenAsyncメソッドでTest.mp4のランダムアクセスストリームを開き、変数myStreamで参照します。FileAccessMode.Readと指定して、読み込み専用で開きます。MediaElementのSetSourceメソッドに、Test.mp4ファイルを開いているmyStreamと、ファイルのコンテンツのMIME型を取得して指定します。MediaElementをPlayメソッドで再生します。録音内容が再生されます。

非同期処理で行われるためメソッドの先頭にAsyncを追加します。

  Private Async Sub playButton_Click(sender As Object, e As RoutedEventArgs) Handles playButton.Click
    ProgressRing1.IsEnabled = True
    ProgressRing1.IsActive = True
    Dim myFolder = KnownFolders.VideosLibrary
    Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists)
    Dim myFile = Await mySubFolder.GetFileAsync("Test.mp4")
    Dim myStream = Await myFile.OpenAsync(FileAccessMode.Read)
    MediaElement1.SetSource(myStream, myFile.ContentType)
    MediaElement1.Play()
  End Sub

再生が完了した時の処理

ProgressRingの進行状況を表示しないようにし、使用を不可とします。

  Private Sub MediaElement1_MediaEnded(sender As Object, e As RoutedEventArgs) Handles MediaElement1.MediaEnded
    ProgressRing1.IsActive = False
    ProgressRing1.IsEnabled = False
  End Sub
End Class

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

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る