app-starlock/star_lock/lib/talk/call/g711Decoder.dart
Daisy 21d7902b7f 修改G711解码方式
新增G711编码类
2023-12-21 11:59:10 +08:00

37 lines
887 B
Dart

import 'dart:typed_data';
enum G711Type {
uLaw,
aLaw,
}
class G711Decoder {
Uint8List g711Decode(Uint8List g711Data, G711Type g711Type) {
List<int> pcmData = [];
int sign, exponent, mantissa, sample;
for (int i = 0; i < g711Data.length; i++) {
int value = g711Data[i];
if (g711Type == G711Type.uLaw) {
// μ-law decoding
value = ~value & 0xFF;
sign = (value & 0x80) == 0 ? 1 : -1;
exponent = (value & 0x70) >> 4;
mantissa = ((value & 0x0F) << 4) + 0x10;
sample = (mantissa << exponent) * sign;
} else {
// A-law decoding
sign = (value & 0x80) == 0 ? 1 : -1;
exponent = ((value & 0x70) >> 4) + 1;
mantissa = (value & 0x0F) + 0x10;
sample = (mantissa << exponent) * sign;
}
pcmData.add(sample);
}
return Uint8List.fromList(pcmData);
}
}