C# 从PC实时向Windows Phone传输音乐

C# 从PC实时向Windows Phone传输音乐,c#,wpf,windows,windows-phone-8,naudio,C#,Wpf,Windows,Windows Phone 8,Naudio,我正在尝试开发一个Windows应用程序(WPF),它可以通过TCP连接(本地WiFi)在系统上播放任何内容。在接收端,我有Windows Phone 8应用程序,可以实时播放音频 我所尝试的: 成功建立了连接和数据传输工程 void sMixListner_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e) { try { if (writer != null) {

我正在尝试开发一个Windows应用程序(WPF),它可以通过TCP连接(本地WiFi)在系统上播放任何内容。在接收端,我有Windows Phone 8应用程序,可以实时播放音频

我所尝试的:

  • 成功建立了连接和数据传输工程

     void sMixListner_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        try
        {
            if (writer != null)
            {
                SocketHandler.SocketManager.sendDataToClients(e.Buffer);
            }
        }
        catch { }
    } 
     public void sendDataToClients(byte[] music)
    {
        foreach (Socket client in clients)
        {
            try
            {
    
                client.Send(music);
    
            }
            catch { }
        }
    
    }
    
  • 上述代码传输从
    WasapiLoopbackCapture
    类接收的任何数据

  • 在电话端,我能够正确地接收所有字节[]数据,并将其写入内存流。 MemoryStream stream=新的MemoryStream(); public void ReceiveMessage() {

  • 在收到几秒钟后,我尝试将其回放为:

    public void play()
    {
    SoundEffect soundE = new SoundEffect(stream.ToArray(), 48000, AudioChannels.Mono);
    soundE.CreateInstance();
    FrameworkDispatcher.Update();
    isPlaying = true;
    soundE.Play();
    }
    
    我听到的只是噪音。我试着用以下方式将波头写入流中(来自诺基亚开发者网站):

    录音部分是正确的,因为如果我使用
    WavFileWriter
    编写.wav文件,播放时声音很好


    有人能帮我吗?我需要能够在我的手机上播放那个声音。

    WASAPI捕获是32位IEEE浮点,而不是32位PCM,所以WAV头中的音频格式是错误的。IEEE是浮点,但在你的情况下,我建议在通过网络发送音频之前转换为16位,以节省一点带宽。

    事实上lly,我以前从来没有处理过音频。你能给我一些链接来帮助我吗?我在我的(为无耻插头道歉)中详细介绍了这一点
    public void play()
    {
    SoundEffect soundE = new SoundEffect(stream.ToArray(), 48000, AudioChannels.Mono);
    soundE.CreateInstance();
    FrameworkDispatcher.Update();
    isPlaying = true;
    soundE.Play();
    }
    
    public void WriteWavHeader(Stream stream, int sampleRate)
        {
            const int bitsPerSample = 32;
            const int bytesPerSample = bitsPerSample / 8;
            var encoding = System.Text.Encoding.UTF8;
    
            // ChunkID Contains the letters "RIFF" in ASCII form (0x52494646 big-endian form).
            stream.Write(encoding.GetBytes("RIFF"), 0, 4);
    
            // NOTE this will be filled in later
            stream.Write(BitConverter.GetBytes(0), 0, 4);
    
            // Format Contains the letters "WAVE"(0x57415645 big-endian form).
            stream.Write(encoding.GetBytes("WAVE"), 0, 4);
    
            // Subchunk1ID Contains the letters "fmt " (0x666d7420 big-endian form).
            stream.Write(encoding.GetBytes("fmt "), 0, 4);
    
            // Subchunk1Size 16 for PCM. This is the size of therest of the Subchunk which follows this number.
            stream.Write(BitConverter.GetBytes(16), 0, 4);
    
            // AudioFormat PCM = 1 (i.e. Linear quantization) Values other than 1 indicate some form of compression.
            stream.Write(BitConverter.GetBytes((short)1), 0, 2);
    
            // NumChannels Mono = 1, Stereo = 2, etc.
            stream.Write(BitConverter.GetBytes((short)1), 0, 2);
    
            // SampleRate 8000, 44100, etc.
            stream.Write(BitConverter.GetBytes(sampleRate), 0, 4);
    
            // ByteRate = SampleRate * NumChannels * BitsPerSample/8
            stream.Write(BitConverter.GetBytes(sampleRate * bytesPerSample), 0, 4);
    
            // BlockAlign NumChannels * BitsPerSample/8 The number of bytes for one sample including all channels.
            stream.Write(BitConverter.GetBytes((short)(bytesPerSample)), 0, 2);
    
            // BitsPerSample 8 bits = 8, 16 bits = 16, etc.
            stream.Write(BitConverter.GetBytes((short)(bitsPerSample)), 0, 2);
    
            // Subchunk2ID Contains the letters "data" (0x64617461 big-endian form).
            stream.Write(encoding.GetBytes("data"), 0, 4);
    
            // NOTE to be filled in later
            stream.Write(BitConverter.GetBytes(0), 0, 4);
        }