【问题标题】:Streaming music to Windows Phone from PC in realtime将音乐从 PC 实时流式传输到 Windows Phone
【发布时间】:2014-03-26 06:54:52
【问题描述】:

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

我尝试过的:

  1. 成功建立连接,数据传输正常。

     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类接收到的任何数据。

  1. 在电话端,我能够正确接收所有字节 [] 数据,并将其写入 MemoryStream。 内存流流=新的内存流(); 公共无效接收消息() {

        var responseListener = new SocketAsyncEventArgs();
        responseListener.Completed += responseListener_Completed;
    
        var responseBuffer = new byte[MAX_BUFFER_SIZE];
        responseListener.SetBuffer(responseBuffer, 0, MAX_BUFFER_SIZE);
    
        _socket.ReceiveAsync(responseListener);
    }
    
    void responseListener_Completed(object sender, SocketAsyncEventArgs e)
    {
        stream.Write(e.Buffer, 0, e.BytesTransferred);
        if (!stopReceiving)
            ReceiveMessage();
    }
    

收到几秒钟后,我尝试将其播放为:

public void play()
{
SoundEffect soundE = new SoundEffect(stream.ToArray(), 48000, AudioChannels.Mono);
soundE.CreateInstance();
FrameworkDispatcher.Update();
isPlaying = true;
soundE.Play();
}

我听到的只是噪音。我尝试通过以下方式(来自诺基亚开发者网站)将 WaveHeader 写入流:

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

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

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

【问题讨论】:

    标签: c# wpf windows windows-phone-8 naudio


    【解决方案1】:

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

    【讨论】:

    • 实际上,我以前从来没有处理过很多音频。你能给我一些链接来帮助我吗??
    • 我在two Pluralsight courses on audio 中详细介绍了这一点(为无耻的插件道歉)
    猜你喜欢
    • 2017-07-28
    • 2016-11-18
    • 2012-01-14
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多