аудиочат клиента и сервера delphi indy udp

#delphi #audio

#delphi #Аудио

Вопрос:

Я создаю проект для создания мультизвукового чата с помощью компонентов Indy и компонентов wave audio, но я застрял с ошибкой. Это простой код, но я не знаю, как это исправить.

sendtocl — это клиент, который я использую

 procedure TForm1.recorderData(Sender: TObject; const Buffer: Pointer;
  BufferSize: Cardinal; var FreeIt: Boolean);
begin
  Freeit :=True;
  sendtocl.SendBuffer(Buffer^, Buffersize);
end;
 

Я получил эту ошибку при компиляции

Не существует перегруженной версии ‘SendBuffer’, которую можно вызвать с этими аргументами

какие-либо предлагаемые исправления?


» sentocl» — это мой indyudpclient

 procedure TForm1.recorderData(Sender: TObject; const Buffer: Pointer; BufferSize: Cardinal; var FreeIt: Boolean);
begin
  Freeit := True;
  sendtocl.SendBuffer(RawToBytes(Buffer^, Buffersize));
end;
 

Этот исправленный код от Remy lebeau устраняет ошибку компиляции, но когда я пытаюсь отправить аудио, текст получает огромные данные, а другой клиент в сети не слышит звука. я думаю, что-то в onread с indy server компонент, который я использую :

Wave audio, сервер и клиент indy udp,,, с использованием delphi xe5

Remy могу ли я отправить аудиопоток через клиент indyudp? образец в wave audio предназначен для winsock, но я действительно потерял, как это сделать с помощью indy, можете ли вы дать мне ссылку на это

Комментарии:

1. Я предполагаю, что вы откуда-то взяли свой код, и этот код был взят из другой версии Indy, отличной от используемой вами.

2. Да, у меня есть предложение. Посмотрите на исходный код (который поставляется со всеми версиями Indy, которые когда-либо распространялись с Delphi) и выясните, для чего нужны правильные типы параметров SendBuffer , а затем исправьте код так, чтобы он использовал правильные типы. Поскольку вы не указали, какие версии Delphi и Indy вы используете, и даже не указали, что это за класс sentocl , невозможно быть более конкретным. («sendtocl — это клиент, который я использую», не указывает тип класса этого «клиента».)

Ответ №1:

Если вы посмотрите на объявление SendBuffer() , оно ожидает a TIdBytes в качестве входных данных. Для этого вы можете использовать RawToBytes() функцию Инди:

 procedure TForm1.recorderData(Sender: TObject; const Buffer: Pointer; BufferSize: Cardinal; var FreeIt: Boolean);
begin
  Freeit := True;
  sendtocl.SendBuffer(RawToBytes(Buffer^, Buffersize));
end;