指定した秒数で音声を録音して、その音声を再生するサンプルアプリ
次に、ソリューションエクスプローラー内の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
今回はここまでです。ありがとうございました。
指定した秒数で音声を録音して、再生するサンプル