From 143ccd69bde4b1269c55d5df9ab2773f88bc8963 Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Thu, 21 Dec 2023 17:41:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Epcm=E8=BD=AC711=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/lib/talk/call/g711Encode.dart | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) 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; + } }