Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Вниз

Голосовой чат. Нужна помощь   Найти похожие ветки 

 
Archi   (2010-06-04 15:22) [0]

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


 
KilkennyCat ©   (2010-06-04 17:20) [1]

Смотря что происходит. Если есть задержка между пакетами (что тут обозвано буферами), то необходимо действительно буфер делать, т.е. сначала накопить несколько пакетов, затем воспроизводить. Если причина не в задержке, то не видя кода сложно сказать, при правильных действиях на месте стыковки ничего не хлопает.


 
Archi   (2010-06-04 20:21) [2]

сервер:

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
 if 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;


 
KilkennyCat ©   (2010-06-04 21:09) [3]

TACMComponent - это что?

и вообще, приведенный код ничего не демонстрирует.


 
Archi   (2010-06-04 21:39) [4]

TACMComponent - компонент, который записывает\воспроизводит звук.

Что в коде непонятно? клиент записывает звук, отпровляет его на сервер. Сервер пересылает поочерёдно всем клиентам этот пакет. Клиент воспроизводит его. Задержки между пакетами вроде бы нету.. звук практически не отстаёт (около полусекунды), но на месте стыковки пакетов(как мне обьяснили) происходит вот что: пакет закончился, воспроизведение остановилось, началось воспроизведение нового пакета. В момент когда останавливается воспроизведение пакета из за того, что звук останавливается слышен как бе треск.


 
Archi   (2010-06-04 21:39) [5]

TACMComponent - компонент, который записывает\воспроизводит звук.

Что в коде непонятно? клиент записывает звук, отпровляет его на сервер. Сервер пересылает поочерёдно всем клиентам этот пакет. Клиент воспроизводит его. Задержки между пакетами вроде бы нету.. звук практически не отстаёт (около полусекунды), но на месте стыковки пакетов(как мне обьяснили) происходит вот что: пакет закончился, воспроизведение остановилось, началось воспроизведение нового пакета. В момент когда останавливается воспроизведение пакета из за того, что звук останавливается слышен как бе треск.


 
Archi   (2010-06-04 21:55) [6]

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


 
Демо ©   (2010-06-04 22:20) [7]

1. socket.ReceiveBuf(buf^,l); //принимаем данные

2. for i:=0 to Server.Socket.ActiveConnections-1 do
if server.Socket.Connections[i]=socket
then
  continue
else
  Server.Socket.Connections[i].SendBuf(buf^,l);
FreeMem(buf); //освобождаем память;
end;


Как ты думаешь, насколько долго выполняется код (2)?

И насколько часто у тебя считывается буфер (1)?

Ещё нужно учесть, что всё это выполняется в основном потоке.


 
Archi   (2010-06-04 22:44) [8]

Честно - незнаю =\
но ведь оно "трещит" даже когда на сервере сидит всего 2 человека, а я думаю что это не так уж и много и всё это будет выполнятся довольно таки быстро


 
KilkennyCat ©   (2010-06-04 23:46) [9]

и еще нужно учесть какой-то компонент TACMComponent.

> даже когда на сервере сидит всего 2 человека

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

Вопрос: если один человек на сервере, все хорошо?


 
Archi   (2010-06-05 00:33) [10]

дело в том, что сервер не воспроизводит а всего лишь передаёт звук.
а про скорость - тестировал в сети на 100мб и в интернете. особой разницы не заметил


 
Германн ©   (2010-06-05 01:43) [11]


> > даже когда на сервере сидит всего 2 человека
>
> у которых скорость соединения должна быть настолько быстрой,
>  что бы пауза, которая образовывается у одного, пока идет
> отсылка второму, была настолько маленькая, что можно пренебречь.
>  Опять же, учитывая какой-то TACMComponent.
>


> тестировал в сети на 100мб и в интернете. особой разницы
> не заметил

Тестирование "на стенде" и "тестирование на реальных объектах" очень часто дают весьма разные результаты!


 
Сергей М. ©   (2010-06-05 16:54) [12]


> Archi   (04.06.10 20:21) [2]


Это в боевых условиях работать не будет - ни с треском ни без треска.


 
RWolf ©   (2010-06-05 22:21) [13]


> Archi   (05.06.10 00:33) [10]
> тестировал в сети на 100мб и в интернете. особой разницы
> не заметил

тестировал на канале ~4 кбит, ничего не трещало.


 
Va-Bank   (2010-08-03 21:52) [14]

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
8-1207371956
MIKron
2008-04-05 09:05
2010.10.24
Обращение цевта и маштабирование


2-1280306017
Jimmy
2010-07-28 12:33
2010.10.24
ComboBox


2-1280900619
adminwik
2010-08-04 09:43
2010.10.24
Помогите составить алгоритм!


15-1279632976
Galera
2010-07-20 17:36
2010.10.24
NT AUTHORITY SYSTEM перегрузит ваш компьютер


15-1279398576
Юрий
2010-07-18 00:29
2010.10.24
С днем рождения ! 18 июля 2010 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский