音声を録音してライブラリに保存するプログラムを作る
ビデオライブラリへのアクセス許可
ソリューションエクスプローラー内のPackage.appxmanifestファイルをダブルクリックして開きます。
「機能」タブ内の「機能:」にある、「マイク」と「ビデオライブラリ」にチェックを付けます。
次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。
ロジックコードを記述する
リスト2 (MainWindow.xaml.vb)
Option Strict On
写真、オーディオ録音、ビデオなどをキャプチャするクラスの含まれる、Windows.Media.Capture名前空間をインポートします。
Imports Windows.Media.Capture
写真、オーディオ録音、ビデオなどのメディアを作成したり、連携させたりするクラスの含まれる、Windows.Media.MediaProperties名前空間をインポートします。
Imports Windows.Media.MediaProperties
ファイル、フォルダおよびアプリケーションの設定を管理するクラスの含まれる、Windows.Storage名前空間をインポートします。
Imports Windows.Storage
シーケンシャルアクセスストリームおよびランダムアクセスストリームに対する読み取りと書き込みをサポートするクラスの含まれる、Windows.Storage.Streams名前空間をインポートします。
Imports Windows.Storage.Streams Imports System.IO
コンテキストメニューおよびメッセージダイアログのサポートを提供するクラスの含まれる、Windows.UI.Popups名前空間をインポートします。
Imports Windows.UI.Popups Public NotInheritable Class MainPage Inherits Page
フォト、オーディオ録音およびビデオをキャプチャするクラスである、MediaCaptureクラス型のメンバ変数myMediaCaptureを宣言します。
Dim myMediaCapture As MediaCapture
MediaCaptureオブジェクトの初期化設定を含むクラスである、MediaCaptureInitializationSettingsクラス型のメンバ変数myCaptureInitSettingを宣言します。
Dim myCaptureInitSetting As MediaCaptureInitializationSettings
オーディオまたはビデオファイルのためのエンコードのプロファイルについて説明するクラスである、MediaEncodingProfileクラス型のメンバ変数myProfileを宣言します。
Dim myProfile As MediaEncodingProfile
インデックスによってアクセスできる要素の読み取り専用コレクションを表す、IStorageFile型を含むIReadOnlyListインターフェース型のメンバ変数myMP4FileListを宣言します。
Dim myMP4FileList As IReadOnlyList(Of IStorageFile)
[中止]ボタンが押されたかどうかを判定するBoolean型のメンバ変数flagを宣言し、Falseで初期化しておきます。
Dim flag As Boolean = False Dim myFileName As String
ページがアクティブになった時の処理
文字列型の新しいリストであるfileListオブジェクトを作成します。
ビデオライブラリにアクセスします。
CreateFolderAsyncメソッドでビデオライブラリ内にSoundFileというサブフォルダを作成します。
CreationCollisionOption.OpenIfExistsと指定すると、同名フォルダがある場合は、そのフォルダ名を返し、ない場合は新規に作成します。
GetFilesAsyncメソッドでSoundFileフォルダ内にあるファイルを取得して、コレクションメンバ変数myMP4FileListに格納します。
Countプロパティでファイルの個数を取得し、ファイルが存在する場合は以下の処理を行います。
ファイル名を格納しているmyMP4FileListコレクション内を変数myFileで反復処理しながら、fileListオブジェクトに、Addメソッドでパス名と拡張子を除いたファイル名に再度”.mp4”という拡張子を付けて、追加していきます。
Path.GetFileNameWithoutExtensionメソッドは指定したパス文字列のファイル名を、拡張子を付けずに返します。myFile.Pathでは絶対パスが付いたファイル名を取得してしまいますので、Path.GetFileNameWithoutExtensionメソッドでパスと拡張子を除いたファイル名を取得して、再度新たに".mp4”という拡張子を連結しています。
fileNameListBoxのItemsSourceプロパティにfileListオブジェクトを追加します。これで、SoundFileというフォルダ内にファイルが存在する場合は、ファイルの一覧を表示します。
MediaCaptureクラスの新しいインスタンスmyMediaCaptureオブジェクトを作成します。
MediaCaptureの初期化設定を含む、新しいMediaCaptureInitializationSettingsクラスのインスタンス、myCaptureInitSettingオブジェクトを作成します。
マイクのDeviceInformation.Idを取得するAudioDeviceIdをString.Emptyで初期化しておきます。
ストリーミングモードを取得するStreamingCaptureModeプロパティに、Audioを指定します。
myCaptureInitSettingでMediaCaptureオブジェクトを初期化します。
オーディオまたはビデオファイルのためのエンコードのプロファイルを指定するMediaEncodingProfileクラスのmyProfileに、ビデオエンコードの形式をAudioとして、CreateMp4メソッドでエンコーディングプロファイルを作成して指定します。
マイクが機能していない場合は例外が発生しますので、その時はメッセージを表示し、ComboBoxを使用不可とします。
非同期処理で行われるためメソッドの先頭にAsyncを追加します。
Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) Dim fileList As New List(Of String) Dim myFolder = KnownFolders.VideosLibrary Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists) myMP4FileList = Await mySubFolder.GetFilesAsync If myMP4FileList.Count > 0 Then For Each myFile In myMP4FileList fileList.Add(Path.GetFileNameWithoutExtension(myFile.Path) & ".mp4") Next fileNameListBox.ItemsSource = fileList End If myMediaCapture = New MediaCapture myCaptureInitSetting = New MediaCaptureInitializationSettings myCaptureInitSetting.AudioDeviceId = String.Empty myCaptureInitSetting.StreamingCaptureMode = StreamingCaptureMode.Audio Try Await myMediaCapture.InitializeAsync(myCaptureInitSetting) myProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto) Catch messageTextBlock.Text = "マイクが機能していません。" ComboBox1.IsEnabled = False Exit Sub End Try End Sub
ComboBoxから秒数が選択された時の処理
CountdownControlを表示状態にします。ComboBoxから選択された値を変数Indexに格納します。
変数Indexの値を数値に変換して変数myIndexに格納します。
CountdownControlのSecondsプロパティにmyIndexの値を指定します。
メンバ変数myFileNameに現在の年月日時分秒.mp4ファイルを作成して格納します。
ビデオライブラリにアクセスし、CreateFolderAsyncメソッドで、SoundFileサブフォルダを作成します。
CreationCollisionOption.OpenIfExistsを指定すると、同名フォルダが存在する場合は、そのフォルダ名を返し、ない場合は新規に作成します。
CreateFileAsyncメソッドでSoundFileサブフォルダ内にメンバ変数myFileNameが格納しているファイルを作成し、変数newFileで参照します。
ファイルを表すStorageFileクラスのmyStorageFile変数にmyFile変数の値を指定します。
MediaCaptureのStartRecordToStorageFileAsyncメソッドで、ストレージファイルへの非同期的な記録を開始します。書式は下記の通りです。
MediaCapture.StartRecordToStorageFileAsync(MediaEncodingProFile,IstorageFile)
[中止]ボタンを使用可能にします。
非同期処理で行われるため、メソッドの先頭にAsyncを追加します。
Private Async Sub ComboBox1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboBox1.SelectionChanged Try CountdownControl1.Visibility = Windows.UI.Xaml.Visibility.Visible Dim Index = DirectCast(ComboBox1.SelectedItem, ComboBoxItem) Dim myIndex As Integer = CInt(Index.Content) CountdownControl1.Seconds = myIndex myFileName = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒") & ".mp4" Dim myFolder = KnownFolders.VideosLibrary Dim mySubFolder = Await myFolder.CreateFolderAsync("SoundFile", CreationCollisionOption.OpenIfExists) Dim newFile = Await mySubFolder.CreateFileAsync(myFileName, CreationCollisionOption.OpenIfExists) Dim myStorageFile As StorageFile = newFile Dim result = myMediaCapture.StartRecordToStorageFileAsync(myProfile, myStorageFile) stopButton.IsEnabled = True messageTextBlock.Text = String.Empty Catch Exit Sub End Try End Sub
音声を録音してライブラリに保存するプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 指定した秒数で音声を録音して、その音声を再生するサンプルアプリ
- Webカメラで撮影した写真をセピア調に演出するアプリを作る
- 時刻とともに、その日の出来事をキャラクターが音声で教えてくれるアプリを作る
- お気に入りの写真に登場する、仲良しクラウディアちゃん
- ピクチャライブラリ内の画像を指定して表示する+1つのサンプル
- 場所と写真を記録するプログラムを作って思い出のシーンを保存しよう
- 画像に各種フィルタを適用して保存するWindowsアプリを作る
- 撮影した写真の管理ができるマイフォトアプリを作る
- CountDownControlを使ってカウントダウン後にカメラのシャッターを切る
- Webカメラを使ったアプリを作ろう