Передача живого звука в реальном времени с микрофона через TCP / IP с использованием C#. net - PullRequest
0 голосов
/ 19 июня 2020

Я здесь не для того, чтобы спамить или повторно задавать тот же вопрос, но на самом деле я не могу настроить какой-либо источник для запуска. Я хочу создать приложение для передачи звука с микрофона на ноутбуке или P C в реальном времени, как поток Youtube, но без видео. .. я покажу свой прогресс >> Сначала я передаю нормальный файл, конвертируя его в байт, а затем снова в исходное значение. Второй изменяю тип файла на MP3 или wav, затем использую NAudio. Работает нормально, также я могу воспроизвести файл, если он передан или при получении Третьего изменил входной файл на микрофон и получил звук. ВОТ ПРОБЛЕМА "NAudio не может поместить прямой поток с mi c, затем отправить его автоматически, всегда буфер дает мне исключение нулевого указателя во время отладки, а затем дает мне другую ошибку, которая декодирует NAudio не получил никаких данных, «кстати неприемлемых», он должен прослушивать или продолжать получать данные до тех пор, пока порт или соединение не закроются. Я пытался поискать любую библиотеку о VoIP, но не нашел ничего, кроме Ozeki, но не учебник по обработке и все, что я нашел, это старые видео не работает .. Я искал об этом более недели, но без результата. Мне не нужен полностью разработанный проект, потому что я нашел один, но он слишком сложен в отношении строчного кода 2K. Все, что мне нужно, что делать, или проблема с кодом, или и то, и другое .. это код на стороне клиента ..

   public void client()
    {
        try
        {
            //byte[] send_data = Audio_to_byte(); // ORIGINAL WORK CODE
            byte[] send_data = new byte [BufferSize]; // 100M buffer size 
            TcpClient client = new TcpClient(serverip, port);
            NetworkStream stream = client.GetStream();
            // sourceStream and wavein is global vars
            sourceStream = new NAudio.Wave.WaveIn();
            sourceStream.DeviceNumber = 1;
            sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(1).Channels);
            wavein = new NAudio.Wave.WaveInProvider(sourceStream);
            //wavein.Read(send_data, 0, send_data.Length); // this buffer not work some times give me full buffer
            BufferedWaveProvider pro = new BufferedWaveProvider(wavein.WaveFormat);
            pro.AddSamples(send_data, 0, send_data.Length); // Empty buffer or error full buffer
            stream.Write(send_data, 0, send_data.Length);
            stream.Close();
            client.Close();

        }
        catch (Exception e)
        {
            MessageBox.Show("Server is offline" + e, "Error");

// Здесь сообщение, что буфер заполнен, или отправляется его пустым, тогда декодер не получил ничего, выдает ошибку исключения или они происходят первыми}} и этот код на стороне сервера с Код для чтения MP3

 IPAddress ip = Dns.GetHostEntry(serverip).AddressList[0];
        TcpListener server_obj = new TcpListener(ip,port);
        TcpClient client = default(TcpClient);
        try
        {
            server_obj.Start();
            while (true)
            {
                // accept all client
                client = server_obj.AcceptTcpClient();
                // make byte storage from network
                byte[] received_buffer = new byte[BufferSize];
                //get data from cst
                NetworkStream stream = client.GetStream();
                //save data from network to memory till finish then save with playing
                MemoryStream ms = new MemoryStream();

                int numBytesRead = 0;

                while ((numBytesRead = stream.Read(received_buffer, 0, received_buffer.Length)) > 0)
                {
                    // THIS STEP TO RECEIVE ALL DATA FROM CLIENT
                    ms.Write(received_buffer, 0, numBytesRead);
                    //receive sound then play it direct
                    WaveOut(ms.ToArray());
                }

                Byte_to_audio(ms.ToArray()); // YOU can make or allow override
            }
        }
        catch(Exception e)
        {
           MessageBox.Show("Error Message : " + e, "Error");
        }
    }

Это метод, который читает поток, получающий данные из сети

       private void WaveOut(byte[] mp3Bytes)
    {
        // MP3 Format
        mp3Stream = new MemoryStream(mp3Bytes);
        mp3FileReader = new Mp3FileReader(mp3Stream);
        wave32 = new WaveChannel32(mp3FileReader, 0.3f, 3f);
        ds = new DirectSoundOut(); // but declration up global
        ds.Init(wave32);
        ds.Play(); // work code*/ 
    }

Пожалуйста, как я уже сказал, я не здесь, чтобы повторно задавать тот же вопрос, если бы я сделал, я выиграл Не публиковать это.

1 Ответ

0 голосов
/ 25 июня 2020

Я рекомендую использовать UDP, если он должен быть в реальном времени.

Поскольку я использую Naudio с vb. net, я основал этот пост .

Пример клиента:

waveIn = new WaveIn();
waveIn.BufferMilliseconds = 50; //Milissecondes Buffer
waveIn.DeviceNumber = inputDeviceNumber;
waveIn.WaveFormat = HEREWaveFormatHERE;
waveIn.DataAvailable += waveIn_DataAvailable; //Event to receive Buffer
waveIn.StartRecording();

void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
   //e -> BUFFER

stream.Write(send_data, 0, send_data.Length);
            stream.Close();
            client.Close();

}
  • ПОЛУЧИТЬ:

1 - Создать WaveOut и BufferProvider Global

WOut = New WaveOut(WaveCallbackInfo.FunctionCallback());

BufferedWaveProvider pro = new BufferedWaveProvider(HEREWaveFormatHERE);
pro.BufferLength = 20 * 1024;      //Max Size BufferedWaveProvider
pro.DiscardOnBufferOverflow = True;
WOut.Init(pro);
WOut.Play();

Пока нет звука BufferedWaveProvider обеспечит тишину для WaveOut или других выходов, он также будет ставить в очередь все, что приходит, для непрерывного воспроизведения.

2 - Воспроизведение и постановка в очередь

while ((numBytesRead = stream.Read(received_buffer, 0, received_buffer.Length)) > 0)
                {
                   pro.AddSamples(received_buffer, 0, numBytesRead);
                }

Мои знания о naudio ограничены этим

англи sh из гугл переводчика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...