1

私は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);
        }
    }
}
4

2 に答える 2

0

これは役に立つかもしれないし、役に立たないかもしれませんが、ネットワークが問題だと考えたことはありますか? ファイアウォールはポート 45,000 のブロックを解除していますか?

それに加えて、代わりにポート範囲 49152 ~ 65535 を使用することを検討する必要があります。これは、IANA に登録されていないプライベート ポートと動的ポートに使用されるためです。

編集: また、使用している IP アドレスはループバック アドレスです。これは意図的なものですか?そうしないと、トラフィックは事実上どこにも行きません。

于 2013-06-30T22:14:34.927 に答える
0

注意として、私もこの問題に遭遇しました。問題は、DynamicSoundEffectInstanceバッファでオーバーフローしていることです。呼び出すSubmitBuffer()と、内部バッファーの最後にバイトバッファーが追加され、クラッシュすると、バッファーがオーバーフローするためです。これを試して:

while (sound.PendingBufferCount > 3) { Thread.Sleep(1); }
sound.SubmitBuffer(temp, 0, temp.Length);

これにより、発生している問題が解決されるはずです。DynamicSoundEffectInstanceこれが行うことは、オーバーフローを防ぐために、内部バッファーに 3 つのバッファーしかないのを待機することです。また、遅延を防ぐためにバッファーを小さくすることもお勧めします (気にする場合)。

于 2014-09-21T03:09:50.417 に答える