使用Xna框架的Plaing Voice
本文关键字:Plaing Voice 框架 Xna 使用 | 更新日期: 2023-09-27 18:20:33
我从kinect设备获取音频,并将这些字节数组发送到客户端,客户端接收这些字节并使用xna DynamicSoundEffectInstance类播放,但我面临的问题是客户端接收到一些字节,程序自动终止,没有任何异常服务器代码
KinectSensor kinectsenser;
Thread obj;
TcpClient client;
TcpListener server;
NetworkStream ns;
Stream kinectaudio;
soundcontainer.SoundData sound =null;
Thread obj1 = null;
Object objt = new Object();
public MainWindow()
{
InitializeComponent();
server = new TcpListener(IPAddress.Parse("127.0.0.1"), 45000);
server.Start();
client = server.AcceptTcpClient();
ns = client.GetStream();
sound = new SoundData();
obj1 = new Thread(send);
}
void audio()
{
byte[] soundSampleBuffer = new byte[1000];
kinectaudio = kinectsenser.AudioSource.Start();
obj1.Start();
while (true)
{
lock (objt)
{
int count = kinectaudio.Read(soundSampleBuffer, 0, soundSampleBuffer.Length);
sound.data = soundSampleBuffer;
}
}
}
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
if (KinectSensor.KinectSensors.Count == 0)
{
MessageBox.Show("no Kinect Device is attched");
Application.Current.Shutdown();
}
kinectsenser = KinectSensor.KinectSensors[0];
kinectsenser.Start();
audio();
}
void send()
{
while (true)
{
lock (objt)
{
soundcontainer.SoundData i = new SoundData();
i.data = sound.data;
if (i.data != null)
{
if (ns.CanWrite)
{
ns.Write(i.data, 0, i.data.Length);
ns.Flush();
}
}
}
}
}
客户代码如下:
public partial class MainWindow : Window
{
TcpClient client;
NetworkStream ns;
Thread iiui;
public MainWindow()
{
InitializeComponent();
client = new TcpClient();
IPAddress ip=IPAddress.Parse("127.0.0.1");
client.Connect(ip, 45000);
ns = client.GetStream();
iiui = new Thread(start);
iiui.Start();
}
void start()
{
DynamicSoundEffectInstance sound = new DynamicSoundEffectInstance(16000, AudioChannels.Mono);
Microsoft.Xna.Framework.FrameworkDispatcher.Update();
sound.Play();
IFormatter formater = new BinaryFormatter();
while (true)
{
byte[] temp = new byte[65536];
ns.Read(temp, 0, temp.Length);
sound.SubmitBuffer(temp, 0, temp.Length);
}
}
}
注意,我也遇到了这个问题,问题是DynamicSoundEffectInstance
中溢出了缓冲区。当您调用SubmitBuffer()
时,您将字节缓冲区添加到其内部缓冲区的末尾,当它崩溃时,这是因为缓冲区溢出。试试这个:
while (sound.PendingBufferCount > 3) { Thread.Sleep(1); }
sound.SubmitBuffer(temp, 0, temp.Length);
这应该可以解决您遇到的任何问题。这样做的目的是等待DynamicSoundEffectInstance
在其内部缓冲区中只有3个缓冲区,以防止溢出。减小缓冲区以防止滞后也是一个好主意(如果你关心的话)。
这可能有帮助,也可能没有帮助,但您是否认为您的网络是问题所在?您的防火墙是否解锁45000端口?
除此之外,您应该考虑使用端口范围:49152–65535,因为这些端口用于未在IANA注册的专用和动态端口。
编辑:此外,您正在使用的IP地址是您的环回地址。这是故意的吗?否则,交通几乎毫无进展。