指定した秒数で音声を録音して、その音声を再生するサンプルアプリ

2012年12月18日(火)
薬師寺 国安

次に、ソリューションエクスプローラー内の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

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

  • 指定した秒数で音声を録音して、再生するサンプル

薬師寺国安事務所

薬師寺国安事務所代表。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メルマガ会員のサービス内容を見る

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