4
 private void receiveAudio(object sender)
        {
            IPEndPoint senderEP = new IPEndPoint(IPAddress.Any, 0);
            MemoryStream audioDataStream;
            BufferedWaveProvider bufferedWaveProvider; 
            //RawSourceWaveStream receivedRawAudioData;          
            byte[] receivedAudioData;
            waveOutStream = new WaveOut();

            while (IsAudioTransferActive)
            {
                receivedAudioData = audioUDPClient.Receive(ref senderEP);               
                audioDataStream = new MemoryStream(receivedAudioData);                
                //receivedRawAudioData = new RawSourceWaveStream(audioDataStream, audioFormat);
                bufferedWaveProvider = new BufferedWaveProvider(audioFormat);
//How can I feed "audioDataStream " to "bufferedWaveProvider "
                waveOutStream.Init(bufferedWaveProvider);
                waveOutStream.Play();
            } 
            waveOutStream.Stop();
            waveOutStream.Dispose();
        }

@Mark Heath :- u が言ったように、BufferedWaveProvider を使用してみましたが、どのように bufferedWaveProvider に「audioDataStream」を供給することができますか?

4

2 に答える 2

3

while ループ内で常に破棄されない WaveOut オブジェクトを作成していますが、これは問題の一部です。この状況での最善のアプローチは、単一の WaveOut オブジェクトを作成し、BufferedWaveProvider を使用してフィードすることです。次に、オーディオが利用可能になったら、それを BufferedWaveProvider に書き込みます。

于 2012-06-21T09:19:33.013 に答える
0

WaveOutSineWaveProviders で新しいオブジェクトを初期化するときに、同様の問題に直面していました。リングリストのようなものを使用して、異なるプロバイダーの値 (周波数と振幅) を交換するというアイデアに出会いました。少なくとも私の場合、5 つの一定の正弦波を超えると違いが聞こえなかったからです。WaveOutさらに、さまざまなマシンでの私のテストでは、一度に6 ~ 7 個を超えるオブジェクトを使用すると、通常はMemoryAllocationErrors となり、リングリストが生成されました。これは、私が出したものです:

private Queue<SineWaveGenerator> generators;

// constructor
public Player()
{
    for (int i = 0; i < 5; i++)
    {
        var generator = new SineWaveGenerator();
        generator.Amplitude = 0.25f;

        generators.Enqueue(generator);
    }
}

// just a helper method
private SineWaveGenerator GetGenerator(int frequency)
{
    return generators.FirstOrDefault(x => x.Frequency == frequency);
}

private void Play(int frequency)
{
    var generator = GetGenerator(frequency);

    if (generator == null)
    {
        generator = generators.Dequeue(); // get generator from the top of the list
        generator.Frequency = GetFrequency(key); // modify the generator
        generators.Enqueue(generator); // and append it to the back
    }

    generator.Play();
}

private void Stop(int frequency)
{
    var generator = GetGenerator(frequency);

    if (generator != null)
    {
        generator.Stop();
    }
}

注: はSineWaveGeneratorコンストラクタで newWaveOutを初期化します。

于 2016-01-29T20:48:16.827 に答える