音声を録音してライブラリに保存するプログラムを作る

2013年6月6日(木)
薬師寺 国安

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

[中止]ボタンの使用を不可とします。保存するかどうかの確認メッセージを表示して、[中止]ボタンが押された場合と、そうでない場合とで条件分岐を行います。

まず、[中止]ボタンが押された場合の処理です。

メッセージボタンにCommand.Addメソッドで、メッセージダイアログのコマンドバーにCancelをセットします。
CountdownControlを非表示にし、「保存を中止しました。」のメッセージを表示します。

ビデオライブラリのSoundFileサブフォルダにアクセスします。
GetFilesAsyncメソッドでSoundFileフォルダ内のファイルを取得し、コレクション変数delFileListに格納します。
コレクション変数delFileList内を変数resultで反復処理しながら、resultで取得したファイル名が、メンバ変数myFileNameのファイル名と同じなら、DeleteAsyncメソッドで現在のファイルを削除します。
カウントダウンの秒数を選択した時点でファイルが作成されますので、[中止]ボタンをタップした際には、作成されていたファイルを削除する必要があります。

ShowAsyncメソッドでメッセージダイアログを表示し、ComboBoxの選択状態を解除し、メンバ変数flagの値をFalseで初期化します。

[中止]ボタンが押されないでカウントダウンが0まで進行した場合の処理です。[OK]と[Cancel]ボタンを表示します。

Command.AddメソッドでOKをセットします。OKがタップされた時の処理です。文字列型の新しいリストであるfileList2を作成します。

MediaCaptureのStopRecordAsyncメソッドで、記録を停止し、ファイルを保存します。
「保存しました。」のメッセージを表示します。ビデオライブラリのSoundFileサブフォルダにアクセスします。SoundFileフォルダ内のファイルをGetFilesAsyncメソッドで取得し、コレクション変数myMP4FileList2に格納します。

コレクション変数myMP4FileList2内を変数myFileで反復処理しながら、リストであるfileList2にAddメソッドでファイルを追加していきます。
fileNameListBoxのItemsSourceプロパティにfileList2オブジェクトを指定します。リストボックスにファイル名の一覧が表示されます。

メッセージボタンにCommand.Addメソッドで、メッセージダイアログのコマンドバーにCancelをセットします。
CountdownControlを非表示にし、「保存を中止しました。」のメッセージを表示します。

ビデオライブラリのSoundFileサブフォルダにアクセスします。
GetFilesAsyncメソッドでSoundFileフォルダ内のファイルを取得し、コレクション変数delFileListに格納します。
コレクション変数delFileList内を変数resultで反復処理しながら、resultで取得したファイル名が、メンバ変数myFileNameのファイル名と同じなら、DeleteAsyncメソッドで現在のファイルを削除します。
ComboBoxの選択状態を解除し、メンバ変数flagの値をFalseで初期化します。

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

  Private Async Sub CountdownControl1_CountdownComplete(sender As Object, e As RoutedEventArgs) Handles CountdownControl1.CountdownComplete
    stopButton.IsEnabled = False
    Dim myDialog As New MessageDialog(myFileName& "を保存しますか?", "保存確認")
    If flag = True Then
        myDialog.Commands.Add(New UICommand("Cancel", Async Sub()
                CountdownControl1.Visibility = Windows.UI.Xaml.Visibility.Collapsed
                messageTextBlock.Text = "保存を中止しました。"
                Dim myFolder = KnownFolders.VideosLibrary
                Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists)
                Dim delFileList = Await mySubFolder.GetFilesAsync()
                  For Each result In delFileList
                    If Path.GetFileNameWithoutExtension(result.Path) & ".mp4" = myFileName Then
                        Await result.DeleteAsync()
                    End If
                  Next
                  Exit Sub
                End Sub))
      Await myDialog.ShowAsync
      ComboBox1.SelectedIndex = -1
      flag = False
    Else
      myDialog.Commands.Add(New UICommand("OK", Async Sub()
                                 Dim fileList2 As New List(Of String)
                                 Await myMediaCapture.StopRecordAsync()
                               messageTextBlock.Text = "保存しました。"
                               Dim myFolder = KnownFolders.VideosLibrary
                               Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists)
                               Dim myMP4FileList2 = Await mySubFolder.GetFilesAsync
                        For Each myFile In myMP4FileList2
                               fileList2.Add(Path.GetFileNameWithoutExtension(myFile.Path) & ".mp4")
                        Next
                               fileNameListBox.ItemsSource = fileList2
                               CountdownControl1.Visibility = Windows.UI.Xaml.Visibility.Collapsed
                      End Sub))
      myDialog.Commands.Add(New UICommand("Cancel", Async Sub()
                  CountdownControl1.Visibility = Windows.UI.Xaml.Visibility.Collapsed
                  messageTextBlock.Text = "保存を中止しました。"
                  Dim myFolder = KnownFolders.VideosLibrary
                  Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists)
                  Dim delFileList = Await mySubFolder.GetFilesAsync()
                    For Each result In delFileList
                      If Path.GetFileNameWithoutExtension(result.Path) & ".mp4" = myFileName Then
                      Await result.DeleteAsync()
                    End If
                  Next
                    Exit Sub
                  End Sub))
      Await myDialog.ShowAsync
      ComboBox1.SelectedIndex = -1
      flag = False
    End If
  End Sub

音声の再生が最後まで行われた場合の処理

IsActiveプロパティにFalseを指定して、プログレスリングのアニメーションを終了します。プログレスリングの使用を不可とします。

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

[中止]ボタンがタップされた時の処理

メンバ変数flagをTrueで初期化します。StopRecordAsyncメソッドで記録を停止します。
ビデオライブラリのSoundFileサブフォルダにアクセスし、GetFilesAsyncメソッドでSoundFileフォルダ内のファイルを取得してコレクション変数delFileListに格納します。

コレクション変数delFileList内を変数resultで反復処理しながら、ファイル名がメンバ変数myFileNameと同じである場合は、DeleteAsyncメソッドで現在のファイルを削除します。
CountdownControlを非表示にします。

CountDownControlのSecondsプロパティに1を指定し、[中止]ボタンの使用を不可とします。
CountdownControlを非表示にし、ComboBoxの選択状態を解除し、処理を抜けます。

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

  Private Async Sub stopButton_Click(sender As Object, e As RoutedEventArgs) Handles stopButton.Click
    flag = True
    Await myMediaCapture.StopRecordAsync()
    Dim myFolder = KnownFolders.VideosLibrary
    Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists)
    Dim delFileList = Await mySubFolder.GetFilesAsync()
    For Each result In delFileList
      If Path.GetFileNameWithoutExtension(result.Path) & ".mp4" = myFileName Then
        Await result.DeleteAsync()
        CountdownControl1.Visibility = Windows.UI.Xaml.Visibility.Collapsed
      End If
    Next
    CountdownControl1.Seconds = 1
    stopButton.IsEnabled = False
    CountdownControl1.Visibility = Windows.UI.Xaml.Visibility.Collapsed
    ComboBox1.SelectedIndex = -1
    Exit Sub
  End Sub

リストボックスからファイル名が選択された時の処理

プログレスリングのアニメーションを開始します。文字列型の新しいリストであるfileList3を作成します。

ビデオライブラリのSoundFileサブフォルダにアクセスします。
GetFilesAsyncメソッドでSoundFileフォルダ内のファイルを取得して、コレクション変数myMP4FileList3に格納します。
コレクション変数myMP4FileList3内を変数resultで反復処理しながら、リストであるfileList3にAddメソッドでファイル名を追加していきます。
GetFileAsyncメソッドで、リストであるfileList3が格納しているファイル名で、fileNameListBoxから選択された項目のインデックスに該当するファイル名を取得して、変数myFileに格納します。
OpenAsyncメソッドで選択されたファイルを「読み取り専用」モードで開き、myStreamで参照します。
MediaElementのSetSourceメソッドで、指定されたストリーム(myStream)を使用して、Sourceプロパティを設定します。
SetSourceの第2引数にはmyFile.ContentTypeと指定して、ファイルのコンテンツのMIME型を取得します。Playメソッドで再生を開始します。

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

  Private Async Sub fileNameListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles fileNameListBox.SelectionChanged
    Try
      'ProgressRing1.Visibility = Windows.UI.Xaml.Visibility.Visible
      ProgressRing1.IsEnabled = True
      ProgressRing1.IsActive = True
      Dim fileList3 As New List(Of String)
      Dim myFolder = KnownFolders.VideosLibrary
      Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists)
      Dim myMP4FileList3 = Await mySubFolder.GetFilesAsync
 
      For Each result In myMP4FileList3
        fileList3.Add(Path.GetFileNameWithoutExtension(result.Path) & ".mp4")
      Next
      Dim myFile = Await mySubFolder.GetFileAsync(fileList3(fileNameListBox.SelectedIndex))
      Dim myStream = Await myFile.OpenAsync(FileAccessMode.Read)
      MediaElement1.SetSource(myStream, myFile.ContentType)
      MediaElement1.Play()

    Catch
      ProgressRing1.IsEnabled = False
      ProgressRing1.IsActive = False
      Exit Sub
    End Try
  End Sub

End Class

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

筆者からのお知らせ

筆者はWindowsストアでアプリを公開しています。チャームの検索からWindowsストアを選択して、検索欄に、kuniyasuまたはYakushijiKuniyasuと入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。

  • 音声を録音してライブラリに保存するプログラム

薬師寺国安事務所

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

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