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

37 lines
866 B
Dart

import 'dart:typed_data';
enum G711Type {
uLaw,
aLaw,
}
class G711Decoder {
Uint8List g711Encode(Uint8List pcmData, G711Type g711Type) {
List<int> g711Data = [];
for (int sample in pcmData) {
int sign = (sample < 0) ? 0x80 : 0;
int magnitude = (sample < 0) ? -sample : sample;
int exponent = 7;
while (magnitude < (1 << exponent) && exponent > 0) {
exponent--;
}
int mantissa = (magnitude >> (exponent - 4)) & 0x0F;
if (g711Type == G711Type.uLaw) {
// μ-law encoding
int value = ~(sign | ((exponent << 4) & 0x70) | (mantissa >> 4));
g711Data.add(value & 0xFF);
} else {
// A-law encoding
int value = sign | ((exponent << 4) & 0x70) | (mantissa >> 4);
g711Data.add(value & 0xFF);
}
}
return Uint8List.fromList(g711Data);
}
}