【发布时间】:2014-03-26 06:54:52
【问题描述】:
我正在尝试开发一个 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。 内存流流=新的内存流(); 公共无效接收消息() {
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