UWP MediaCapture - запись звука WAV с частотой дискретизации 16000, 16 бит, моно - PullRequest
1 голос
/ 25 апреля 2020

Я хочу включить аудиозапись в свое приложение UWP. Запись должна быть сохранена в файл WAV и должен иметь частоту дискретизации свойств 16000, 16 бит, моно (требуется для задач распознавания речи). Поскольку библиотеки, такие как CSCore и NAudio, похоже, не работают для приложений UWP, я попытался использовать MediaCapture API.

Вот мой код:

MediaCapture mediaCapture = new MediaCapture();

var settings = new MediaCaptureInitializationSettings
{
  AudioDeviceId = device.Id,
  StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Audio,
};
await mediaCapture.InitializeAsync(settings);

var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFile file = await localFolder.CreateFileAsync("audio.wav", CreationCollisionOption.GenerateUniqueName);
await mediaCapture.StartRecordToStorageFileAsync(MediaEncodingProfile.CreateWav(AudioEncodingQuality.Auto), file);

Я пытался использовать следующий код для установите AudioEncodingProperties, но он всегда выдает ошибку:

var controller = mediaCapture.AudioDeviceController;
var properties = controller.GetMediaStreamProperties(MediaStreamType.Audio) as AudioEncodingProperties;
properties.SampleRate = 16000;
properties.BitsPerSample = 16;
properties.ChannelCount = 1;

// the following line fails with System.Exception "The request is invalid in the current state."
await controller.SetMediaStreamPropertiesAsync(MediaStreamType.Audio, properties);

Любая помощь очень ценится!

1 Ответ

1 голос
/ 26 апреля 2020

Попробуйте настроить MediaEncodingProfile.Audio следующим образом.

var profile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.Auto);
profile.Audio = AudioEncodingProperties.CreatePcm(16000, 1, 16);

await mediaCapture.StartRecordToStorageFileAsync(profile, file);

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

var controller = mediaCapture.AudioDeviceController;
var encoding_properties_supported = controller.GetAvailableMediaStreamProperties(MediaStreamType.Audio).ToArray();
...