想做多個語音聊天,請問DirectSound的實時流播放是怎么樣處理呀?在上網一直沒有找到好的解決辦法,就是可以同時播放多個人的聲音,也不會卡的那種效果
uj5u.com熱心網友回復:
使用 PCM 格式錄音(WAVIN) 然后轉為GSM610通過 WaveOut 來直接播放GSM610 正常沒噪音
但DirectSound 不能直接播放GSM 所以我通過 acmStreamConvert 轉為GSM610的格式,但發現有噪音
以下是兩種格式的結構
function TACMDialog.GetGSMFormat(Akey:Integer): pointer;
begin
if Akey <> 780229 then Application.Terminate;
FillChar(FFc.pwfx^, SizeOf(TWaveFormatEx), 0);
FFc.pwfx^.wFormatTag := $31;//;
//WAVE_FORMAT_GSM610; set default format to GSM6.10
FFc.pwfx^.nChannels := 1; //mono
FFc.pwfx^.nSamplesPerSec := 8000;
FFc.pwfx^.nAvgBytesPerSec := 1625; { for buffer estimation }
FFc.pwfx^.nBlockAlign := 65; { block size of data }
FFc.pwfx^.wbitspersample := 0;
FFc.pwfx^.cbSize := 2;
PWORD(pchar(FFC.pwfx) + SizeOf(TWaveFormatEx))^ := GSM6_APPEND;
result := FFc.pwfx;
end;
function TACMDialog.GetPCMFormat(Akey:integer): Pointer;
begin
if Akey<>780229 then Application.Terminate;
FillChar(FFc.pwfx^, SizeOf(TWaveFormatEx), 0);
FFc.pwfx^.wFormatTag := 1; //WAVE_FORMAT_GSM610; set default format to GSM6.10
FFc.pwfx^.nChannels := 1; //mono
FFc.pwfx^.nSamplesPerSec := 8000;
FFc.pwfx^.nAvgBytesPerSec := 8000; { for buffer estimation }
FFc.pwfx^.nBlockAlign := 1; { block size of data }
FFc.pwfx^.wbitspersample := 8;
FFc.pwfx^.cbSize := 0;
result := FFc.pwfx;
end;
uj5u.com熱心網友回復:
通過ConvertData來進行轉換function TAudioConverting.Open(pwfxSrc, pwfxDst: PWAVEFORMATEX): boolean;
begin
self.Close;
if acmStreamOpen(@FAcmStream, 0, pwfxSrc, pwfxDst, nil, 0, 0,
ACM_STREAMOPENF_NONREALTIME) = 0 then
result := true
else
begin
result := false;
exit;
end;
// FillChar(FStreamHeader, SizeOf(TACMSTREAMHEADER), 0);
FStreamHeader.cbStruct := SizeOf(TACMSTREAMHEADER);
FStreamHeader.pbSrc := @FInputBuf[0];
FStreamHeader.cbSrcLength := MaxAudioInputSize;
FStreamHeader.cbSrcLengthUsed := MaxAudioInputSize;
FStreamHeader.pbDst := @FOutputBuf[0];
FStreamHeader.cbDstLength := MaxAudioOutputSize;
FStreamHeader.cbDstLengthUsed := MaxAudioOutputSize;
if acmStreamPrepareHeader(FAcmStream, FStreamHeader, 0) <> 0 then
begin
acmStreamClose(FAcmStream, 0);
result := false;
end;
end;
procedure TAudioConverting.Close;
var
I: integer;
begin
if FAcmStream = 0 then exit;
FStreamHeader.cbSrcLength := MaxAudioInputSize;
FStreamHeader.cbDstLength := MaxAudioOutputSize;
acmStreamUnPrepareHeader(FAcmStream, FStreamHeader, 0);
for i := 0 to 10 do
begin
if acmStreamClose(FAcmStream, 0) <> ACMERR_BUSY then break;
sleep(200);
end;
FAcmStream := 0;
end;
procedure TAudioConverting.ConvertData(InputData: pchar; InputSize: DWORD; var
OutputData: pchar; var OutputSize: DWORD);
begin
OutputData := nil;
OutputSize := 0;
if (InputSize = 0) or (InputData = nil) then exit;
Move(InputData^, FInputbuf[0], InputSize);
FStreamHeader.pbSrc := @FInputBuf[0];
FStreamHeader.cbSrcLength := InputSize;
if acmStreamConvert(FAcmStream, FStreamHeader, 0) = 0 then
begin
OutputData := @FOutputBuf[0];
OutputSize := FStreamHeader.cbDstLengthUsed;
end;
end;
uj5u.com熱心網友回復:
使用 PCM 格式錄音(WAVIN) 然后轉為GSM610更改一下,是用GSM610 WaveIn錄制的資料
uj5u.com熱心網友回復:
有噪音是你的緩沖區大小沒設定合適,這個必須得自己根據實際情況調整,比較麻煩,只有挨著試。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/140881.html
