Network Stream Encoding

Jan 17, 2014 at 6:36 PM
Edited Jan 17, 2014 at 6:51 PM
Hallo,

erstmal ein großes Lob an den Entwickler der Bibliothek. Wirklich Klasse.
Nun zu meinem Problem:
Ich versuche meine aufgezeichneten Daten meiner Soundkarte (WasapiLoopbackCapture) über das Netzwerk zu verschicken und auf einem anderen Gerät wieder auszugeben.
Das ganze funktioniert auch soweit mit einer udp Verbindung, allerdings würde ich die Daten vor dem verschicken gerne noch codieren um nicht so enorme Datenmengen verschicken zu müssen.
Da es leider noch keine genaue Dokumentation zu CSCore gibt bin ich leicht überfragt, ob dies mittels CSCore geht oder ob ich eine andere Libary nutzen muss. Würde es gerne als PCM_16Bit mit einer Samplerate von 8000 oder 16000 haben um es effizient und ohne große Latenz übertragen zu können.

Aktuell wird es in meinem Test Projekt einfach direkt ins Netzwerk übertragen.
static void soundIn_DataAvailable(object sender, DataAvailableEventArgs e)
        {
            //e.Data, e.Offset, e.ByteCount
            netSocket.SendTo(e.Data, endPoint);
        }
Coordinator
Jan 17, 2014 at 7:53 PM
Hier ist ein Beispiel wie es prinzipiell funktioniert (gibt mehrere Möglichkeiten, das sollte jedoch die Schnellste sein):
            //create your soundIn
            ISoundIn soundIn = null;
            soundIn = new WasapiLoopbackCapture();
            soundIn.Initialize();
            soundIn.Start();

            //convert soundIn => WaveSource
            IWaveSource source = new SoundInSource(soundIn);

            //setup the new format
            WaveFormat sourceFormat = source.WaveFormat;
            WaveFormat targetFormat = new WaveFormat(
                16000, //16kHz
                16, //16 bit
                sourceFormat.Channels,
                AudioEncoding.Pcm,
                sourceFormat.ExtraSize);

            //setup the resampler and hope that the choosen format is supported ;)
            using (IWaveSource encodedSource = new DmoResampler(source, targetFormat))
            {
                byte[] buffer = new byte[encodedSource.WaveFormat.BytesPerSecond / 4];

                while (true) //stop sending whenever you want
                {
                    int read = encodedSource.Read(buffer, 0, buffer.Length);
                    if (read > 0)
                    {
                        /*
                         * send data to the stream here
                         * netSocket.SendTo(buffer, read, endPoint); ...
                         * 
                         * If you don't want to use a loop, use the DataAvailable of the SoundInSource. ((SoundInSource)source).DataAvailable += [your event handler to send data]
                         */
                    }

                    Thread.Sleep(250); //default sending latency of 250ms
                }
            }

            soundIn.Stop();
            soundIn.Dispose();
Einfach nach eigenem ermessen anpassen.