UWP Windows 10 IoT 2 канала одновременной записи звука - PullRequest
0 голосов
/ 21 мая 2018

Я хотел бы знать, как записывать 2 отдельных аудиоканала одновременно.У меня есть 2 USB-адаптера с микрофоном и динамиком соответственно. enter image description here Образцы кода, которые я могу найти, поддерживают только одноканальную запись одновременно.Пожалуйста помоги.Спасибо.

Для одного канала мой код следующим образом:

MediaCapture audioCapture = new MediaCapture();
MediaCaptureInitializationSettings captureInitSettings = new MediaCaptureInitializationSettings();

captureInitSettings.StreamingCaptureMode = StreamingCaptureMode.Audio;
captureInitSettings.MediaCategory = MediaCategory.Other;
captureInitSettings.AudioProcessing = AudioProcessing.Default;

await audioCapture.InitializeAsync(captureInitSettings);

private async void recordChannelA()
    {
        StorageFolder externalDevices = KnownFolders.RemovableDevices;
        IReadOnlyList<StorageFolder> externalDrives = await externalDevices.GetFoldersAsync();
        StorageFolder usbStorage = externalDrives[0];

        if (usbStorage != null)
        {
            StorageFolder recordFolder = await usbStorage.CreateFolderAsync(recFolderName, CreationCollisionOption.OpenIfExists);
            await usbStorage.GetFolderAsync(recFolderName);
            StorageFile recordFile = await recordFolder.CreateFileAsync("Recording - " + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".mp3", Windows.Storage.CreationCollisionOption.GenerateUniqueName);

            MediaEncodingProfile profile = null;
            profile = MediaEncodingProfile.CreateM4a(Windows.Media.MediaProperties.AudioEncodingQuality.Auto);
            await audioCapture.StartRecordToStorageFileAsync(profile, recordFile);

            Message.Text = "Recording ... ";

            recordingtimerRun = new TimeSpan(0, 0, 0);
            recordingTimer.Start();
        }
        else Message.Text = "Recording error !";
    }

Обновление;Я создал «просмотр списка» для перечисленных устройств и для выбора соответствующего устройства захвата.Однако существует синтаксическая ошибка, из-за которой я не могу преобразовать enumaration.deviceinformation в imediasource.

captureInitSettings.AudioSource = captureDeviceList[audioCaptureList.SelectedIndex];

Обновление: мне удалось заставить его работать. Решение:

    captureInitSettingsA.AudioDeviceId = captureDeviceList[audioCaptureList.SelectedIndex].Id;
captureInitSettingsB.AudioDeviceId = captureDeviceList[audioCaptureList.SelectedIndex].Id;

Тем не менее, как мне сохранить эти настройки в настройках приложения ... чтобы при перезагрузке мне не пришлось повторно выбирать заново.

Обновление: Мне удается сохранить настройки приложениядля устройств audiocapture & audiorender, но я не уверен, как их получить, а также проверить, сохранены ли предыдущие настройки.

Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
            Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

            localSettings.Values["audioACaptureSettings"] = captureAInitSettings.AudioDeviceId;
            localSettings.Values["audioARenderSettings"] = mediaPlayerA.AudioDevice.Id;
localSettings.Values["audioBCaptureSettings"] = captureBInitSettings.AudioDeviceId;
            localSettings.Values["audioBRenderSettings"] = mediaPlayerB.AudioDevice.Id;



private void loadAudioConfig()
    {
        Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
        Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

        if (localSettings.Values["audioACaptureSettings"] != null)
        {
            captureAInitSettings.AudioDeviceId = localSettings.Values["audioACaptureSettings"].ToString();
        }

        if (localSettings.Values["audioARenderSettings"] != null)
        {
            Object audioARenderValue = localSettings.Values["audioARenderSettings"];
            mediaPlayerA.AudioDevice = audioARenderValue;
        }

        if (localSettings.Values["PAaudioCaptureSettings"] != null)
        {
            captureBInitSettings.AudioDeviceId = localSettings.Values["audioBCaptureSettings"].ToString();
        }

        if (localSettings.Values["PAaudioRenderSettings"] != null)
        {
            Object audioBRenderValue = localSettings.Values["audioBRenderSettings"];
            mediaPlayerB.AudioDevice = audioBRenderValue;
        }

1 Ответ

0 голосов
/ 23 мая 2018

Вы можете обратиться к этому документу, в котором рассказывается, как сохранять и получать настройки и другие данные приложения .Вы можете сохранить данные в Настройки и Файлы.Когда вы используете настройки, он поддерживает только несколько типов данных, как указано в документе.Если вы используете файлы, вы можете хранить двоичные данные или включить собственные настраиваемые сериализованные типы.

В предоставленном коде правильно проверить, сохранены ли предыдущие настройки:

    if (localSettings.Values["audioACaptureSettings"] != null)
    {
        captureAInitSettings.AudioDeviceId = localSettings.Values["audioACaptureSettings"].ToString();
    }

Но неправильно извлекать параметр как AudioDevice, потому что он не может неявно преобразовать строку в DeviceInformation.Пожалуйста, попробуйте следующим образом:

    if (localSettings.Values["audioARenderSettings"] != null)
    {
        var aduioSource = localSettings.Values["audioARenderSettings"] as string;
        mediaPlayerA.AudioDevice = await DeviceInformation.CreateFromIdAsync(aduioSource);
    }
...