Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.
Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше.
uses FMX.Radio.Bass;
var
BLoaded: boolean;
chanPlay, ChanMic: Dword;
avail, freq: word;
buffer: TIDBytes;
procedure TForm1.OnCreate(Sender: TObject);
begin
//Создаем UDP сервер
UDP_Rec:=TIDUDPServer.Create;
with UDP_Rec do begin
DefaultPort:=UDP_RecPort;
BufferSize:=1600;
BroadcastEnabled:=true;
Active:=true;
end;
freq:=16000; //Частота дискретизации
setlength(buffer,UDP_Rec.BufferSize);
BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку
BASS_RecordInit(-1); //Инициализируем запись
end;
//Захват звука с микрофона
procedure TForm1.Recording(Sender: TObject; const Point: TPointF);
begin
isrecording:=not isrecording;
if isrecording then begin
UDP_Rec.OnUDPRead:=nil;
chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil);
VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP
end
end;
//Передача буффера в потоке
procedure TVoiceThread.Execute;
begin
while isrecording do begin
try
avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE);
if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем
try
BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize);
UDP_Rec.Broadcast(Buffer,UDP_RecPort);
except
end;
end;
finally
sleep(20);
end;
end;
BASS_ChannelStop(chanmic);
BASS_StreamFree(chanmic);
end;
//Создание канала для воспроизведения звука из буффера:
procedure TForm1.receiving(Sender: TObject);
begin
chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil);
UDP_Rec.OnUDPRead:=UDP_RecRead;
BASS_ChannelPlay(chanPlay, false);
end;
//Получаем буффер из UDP
procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
try
BASS_StreamPutData(chanPlay, AData,length(AData))
except
end;
end;
Bass.zip