Raspberry Pi в качестве звукозаписывающего устройства Win 10 iot - PullRequest
0 голосов
/ 31 октября 2018

устройство: Raspberry PI 3 ОС: WIN 10 IOT Язык программирования: C #

Я пытаюсь запрограммировать рекордер 24/7, который позже будет записывать все, как только включится Raspberry. Продолжительность аудио файла должна быть 30 минут спустя. Затем файлы будут храниться на USB-флешке в папках по году, месяцу, дню. Создание папки на USB-флешке уже работает.

Проблема в том, что файл создан, но не имеет содержимого. Размер файла составляет 0 КБ. Вот код.

Спасибо за помощь.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Devices.Enumeration;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Media.Capture;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using Windows.Media.MediaProperties;
using Windows.Media.Playback;
using Windows.Storage;
using Windows.Storage.Streams;

namespace Recording_PI
{
    /// <summary>
    /// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        bool isRecording;
        LowLagMediaRecording audioRecording;
        MediaCapture audioCapture = new MediaCapture();

        public MainPage()
        {
            this.InitializeComponent();

            Checked();
            Task.Delay(10000).Wait();    
            Unchecked();


        }

        private async void Checked()
        {
            var settings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
            settings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Audio;
            settings.MediaCategory = Windows.Media.Capture.MediaCategory.Other;
            settings.AudioProcessing = Windows.Media.AudioProcessing.Default;
            await audioCapture.InitializeAsync(settings);

            StorageFolder externalDevices = KnownFolders.RemovableDevices;
            IReadOnlyList<StorageFolder> externalDrives = await externalDevices.GetFoldersAsync();
            StorageFolder usbStorage = externalDrives[0];

            //ENSURE FOLDER EXISTS
            if (await usbStorage.TryGetItemAsync("Recording") == null)
                await usbStorage.CreateFolderAsync("Recording");

            string Folder_Pfad = "Recording\\" + DateTime.Now.Year.ToString();
            if (await usbStorage.TryGetItemAsync(Folder_Pfad) == null)
                await usbStorage.CreateFolderAsync(Folder_Pfad);

            Folder_Pfad = Folder_Pfad + "\\" + DateTime.Now.Month.ToString();
            if (await usbStorage.TryGetItemAsync(Folder_Pfad) == null)
                await usbStorage.CreateFolderAsync(Folder_Pfad);

            Folder_Pfad = Folder_Pfad + "\\" + DateTime.Now.Day.ToString();
            if (await usbStorage.TryGetItemAsync(Folder_Pfad) == null)
                await usbStorage.CreateFolderAsync(Folder_Pfad);

            string Dateiname = "\\" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + " "
                 + DateTime.Now.Hour.ToString() + "_" + DateTime.Now.Minute.ToString() + "_" + DateTime.Now.Second.ToString()+ ".mp3";

            string Dateispeicher_Ort = Folder_Pfad + Dateiname;

            StorageFile recordFile = await usbStorage.CreateFileAsync(Dateispeicher_Ort, Windows.Storage.CreationCollisionOption.GenerateUniqueName);

            await audioCapture.StartRecordToStorageFileAsync(MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Medium), recordFile);

        }


        private async void Unchecked()
        {
            if (isRecording)
            {
                await audioCapture.StopRecordAsync();
            }

        }

    }
}

1 Ответ

0 голосов
/ 01 ноября 2018

Проблема в том, что файл создан, но не имеет содержимого. размер файла 0 КБ.

Это из-за того, что ваш код получает исключение в строке ниже при запуске на Raspberry Pi с Windows IoT Core, поэтому файл не был записан для содержимого. Если вы отладите приложение, вы будете прерваны из-за этого исключения.

await audioCapture.StartRecordToStorageFileAsync(MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Auto), recordFile);

Вам нужно использовать следующие строки вместо вышеуказанной строки:

            var audioRecording = await audioCapture.PrepareLowLagRecordToStorageFileAsync(MediaEncodingProfile.CreateM4a(AudioEncodingQuality.Auto), recordFile);
            await audioRecording.StartAsync();

Ссылка: " MediaCapture.PrepareLowLagRecordToStorageFileAsync "

И в вашем коде есть другие проблемы.

  1. isRecording переменная никогда не инициируется и не присваивает какое-либо значение, поэтому она всегда false Таким образом, эта строка никогда не может быть выполнена: await audioCapture.StopRecordAsync();
  2. Unchecked() может быть выполнен до завершения функции Checked(), поскольку в методе Checked() вы используете await, поэтому код будет продолжен, затем Task.Delay(10000).Wait(); и Unchecked();. В этом случае звук будет остановлен перед запуском.

Другим предложением является добавление try-catch в ваш код, чтобы вы могли обрабатывать исключения до завершения работы приложения.

Исходя из всего вышесказанного, я внес некоторые изменения в ваш код. Ниже приведен полный код, который вы можете попробовать, если он поможет.

MainPage.xaml:

<Page
    x:Class="Recording_PI.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Recording_PI"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <StackPanel VerticalAlignment="Center">
        <TextBlock Name="Result" Text="" />
    </StackPanel>
</Page>

MainPage.xaml.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Devices.Enumeration;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Media.Capture;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using Windows.Media.MediaProperties;
using Windows.Media.Playback;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.ApplicationModel.Core;
using Windows.UI.Core;

namespace Recording_PI
{
    /// <summary>
    /// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        bool isRecording;
        LowLagMediaRecording audioRecording;
        MediaCapture audioCapture = new MediaCapture();

        public MainPage()
        {
            this.InitializeComponent();

            Checked();


        }

        private async void Checked()
        {
            try
            {
                var settings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
                settings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Audio;
                settings.MediaCategory = Windows.Media.Capture.MediaCategory.Other;
                settings.AudioProcessing = Windows.Media.AudioProcessing.Default;
                await audioCapture.InitializeAsync(settings);

                StorageFolder externalDevices = KnownFolders.RemovableDevices;
                IReadOnlyList<StorageFolder> externalDrives = await externalDevices.GetFoldersAsync();
                StorageFolder usbStorage = externalDrives[0];

                //ENSURE FOLDER EXISTS
                if (await usbStorage.TryGetItemAsync("Recording") == null)
                    await usbStorage.CreateFolderAsync("Recording");

                string Folder_Pfad = "Recording\\" + DateTime.Now.Year.ToString();
                if (await usbStorage.TryGetItemAsync(Folder_Pfad) == null)
                    await usbStorage.CreateFolderAsync(Folder_Pfad);

                Folder_Pfad = Folder_Pfad + "\\" + DateTime.Now.Month.ToString();
                if (await usbStorage.TryGetItemAsync(Folder_Pfad) == null)
                    await usbStorage.CreateFolderAsync(Folder_Pfad);

                Folder_Pfad = Folder_Pfad + "\\" + DateTime.Now.Day.ToString();
                if (await usbStorage.TryGetItemAsync(Folder_Pfad) == null)
                    await usbStorage.CreateFolderAsync(Folder_Pfad);

                string Dateiname = "\\" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + " "
                     + DateTime.Now.Hour.ToString() + "_" + DateTime.Now.Minute.ToString() + "_" + DateTime.Now.Second.ToString() + ".mp3";

                string Dateispeicher_Ort = Folder_Pfad + Dateiname;

                StorageFile recordFile = await usbStorage.CreateFileAsync(Dateispeicher_Ort, Windows.Storage.CreationCollisionOption.GenerateUniqueName);

                isRecording = true;
                //await audioCapture.StartRecordToStorageFileAsync(MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Auto), recordFile);

                var audioRecording = await audioCapture.PrepareLowLagRecordToStorageFileAsync(MediaEncodingProfile.CreateM4a(AudioEncodingQuality.Medium), recordFile);
                await audioRecording.StartAsync();

                Task.Delay(10000).Wait();
                Unchecked();
            }
            catch (Exception ex)
            {
                await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, ()=> {
                    Result.Text += ex.Message;
                });

            }

        }


        private async void Unchecked()
        {
            if (isRecording)
            {
                await audioCapture.StopRecordAsync();
            }

        }

    }
}

Возможности в package.appxmanifest:

  <Capabilities>
    <uap:Capability Name="removableStorage" />
    <DeviceCapability Name="microphone" />
  </Capabilities>
...