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

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

ビデオライブラリへのアクセス許可

ソリューションエクスプローラー内の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
  • 音声を録音してライブラリに保存するプログラム

薬師寺国安事務所

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

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