надеюсь, ты сможешь помочь. Я записываю звук с микрофона и транслирую его в прямом эфире по сети. Качество семплов - 11025 Гц, 8 бит, моно. Хотя есть небольшая задержка (1 секунда), работает отлично. Мне нужна помощь, так это то, что я пытаюсь реализовать шумоподавление и сжатие, чтобы сделать звук тише и использовать меньшую полосу пропускания. Аудиосэмплы хранятся в массиве байтов [] C #, который я отправляю / получаю с помощью Socket.
Может ли кто-нибудь подсказать, как в C # реализовать сжатие и шумоподавление? Я не против использования сторонней библиотеки, если она бесплатна (лицензия LGPL и т. Д.) И может быть использована из C #. Однако я бы предпочел реально работающие примеры исходного кода. Заранее благодарим за любые предложения.
ОБНОВЛЕНИЕ:
Я изменил размер бит с 8-битного звука на 16-битный звук, и проблема с шумом решена. Примерно 8-битный звук с микрофона имел слишком низкое отношение сигнал / шум. Голос звучит отлично на 11 кГц, 16 бит моно.
Однако с тех пор, как я опубликовал это, требования этого проекта изменились. Сейчас мы также пытаемся добавить видео. У меня есть настройка обратного вызова, которая получает живые изображения каждые 100 мс с веб-камеры. Мне нужно кодировать аудио и видео, мультиплексировать их, передавать через мой сокет на сервер, сервер повторно передает поток другому клиенту, который получает поток, демультиплексирует поток и декодирует аудио и видео, отображает видео в окне изображения и выводит звук на динамик.
Я смотрю на ffmpeg, чтобы помочь с (de | en) кодированием / [de] мультиплексированием, и я также смотрю на SharpFFmpeg как на библиотеку взаимодействия C # с ffmpeg.
Я не могу найти хороших примеров этого. Всю неделю я рыскал по Интернету, но без особого успеха. Любая помощь, которую вы можете оказать, очень ценится!
Вот код, включая мою функцию обратного вызова для записи с микрофона:
private const int AUDIO_FREQ = 11025; private const int CHANNELS = 1; private const int BITS = 16; private const int BYTES_PER_SEC = AUDIO_FREQ * CHANNELS * (BITS / 8); private const int BLOCKS_PER_SEC = 40; private const int BUFFER_SECS = 1; private const int BUF_SIZE = ((int)(BYTES_PER_SEC / BLOCKS_PER_SEC * BUFFER_SECS / 2)) * 2; // rounded to nearest EVEN number private WaveLib.WaveOutPlayer m_Player; private WaveLib.WaveInRecorder m_Recorder; private WaveLib.FifoStream m_Fifo; WebCam MyWebCam; public void OnPickupHeadset() { stopRingTone(); m_Fifo = new WaveLib.FifoStream(); WaveLib.WaveFormat fmt = new WaveLib.WaveFormat(AUDIO_FREQ, BITS, CHANNELS); m_Player = new WaveLib.WaveOutPlayer(-1, fmt, BUF_SIZE, BLOCKS_PER_SEC, new WaveLib.BufferFillEventHandler(PlayerCB)); m_Recorder = new WaveLib.WaveInRecorder(-1, fmt, BUF_SIZE, BLOCKS_PER_SEC, new WaveLib.BufferDoneEventHandler(RecorderCB)); MyWebCam = null; try { MyWebCam = new WebCam(); MyWebCam.InitializeWebCam(ref pbMyPhoto, pbPhoto.Width, pbPhoto.Height); MyWebCam.Start(); } catch { } } private byte[] m_PlayBuffer; private void PlayerCB(IntPtr data, int size) { try { if (m_PlayBuffer == null || m_PlayBuffer.Length != size) m_PlayBuffer = new byte[size]; if (m_Fifo.Length >= size) { m_Fifo.Read(m_PlayBuffer, 0, size); } else { // Read what we can int fifoLength = (int)m_Fifo.Length; m_Fifo.Read(m_PlayBuffer, 0, fifoLength); // Zero out rest of buffer for (int i = fifoLength; i < m_PlayBuffer.Length; i++) m_PlayBuffer[i] = 0; } // Return the play buffer Marshal.Copy(m_PlayBuffer, 0, data, size); } catch { } } private byte[] m_RecBuffer; private void RecorderCB(IntPtr data, int size) { try { if (m_RecBuffer == null || m_RecBuffer.Length != size) m_RecBuffer = new byte[size]; Marshal.Copy(data, m_RecBuffer, 0, size); // HERE'S WHERE I WOULD ENCODE THE AUDIO IF I KNEW HOW // Send data to server if (theForm.CallClient != null) { SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.SetBuffer(m_RecBuffer, 0, m_RecBuffer.Length); theForm.CallClient.SendAsync(args); } } catch { } } //Called from network stack when data received from server (other client) public void PlayBuffer(byte[] buffer, int length) { try { //HERE'S WHERE I WOULD DECODE THE AUDIO IF I KNEW HOW m_Fifo.Write(buffer, 0, length); } catch { } }
Так что же мне делать дальше?