Гласов чат
Пиша гласов чат в Delphi, използвайки acm компоненти. По принцип записвам звука в буфер и го прехвърлям на сървъра, който предава този звук на всички свързани клиенти, които след това възпроизвеждат този звук. Същността на проблема е, че на мястото, където са съединени буферите, звукът изчезва и се възпроизвежда отново - поради това се чуват пукания. Как може да се избегне това? P.S. Само ви моля да сте по-ясни, ако пишете нещо, защото току-що започнах да уча delphi ^^
Гледа какво става. Ако има забавяне между пакетите (което тук се нарича буфери), тогава наистина трябва да направите буфер, т.е. първо натрупайте няколко пакета, след това играйте. Ако причината не е забавянето, тогава без да видите кода е трудно да се каже, с правилните действия в докинг точката нищо не изскача.
сървър: procedure TfServer.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var l:integer; //размер на буфера buf:pointer;//buffer i:integer; begin l:=socket.ReceiveLength;//получаване на дължината на буфера getmem(buf,l+1); //резервиране на памет socket.ReceiveBuf(buf^,l); //приемане на данни //изпращане на данни до всички освен източника за i:=0 към Server.Socket.ActiveConnections-1 направете ако server.Socket.Connections[i]=socket след това продължете иначе Server.Socket.Connections[i].SendBuf(buf^,l); FreeMem(buf ); //свободна памет; край;
клиент процедура TfClient.ACMIn1Data(Sender: TACMComponent; aDataPtr: Pointer; aDataSize: Cardinal); begin //изпращане на буфер за данни clientsocket1.Socket.SendBuf(adataptr^,adatasize); end;
TACMComponent - какво е това?
и като цяло горният код не демонстрира нищо.
TACMComponent е компонент, който записва/възпроизвежда звук.
Какво не е ясно в кода? клиент записва звук, изпращакъм сървъра. Сървърът изпраща този пакет до всички клиенти на свой ред. Клиентът го играе. Изглежда няма забавяне между пакетите .. звукът практически не изостава (около половин секунда), но на мястото, където пакетите са съединени (както ми обясниха), това се случва: пакетът е свършил, възпроизвеждането е спряло, възпроизвеждането на нов пакет е започнало. В момента, когато възпроизвеждането на пакета спре поради факта, че звукът спира, се чува като пращене.
TACCMomponent е компонент, който записва/възпроизвежда звук.
Какво не е ясно в кода? клиентът записва звука, изпраща го на сървъра. Сървърът изпраща този пакет до всички клиенти на свой ред. Клиентът го играе. Изглежда няма забавяне между пакетите .. звукът практически не изостава (около половин секунда), но на мястото, където пакетите са съединени (както ми обясниха), това се случва: пакетът е свършил, възпроизвеждането е спряло, възпроизвеждането на нов пакет е започнало. В момента, когато възпроизвеждането на пакета спре поради факта, че звукът спира, се чува като пращене.
Съжалявам за двойния пост, компютърът ми е замръзнал =\
1. socket.ReceiveBuf(buf^,l); //получаване на данни
2. за i:=0 към Server.Socket.ActiveConnections-1 направете ако server.Socket.Connections[i]=socket тогава продължете друго Server.Socket.Connections[i].SendBuf(buf^,l); FreeMem(buf); //свободна памет; край;
Колко време според вас отнема изпълнението на код (2)?
И колко често четете буфер (1)?
Трябва също да вземете предвид, че всичко това се изпълнява в основната нишка.
Честно казано - не знам =\ но "пука" дори когато има само 2 човека на сървъра и мисля, че това не е толкова много и всичко това ще свърши доста бързо
и все пак трябва да се вземе предвид някакъв компонентTACMComponent.> дори когато има само 2 души на сървърачиято скорост на връзката трябва да е толкова висока, че паузата, която възниква за единия при изпращане към втория, е толкова малка, че може да бъде пренебрегната. Отново, дадени някои TACCMomponent.
Въпрос: ако един човек е на сървъра, всичко наред ли е?
факт е, че сървъра не възпроизвежда, а само предава звук. а за скоростта - тествах го в мрежата на 100 мб и в интернет. не забеляза голяма разлика
> > дори когато има само 2 души на сървъра > > чиято скорост на връзката трябва да бъде колкото > така че паузата, която има докато > препратката към второто беше толкова малка, че беше незначителна. > Отново, дадени някои TACMComponent. >> тестван в мрежата на 100mb и в интернет. голяма разлика > не забелязахТестването "на стенда" и "тестването върху реални обекти" много често дава много различни резултати!
Тованяма да работи в бойни условия - нито с трясък, нито без трясък.
> Арчи (06/05/10 00:33) [10] > тестван в мрежата на 100mb и в интернет. голяма разлика > не забелязахтествано в канала
4 kbit, нищо кракнато.
Като цяло компонентите TServerSocket и TClientSocket не са съвсем подходящи за предаване на звук. Те работят по TCP протокола. И за предаване на звук е по-добре да използвате UDP протокола. За да направите това, например, можете да вземете компоненти от Indy (аз самият пиша на някои TidUDPServer без TidUDPCLient). Факт е, че TCP чака пристигането на всички данни, а UDP не се интересува дали са дошли или не. Просто ако се загубят няколко байта в мрежата, нищо лошо няма да се случи,не може да се определи на ухо. Но скоростта на предаване ще се увеличи. Аз самият пиша програма, в която трябва да вградя групов аудио чат. Едно към едно го направих. Но ставата не става. Направих два модула за улавяне и възпроизвеждане на звук, базирани на ACM компоненти, но използвайки функцията за обратно извикване. Като цяло много вода се изля по темата за аудио чат. В интернет изобщо няма информация. Всеки живее не само за споделяне на изходните кодове (разбирам), но дори и за предлагане на алгоритъм (тук не разбирам).