Записанный звук не воспроизводится в xamarin - PullRequest
0 голосов
/ 02 февраля 2020

Я хочу записать аудио, используя формы 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, и я не знаю, как разбираться с пакетами.

1 Ответ

0 голосов
/ 07 февраля 2020

Исходя из моего теста, нет необходимости сохранять. Аудио будет сохранено по умолчанию. Когда вы играете, вы можете сначала получить путь, а затем воспроизвести его.

Получить путь:

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

Внесены некоторые изменения с кодом события Reproduzir_Clicked. Приведенный мною код сохраняет записанный звук под моим собственным именем sample.wav. И я играю в нее, чтобы проверить, существует она или нет. Это хорошо работает.

ОБНОВЛЕНО:

Создайте новую страницу Page1, передайте имя файла из MainPage в Page1. Код все еще основан на Audio-Recorder на GitHub.

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

Это хорошо работает на моей стороне, попробуйте.

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