Xamarin:播放一分钟的声音

本文关键字:声音 一分钟 播放 Xamarin | 更新日期: 2023-09-27 18:17:38

我正在尝试播放一分钟的声音。我可以这么做,但我的做法是先生成声音缓冲,然后再播放,这花费了太多时间,有很大的延迟。所以现在我试图在播放时生成声音缓冲。所以不会有延误。它播放了大约4秒,然后停止,但我不能再点击我的按钮像一分钟,所以我认为代码仍在运行,即使我听不到任何东西。

下面是我的代码:
public void play()
    {   
        short[] buffer = new short[44100];
        track = new AudioTrack (Stream.Music, 44100, ChannelOut.Mono, Encoding.Pcm16bit, 5292000, AudioTrackMode.Static);
        track.SetPlaybackRate (44100);
        while (n2 < 5292000) {
            for (int n = 0; n < 44100; n++) {
                float temp1 = (float)( Amplitude * Math.Sin ((2 * Math.PI * Frequency * n2) / 44100D));
                byte[] bytes = BitConverter.GetBytes (temp1);
                buffer [n] = (short)(temp1 * short.MaxValue);
                n2++;
            }
            int buffer_number = track.Write (buffer, 0, buffer.Length);
            track.Play();
        }
        track.Release();
    }

我尝试使用AudioTrackMode流但当程序进入轨道时。Play抛出一个运行时错误:在未初始化的AudioTrack上调用play()。

我做错了什么?

Xamarin:播放一分钟的声音

以下是我如何在c#中基于android示例使其工作的精简版本:

http://marblemice.blogspot.fr/2010/04/generate-and-play-tone-in-android.html

public void playSound()
        {   
            var duration = 1;
            var sampleRate = 8000;
            var numSamples = duration * sampleRate;
            var sample = new double[numSamples];
            var freqOfTone = 1900;
            byte[] generatedSnd = new byte[2 * numSamples];
            for (int i = 0; i < numSamples; ++i) {
                sample[i] = Math.Sin(2 * Math.PI * i / (sampleRate/freqOfTone));
            }
            int idx = 0;
            foreach (double dVal in sample) {
                short val = (short) (dVal * 32767);
                generatedSnd[idx++] = (byte) (val & 0x00ff);
                generatedSnd[idx++] = (byte) ((val & 0xff00) >> 8);
            }
            var track = new AudioTrack (global::Android.Media.Stream.Music, sampleRate, ChannelOut.Mono, Encoding.Pcm16bit, numSamples, AudioTrackMode.Static);
            track.Write(generatedSnd, 0, numSamples);
            track.Play ();
        }

根据您的需要调整duration和' freqOfTone ' '。