酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windowsストアアプリでマイクを使って録音をおこなう

なんか文章が適当なので後でなおします。

Windows ストア アプリで録音する方法はとっても簡単なんですよ。録音を管理するクラスを作ります。

適当にRecordAudioと名付けました。音を記録してくれる感じのクラス名です。

マイクの権限を有効にしておいてください。容赦なく例外が出るんで注意です。

using System;
using System.Threading.Tasks;
using Windows.Media.Capture;
using Windows.Media.MediaProperties;
using Windows.Storage;

namespace MicrophoneSample
{
    /// <summary>
    /// 録音をおこなうクラス
    /// </summary>
    public class RecordAudio
    {
        MediaCapture mediaCapture = null;

        public async Task InitializeAsync()
        {
            // 録音をおこなうためのオブジェクトを生成する
            mediaCapture = new MediaCapture();

            // 録音用の初期化を開始する
            var settings = new MediaCaptureInitializationSettings();
            settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
            await mediaCapture.InitializeAsync(settings);
        }

        public async Task StartRecordAsync()
        {
            var fileName = "foo.m4a"; // 保存するファイル名

            // 録音したファイルはローカルフォルダへ保存する
            var local =  ApplicationData.Current.LocalFolder;

            // 録音したデータを書き込むファイルを作成する
            var file = await local.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
            
            // AACフォーマットで録音を開始する
            var profile = MediaEncodingProfile.CreateM4a(AudioEncodingQuality.High);
            await mediaCapture.StartRecordToStorageFileAsync(profile, file);
        }

        public async Task StopRecordAsync()
        {
            // 録音を終了します
            await mediaCapture.StopRecordAsync();
        }
    }
}

画面にはボタンを1つだけ配置して、1回目にボタンを押されたら録音の開始、もう一度押されたら録音の終了をおこなうようにします。(そもそもWindowsストアアプリでボタンを多用するのもどうかと思うんだけど、)分かりやすいようにボタンの表示を「録音 開始」と「録音 終了」と切り替えるようにしました。わかりやすいですね。

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace MicrophoneSample
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }


        RecordAudio recordAudio = null;
        bool recording = false;

        protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            // 初期化する
            recordAudio = new RecordAudio();
            await recordAudio.InitializeAsync();
        }

        private async void btnRecording_Click(object sender, RoutedEventArgs e)
        {
            if (!recording)
            {
                await recordAudio.StartRecordAsync();
                recording = true;
                btnRecording.Content = "録音 終了";
            }
            else
            {
                await recordAudio.StopRecordAsync();
                recording = false;
                btnRecording.Content = "録音 開始";
            }
        }
    }
}