Отправка файла .Wav по сети с помощью NAudio

Я работаю с NAudio, чтобы отправлять аудиофайлы .wav, если быть точным, с одного компьютера на другой.

Я попытался отправить сообщение по сетевому потоку, но у меня нет возможности проверить, было ли сообщение отправлено правильно или нет, потому что до сих пор у меня проблемы с получением кода.

Вот код отправки.

public void StartConnection()
    {
        _connection = new TcpClient("localhost",1111);
        _stream = _connection.GetStream();
        SendFile(_stream,_waveStream);
    }

public void SendFile(NetworkStream StreamToWrite,WaveStream StreamToSend)
    {
        WaveFileWriter write = new WaveFileWriter(StreamToWrite,StreamToSend.WaveFormat);
        byte[] decoded = FromStreamToByte(StreamToSend);
        write.Write(decoded,0,decoded.Length);
        write.Flush();
    }

а вот код получения

public void ListenConnection()
    {
        _listener = new TcpListener(IPAddress.Any,1111);
        _listener.Start();
        TcpClient receiver = _listener.AcceptTcpClient();
        _stream = receiver.GetStream();
    }

public void ReadFile(NetworkStream stream)
    {
        WaveFileReader read = new WaveFileReader(stream);
    }

Теперь у меня возникли проблемы с тем, где продолжить получение кода, потому что, если я вызываю метод read для read, он запрашивает массив байтов, смещение и длину. Но почему он запрашивает массив, я не понимаю, ведь он просто получает данные.

Любые советы о том, как мне действовать дальше с методом ReadFile.

ОБНОВИТЬ---

Во время отладки я обнаружил, что NetworkStream, который передавался в SendFile для использования в WaveFileWriter, не имеет определенной длины, поэтому он дает Stream Does not Support Seek Operations. Однако я не понимаю, почему он выдает эту ошибку, потому что его прототип говорит, что может принимать любой поток.


person Win Coder    schedule 04.07.2013    source источник


Ответы (1)


Вы не можете использовать WaveFileWriter с NetworkStream, поскольку заголовок файла WAV содержит информацию о длине, которая неизвестна до тех пор, пока не будет записан весь файл. Таким образом, заголовок записывается последним, требуя доступного для поиска потока.

Вместо потоковой передачи файла WAV просто отправьте звук PCM (и информацию о формате, если вам нужно) и поместите его в файл WAV на другом конце.

person Mark Heath    schedule 04.07.2013
comment
Теперь, когда я заметил, что заголовок моего вопроса немного вводит в заблуждение, потому что я не совсем отправляю файл .wav по сетевому потоку. Вместо этого StreamToSend в SendFile — это просто еще один поток, который я получил после это руководство. - person Win Coder; 04.07.2013
comment
Если у вас уже есть файл WAV, просто отправьте его через NetworkStream. Нет необходимости задействовать WaveFileWriter вообще. - person Mark Heath; 05.07.2013
comment
Привет @MarkHeath Не могли бы вы привести пример того, как отправлять данные по сети, захваченные WasapiLoopbackCapture? Как я могу отправить звук PCM? Спасибо! - person Fernando Pelliccioni; 26.12.2013