UWP: захват аудио мультимедиа в фоновой задаче

Я новичок в UWP. Я пытаюсь записать звук из фонового потока через MediaCapture API.

Мой код здесь:

public sealed class Recorder : IBackgroundTask
    {
        private BackgroundTaskDeferral _deferral;
        private readonly MediaCapture mediaCapture = new MediaCapture();

        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            _deferral = taskInstance.GetDeferral();

            MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings()
            {
                StreamingCaptureMode = StreamingCaptureMode.Audio,
            };
            await mediaCapture.InitializeAsync(settings);

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

            await StartRecordAsync(profile);

            _deferral.Complete();
        }

        private async Task StartRecordAsync(MediaEncodingProfile profile)
        {
            while(true)
            {
                StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
                StorageFile storageFile = await storageFolder.CreateFileAsync(Guid.NewGuid() + ".wav", CreationCollisionOption.ReplaceExisting);

                await mediaCapture.StartRecordToStorageFileAsync(profile, storageFile);

                Task.Delay(10000).Wait();

                await mediaCapture.StopRecordAsync();
            }
        }
    }

Он записывает файлы .wav по 10 секунд, но когда я проигрываю эти файлы, я ничего не слышу. Каждый файл имеет размер 310 КБ+, поэтому он не равен 0 байтам. Кто-нибудь знает, почему это произошло?


person Rougher    schedule 20.08.2020    source источник


Ответы (1)


Он записывает файлы .wav по 10 секунд, но когда я проигрываю эти файлы, я ничего не слышу. Каждый файл имеет размер 310 КБ+, поэтому он не равен 0 байтам. Кто-нибудь знает, почему это произойдет?

Боюсь, вы не можете записывать звук в BackgroundTask. Взять из официального документа.

InitializeAsync следует вызывать из основного потока пользовательского интерфейса вашего приложения. Приложения должны справляться с приостановкой или завершением работы приложения путем правильной очистки ресурсов захвата мультимедиа. Для получения информации о правильном завершении работы объекта MediaCapture

person Nico Zhu - MSFT    schedule 20.08.2020
comment
Спасибо за ответ. Может быть, вы знаете, что AudioGraph.CreateAsync также следует вызывать из основного пользовательского интерфейса? - person Rougher; 20.08.2020
comment
В документе это не декларируется, вы можете попробовать использовать AudioGraph в un-uthread. - person Nico Zhu - MSFT; 20.08.2020
comment
Уже пробовал, но зависает в AudioGraph.CreateAsync... - person Rougher; 20.08.2020
comment
Может быть, вы знаете какой-нибудь API, который работает в фоновом режиме и записывает звук? - person Rougher; 21.08.2020