ビデオライブラリへのアクセス許可
ビデオライブラリへのアクセス許可
ソリューションエクスプローラー内の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
- この記事のキーワード