NAudio - передача и воспроизведение mp3Frame через TCP

162
03 августа 2018, 15:40

Я пишу TCP сервер-клиент приложение, часть которого которое реализует воспроизведение выбранного сервером .mp3 файла на всех подключённых клиентах. Почитав, решил использовать библиотеку NAudio для обработки аудио. Вообще я новичок в работе со звуком.

Вот код передачи mp3:

    public void PlayFromFile(string fileName, UserList _clients)
    {
        Mp3FileReader reader = new Mp3FileReader(fileName);
        Mp3Frame frame;                                    
        // For each frame
        while ((frame = reader.ReadNextFrame()) != null)   
        {                                  
            foreach (var client in _clients)
            {
                NetworkStream outputStream = client.GetStream();
                outputStream.Write(frame.RawData, 0, frame.RawData.Length);
            }
        }
    }
  • UserList _clients - это CunncurrentDictionary, где в качестве значения выступают "AppUsers" - расширение стандартного класса TcpClient

Подскажите, правильный ли выбран подход для отправки пакетов приложениям-клиентам и если да - как лучше всего ловить и воспроизводить данные на стороне клиента?

Заранее спасибо.

Answer 1

Подход неправильный по нескольким причинам.

  1. Вы никак не отделяете разные фреймы друг от друга - в итоге получатель не сможет определить где заканчивается один и начинается другой. Напомню, что протокол TCP работает не с отдельными пакетами, а с потоком.

  2. Вы используете TCP. TCP - это не лучший протокол для передачи в ситуации когда вам нужна стабильная задержка, но не нужна гарантия доставки. Для передачи реалтайм-аудио и видео лучше использовать UDP, а еще лучше - RTP.

  3. Вы декодируете звук перед передачей по сети. Передача его в сжатом виде намного эффективнее...

READ ALSO
Semaphore в TPL

Semaphore в TPL

В моей программе доступ к функции должно иметь только определенное количество потоковЕсть следующий код:

206
Key Hook не определяет 4 кнопки сразу

Key Hook не определяет 4 кнопки сразу

Хочу выводить нажатые клавиши пользователем, в том числе сочетанияПробовал разные Key Lisener/Hook (они работают по одному и тому же принципу), но везде...

198
Обойти дерево в глубину

Обойти дерево в глубину

Есть такой набор данных:

207
Excel выбор листа при импорте laravel

Excel выбор листа при импорте laravel

Как сделал выборку листов при импорте из Excel файла в бд laravelНа данный момент мой импорт:

197