音声を録音してライブラリに保存するプログラムを作る
カウントダウンが終了した時の処理
[中止]ボタンの使用を不可とします。保存するかどうかの確認メッセージを表示して、[中止]ボタンが押された場合と、そうでない場合とで条件分岐を行います。
まず、[中止]ボタンが押された場合の処理です。
メッセージボタンに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と入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。
音声を録音してライブラリに保存するプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 指定した秒数で音声を録音して、その音声を再生するサンプルアプリ
- Webカメラで撮影した写真をセピア調に演出するアプリを作る
- 時刻とともに、その日の出来事をキャラクターが音声で教えてくれるアプリを作る
- お気に入りの写真に登場する、仲良しクラウディアちゃん
- ピクチャライブラリ内の画像を指定して表示する+1つのサンプル
- 場所と写真を記録するプログラムを作って思い出のシーンを保存しよう
- 画像に各種フィルタを適用して保存するWindowsアプリを作る
- 撮影した写真の管理ができるマイフォトアプリを作る
- CountDownControlを使ってカウントダウン後にカメラのシャッターを切る
- Webカメラを使ったアプリを作ろう