diff --git a/star_lock/lib/talk/call/g711Encode.dart b/star_lock/lib/talk/call/g711Encode.dart index 5369a366..3c004a3c 100644 --- a/star_lock/lib/talk/call/g711Encode.dart +++ b/star_lock/lib/talk/call/g711Encode.dart @@ -33,4 +33,37 @@ class G711Decoder { return Uint8List.fromList(g711Data); } + + List pcm16ToG711u(List pcm16Data) { + List g711uData = []; + + for (int i = 0; i < pcm16Data.length; i += 2) { + int pcmSample = (pcm16Data[i + 1] << 8) | pcm16Data[i]; + int g711Sample = pcmToG711u(pcmSample); + + // 将 G.711 样本拆分成两个字节 + g711uData.add(g711Sample & 0xFF); + g711uData.add((g711Sample >> 8) & 0xFF); + } + + return g711uData; + } + + int pcmToG711u(int pcmSample) { + const int MULAW_BIAS = 0x84; + const int CLIP = 32635; + + // 剪裁 PCM 样本 + if (pcmSample > CLIP) { + pcmSample = CLIP; + } else if (pcmSample < -CLIP) { + pcmSample = -CLIP; + } + + // 增加偏置并取反 + pcmSample += MULAW_BIAS; + pcmSample = ~pcmSample & 0xFF; + + return pcmSample; + } }