【问题标题】:Recorded audio is not playing in xamarin录制的音频未在 xamarin 中播放
【发布时间】:2020-05-18 08:20:41
【问题描述】:

我想使用 xamarin 表单录制音频:

我的 xaml 中有这段代码:


   <StackLayout  Spacing="15">
        <StackLayout Orientation="Horizontal">
            <Switch x:Name="TimeoutSwitch" 
                    IsToggled="True" />
            <Label Text="Stop after silence?"/>
        </StackLayout>

        <Button x:Name="RecordButton" 
                Text="Record" 
                Clicked="Record_Clicked"/>

        <Button x:Name="ReproduceButton" 
                Text="Play"  
                Clicked="Reproduce_Clicked" 
                IsEnabled="False"/>
    </StackLayout>

这是我的代码:


    public partial class MainPage : ContentPage
    {
        AudioRecorderService recorder;
        AudioPlayer player;

        public MainPage()
        {
            InitializeComponent();

            var mainDir = FileSystem.AppDataDirectory;

            recorder = new AudioRecorderService
            {
                StopRecordingAfterTimeout = true,
                TotalAudioTimeout = TimeSpan.FromSeconds(15),
                AudioSilenceTimeout = TimeSpan.FromSeconds(2)
            };

            player = new AudioPlayer();
            player.FinishedPlaying += Finalize_Reproduction;
        }

        public async void Record_Clicked(object sender, EventArgs e)
        {
            try
            {
                if (!recorder.IsRecording)
                {
                    recorder.StopRecordingOnSilence = TimeoutSwitch.IsToggled;

                    RecordButton.IsEnabled = false;
                    ReproduceButton.IsEnabled = false;

                    // Start recording
                    var audioRecordTask = await recorder.StartRecording();

                    RecordButton.Text = "Stop Recording";
                    RecordButton.IsEnabled = true;

                    await audioRecordTask;

                    RecordButton.Text = "Record";
                    ReproduceButton.IsEnabled = true;
                }
                else
                {
                    RecordButton.IsEnabled = false;

                    // stop recording ...
                    await recorder.StopRecording();
                    RecordButton.IsEnabled = true;
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("Error", ex.Message, "OK");
            }
        }

        public async void Reproduce_Clicked(object sender, EventArgs e)
        {
            try
            {
                var filePath = recorder.GetAudioFilePath();

                if (filePath != null)
                {
                    ReproduceButton.IsEnabled = false;
                    RecordButton.IsEnabled = false;

                    player.Play(filePath);
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("Error", ex.Message, "OK");
            }
        }


        public void Finalize_Reproduction(object sender, EventArgs e)
        {
            ReproduceButton.IsEnabled = true;
            RecordButton.IsEnabled = true;
        }
    }

我一直在关注这个教程:https://julianocustodio.com/2019/04/26/gravar-audio/

当我运行它时,它没有录制和播放音频,我在这里做错了吗? 我是 Xamarin 的新手,我不知道如何处理包。

【问题讨论】:

  • 你在哪个平台上尝试这个?
  • 我用的是安卓
  • 从 GitHub 下载源文件。 github.com/juucustodio/Audio-Recorder-Xamarin.Forms我测试代码。它运作良好。请检查您的许可。您是否在运行时允许了该权限?
  • WOW @WendyZang-MSFT 当我在手机中使用它时,它可以工作,我只使用我的模拟器,无法弄清楚出了什么问题。
  • @WendyZang-MSFT 我怎样才能将它保存到数据库并稍后播放呢?

标签: xamarin xamarin.forms


【解决方案1】:

根据我的测试,不需要保存。默认情况下会保存音频。 玩的时候可以先得到路径再玩。

获取路径:

var filePath = gravador.GetAudioFilePath();

播放:

reprodutor.Play(filePath);

地点:

/data/user/0/br.com.julianocustodo.audiodemo/cache/ARS_recording.wav

如果您想自己保存,可以使用GetAudioFileStream 获取流,然后将其保存到您自己的数据库中,或者只是获取路径然后播放。

更新:

 var stream = gravador.GetAudioFileStream();

        string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sample.wav");

        using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            stream.CopyTo(fileStream);
        }
        reprodutor.Play(fileName);

我对@9​​87654327@ 事件的代码做了一些更改。我提供的代码用我自己的名字sample.wav 保存录制的音频。我玩它来检查它是否存在。效果很好。

更新:

创建一个新页面Page1,将文件名从 MainPage 传递到 Page1。代码仍然基于 GitHub 上的Audio-Recorder

Audio-Recorder:https://github.com/juucustodio/Audio-Recorder-Xamarin.Forms

MainPage.xaml

  <StackLayout  Spacing="15">
        <StackLayout Orientation="Horizontal">
            <Switch x:Name="TimeoutSwitch" IsToggled="True" />
            <Label Text="Parar após silêncio?" />
        </StackLayout>
        <Button x:Name="GravarButton" Text="Gravar" HorizontalOptions="FillAndExpand" Clicked="Gravar_Clicked" />
        <Button x:Name="ReproduzirButton" Text="Reproduzir"  HorizontalOptions="FillAndExpand" Clicked="Reproduzir_Clicked" IsEnabled="False" />
    <Button x:Name="btnGoToPage1" Text="GoToPage1" Clicked="btnGoToPage1_Clicked"></Button>
 </StackLayout>

MainPage.xaml.cs

 public partial class MainPage : ContentPage
{
    AudioRecorderService gravador;
    AudioPlayer reprodutor;
    public string fileName { get; set; }

    public MainPage()
    {
        InitializeComponent();
        fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sample.wav");
        gravador = new AudioRecorderService
        {
            StopRecordingAfterTimeout = true,
            TotalAudioTimeout = TimeSpan.FromSeconds(15),
            AudioSilenceTimeout = TimeSpan.FromSeconds(2)
        };

        reprodutor = new AudioPlayer();
        reprodutor.FinishedPlaying += Finaliza_Reproducao;
    }

    async void Gravar_Clicked(object sender, EventArgs e)
    {
        try
        {
            if (!gravador.IsRecording)
            {
                gravador.StopRecordingOnSilence = TimeoutSwitch.IsToggled;

                GravarButton.IsEnabled = false;
                ReproduzirButton.IsEnabled = false;

                //Começa gravação
                var audioRecordTask = await gravador.StartRecording();

                GravarButton.Text = "Parar Gravação";
                GravarButton.IsEnabled = true;

                await audioRecordTask;

                GravarButton.Text = "Gravar";
                ReproduzirButton.IsEnabled = true;
            }
            else
            {
                GravarButton.IsEnabled = false;

                //parar a gravação...
                await gravador.StopRecording();

                GravarButton.IsEnabled = true;
            }
        }
        catch (Exception ex)
        {
            //blow up the app!
            await DisplayAlert("Erro", ex.Message, "OK");
        }
    }

    async void Reproduzir_Clicked(object sender, EventArgs e)
    {
        //try
        //{
        //    var filePath = gravador.GetAudioFilePath();

        //    if (filePath != null)
        //    {
        //        ReproduzirButton.IsEnabled = false;
        //        GravarButton.IsEnabled = false;

        //        reprodutor.Play(filePath);
        //    }
        //}
        //catch (Exception ex)
        //{
        //    //blow up the app!
        //    await DisplayAlert("Erro", ex.Message, "OK");
        //}

        var stream = gravador.GetAudioFileStream();



        using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            stream.CopyTo(fileStream);
        }
        reprodutor.Play(fileName);
    }


    void Finaliza_Reproducao(object sender, EventArgs e)
    {
        ReproduzirButton.IsEnabled = true;
        GravarButton.IsEnabled = true;
    }

    private void btnGoToPage1_Clicked(object sender, EventArgs e)
    {
        Navigation.PushAsync(new Page1());
    }

Page1.xaml

 <StackLayout>
        <Label Text="Welcome to Page1!"
            VerticalOptions="CenterAndExpand" 
            HorizontalOptions="CenterAndExpand" />
        <Button x:Name="btnPlay" Text="Play" Clicked="btnPlay_Clicked"></Button>
    </StackLayout>

Page1.xaml.cs

 public partial class Page1 : ContentPage
{
    public Page1()
    {
        InitializeComponent();
    }
    AudioPlayer reprodutor;
    private void btnPlay_Clicked(object sender, EventArgs e)
    {
        var fileName = new MainPage().fileName;
        reprodutor = new AudioPlayer();
        reprodutor.Play(fileName);
    }
}

对我来说效果很好,试试吧。

【讨论】:

  • 我要录制音频,然后,我将它保存到数据库中,然后我会播放它。这也令人困惑,因为我希望我录制的音频被标记。
  • 所有录制的音频文件扩展名都是.wav?
  • 是的,这是 Plugin.AudioRecorder 提供的默认方式。
  • 但是我可以重命名录制的音频吗?而不是 ARS_recording.wav 可能类似于 Textbox.text() +.wav?所以每次我保存音频时,它都会有一个唯一的名称
  • 您可以使用来自GetAudioFileStream 的流捕获以您自己的名字自己保存录制的音频。
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多