2023-12-22 14:22:34 +08:00
|
|
|
import 'dart:async';
|
2023-12-26 16:30:06 +08:00
|
|
|
import 'package:flutter/services.dart';
|
2023-12-22 14:22:34 +08:00
|
|
|
|
|
|
|
|
class G711 {
|
2023-12-26 16:30:06 +08:00
|
|
|
Future<List<int>> readAssetFile(String assetPath) async {
|
2024-08-21 18:31:19 +08:00
|
|
|
final ByteData data = await rootBundle.load(assetPath);
|
|
|
|
|
final List<int> bytes = data.buffer.asUint8List();
|
2023-12-26 16:30:06 +08:00
|
|
|
return bytes;
|
|
|
|
|
}
|
2023-12-22 14:22:34 +08:00
|
|
|
|
2023-12-26 16:30:06 +08:00
|
|
|
int ALawToLinear(int aVal) {
|
|
|
|
|
// 取反
|
|
|
|
|
aVal = ~aVal;
|
2023-12-22 14:22:34 +08:00
|
|
|
|
2023-12-26 16:30:06 +08:00
|
|
|
// 计算偏移
|
|
|
|
|
int t = ((aVal & 0x0F) << 3) + 0x84;
|
|
|
|
|
t <<= (aVal & 0x70) >> 4;
|
2023-12-22 14:22:34 +08:00
|
|
|
|
2023-12-26 16:30:06 +08:00
|
|
|
// 根据符号位决定返回值的正负
|
|
|
|
|
return (aVal & 0x80) != 0 ? 0x84 - t : t - 0x84;
|
2023-12-22 14:22:34 +08:00
|
|
|
}
|
|
|
|
|
|
2023-12-26 16:34:30 +08:00
|
|
|
//711解码为pcm数据
|
2023-12-26 16:30:06 +08:00
|
|
|
List<int> convertList(List<int> aLawList) {
|
|
|
|
|
// 将 ALawToLinear 函数应用于 List<int>
|
2024-08-21 18:31:19 +08:00
|
|
|
final List<int> linearList = aLawList.map(ALawToLinear).toList();
|
2023-12-26 16:30:06 +08:00
|
|
|
return linearList;
|
|
|
|
|
}
|
2023-12-22 14:22:34 +08:00
|
|
|
|
2023-12-26 16:34:30 +08:00
|
|
|
//List<int>转为Uint8List
|
|
|
|
|
Uint8List convertToInt8ListLittleEndian(List<int> intList) {
|
2024-08-21 18:31:19 +08:00
|
|
|
final List<int> int8List = [];
|
2023-12-22 14:22:34 +08:00
|
|
|
|
2023-12-26 16:34:30 +08:00
|
|
|
for (int intValue in intList) {
|
|
|
|
|
intValue = intValue * 2;
|
|
|
|
|
// 将 int 拆分为两个字节,采用小端序
|
|
|
|
|
int8List.add(intValue & 0xFF); // 低 8 位
|
|
|
|
|
int8List.add((intValue & 0xFF00) >> 8); // 高 8 位
|
2023-12-22 14:22:34 +08:00
|
|
|
}
|
2023-12-26 16:30:06 +08:00
|
|
|
|
2023-12-26 16:34:30 +08:00
|
|
|
return Uint8List.fromList(int8List);
|
|
|
|
|
}
|
2023-12-22 14:22:34 +08:00
|
|
|
}
|