Голосовий чат

Пишу голосовий чат на делфі за допомогою acm components. Взагалі записую звук у буфер і передаю його на сервер, який передає цей звук всім підключеним клієнтам, які потім відтворюють цей звук. Суть проблеми в тому, що на місці стикування буферів звук пропадає і заново відтворюється - через це чути хлопки. Як цього уникнути? P.S. Прошу тільки зрозуміліше, якщо що писати, тому що я тільки почав вивчати делфи^^

Дивлячись, що відбувається. Якщо є затримка між пакетами (що покликано буферами), необхідно дійсно буфер робити, тобто. спочатку нагромадити кілька пакетів, потім відтворювати. Якщо причина не в затримці, то не бачачи коду, важко сказати, при правильних діях на місці стикування нічого не плескає.

сервер: procedure TfServer.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var l:integer; //розмір буфера buf:pointer;//буфер i:integer; begin l:=socket.ReceiveLength;//отримуємо довжину буфера getmem(buf,l+1 ); //резервуємо пам'ять socket.ReceiveBuf(buf^,l); //приймаємо дані //пересилаємо дані всім крім джерела for i:=0 to Server.Socket.ActiveConnections-1 do іf server.Socket.Connections[i]=socket then continue else Server.Socket.Connections[i].SendBuf(buf^,l); FreeMem(buf); //звільняємо пам'ять; end;

клієнт procedure TfClient.ACMIn1Data(Sender: TACMComponent; aDataPtr: Pointer; aDataSize: Cardinal); begin //посилаємо буфер даних clientsocket1.Socket.SendBuf(adataptr ^,adatasize); end;

TACMComponent - це що?

і взагалі наведений код нічого не демонструє.

TACMComponent - компонент, який записує відтворює звук.

Що у коді незрозуміло? клієнт записує звук, відправляєйого на сервер. Сервер пересилає по черзі всім клієнтам пакет. Клієнт відтворює його. Затримки між пакетами начебто немає. звук практично не відстає (близько півсекунди), але на місці стикування пакетів (як мені пояснили) відбувається ось що: пакет закінчився, відтворення зупинилося, почалося відтворення нового пакета. У момент коли зупиняється відтворення пакета через те, що звук зупиняється чутний як тріск.

TACMComponent - компонент, який записує відтворює звук.

Що у коді незрозуміло? клієнт записує звук, відправляє його на сервер. Сервер пересилає по черзі всім клієнтам пакет. Клієнт відтворює його. Затримки між пакетами начебто немає. звук практично не відстає (близько півсекунди), але на місці стикування пакетів (як мені пояснили) відбувається ось що: пакет закінчився, відтворення зупинилося, почалося відтворення нового пакета. У момент коли зупиняється відтворення пакета через те, що звук зупиняється чутний як тріск.

вибачаюсь за дабл пост, завис комп'ютер=\

1. socket.ReceiveBuf(buf^,l); //Приймаємо дані

2. for i:=0 до Server.Socket.ActiveConnections-1 до іf server.Socket.Connections[i]=socket then continue else Server.Socket.Connections [i].SendBuf(buf^,l); FreeMem(buf); //звільняємо пам'ять; end;

Як ти вважаєш, наскільки довго виконується код (2)?

І як часто у тебе зчитується буфер (1)?

Ще треба врахувати, що це виконується переважно потоці.

Чесно - незнаю = але ж воно "тріщить" навіть коли на сервері сидить всього 2 людини, а я думаю що це не так вже й багато і все це буде виконуватися досить таки швидко

і ще потрібно врахувати якийсь компонентTACMComponent.> навіть коли на сервері сидить всього 2 людиниу яких швидкість з'єднання повинна бути настільки швидкою, щоб пауза, яка утворюється в одного, поки йде відсилання другому, була настільки маленька, що можна знехтувати. Знову ж таки, враховуючи якийсь TACMComponent.

Запитання: якщо одна людина на сервері, все гаразд?

Справа в тому, що сервер не відтворює а всього лише передає звук. А про швидкість - тестував в мережі на 100мб і в інтернеті. особливої ​​різниці не помітив

> > навіть коли на сервері сидить лише 2 особи > > у яких швидкість з'єднання має бути настільки швидкою, > щоб пауза, яка утворюється в одного, поки йде > відсилання другому, була настільки маленька, що можна знехтувати. > Знову ж таки, враховуючи якийсь TACMComponent. >> тестував у мережі на 100мб та в інтернеті. особливої ​​різниці > не помітивТестування "на стенді" та "тестування на реальних об'єктах" дуже часто дають дуже різні результати!

Цеу бойових умовах працювати не буде - ні з тріском ні без тріску.

> Archi (05.06.10 00:33) [10] & gt; тестував у мережі на 100мб та в інтернеті. особливої ​​різниці > не помітивтестував на каналі

4 кбіт, нічого не тріщало.

Взагалі компоненти TServerSocket та TClientSocket для передачі звуку не зовсім підходять. Вони працюють за протоколом TCP. Для передачі звуку краще скористатися протоколом UDP. Для цього можна взяти компоненти від Indy (сам пишу на одних TidUDPServer без TidUDPCLient). Справа в тому, що TCP очікує приходу всіх даних, а UDP пофіг, прийшли вони чи ні. Просто якщо пара байт загубиться в мережі нічого страшного не станеться,на слух не визначиш. Натомість швидкість передачі зросте. Я сам пишу програму, в яку треба вбудувати груповий аудіо-чат. Наодинці я зробив. А ось спільний ніяк не виходить. Зробив два модулі для захоплення та відтворення звуку на основі ACM компонентів, але з використанням callback функції. Взагалі на тему аудіочата налито багато води. Інформації взагалі немає в інтернеті. Усі жилять не те, щоб поділитися вихідниками (я розумію), але навіть підказати алгоритм (тут не розумію).