【问题标题】:Raspberry Pi as a Sound Recorder Win 10 iotRaspberry Pi 作为录音机 Win 10 iot
【发布时间】:2019-04-04 18:09:05
【问题描述】:

设备:树莓派 3 操作系统:WIN 10 物联网 编程语言:C#

我正在尝试编写一个 24/7 全天候记录器,它会在 Raspberry 打开后立即记录所有内容。 音频文件长度应在 30 分钟后。 然后这些文件将按年、月、日存储在文件夹中的 U 盘上。 U 盘上的文件夹创建已经生效。

我遇到的问题是文件已创建但没有内容。 该文件大小为 0kb。 这是代码。

感谢您的帮助。

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();
            }

        }

    }
}

【问题讨论】:

    标签: c# raspberry-pi3 windows-10-iot-core


    【解决方案1】:

    我遇到的问题是文件已创建但没有内容。这 文件大小为 0kb。

    这是因为您的代码在使用 Windows IoT Core 的 Raspberry Pi 上运行时在下一行出现异常,因此该文件尚未写入内容。如果您调试应用程序,您将因此异常而终止。

    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>
    

    【讨论】:

    • 感谢您的帮助。现在效果很好。我是编程新手,所以代码来自不同的来源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2023-04-06
    相关资源
    最近更新 更多