Merge branch 'talk_flutter' of https://gitee.com/starlock-cn/app-starlock into talk_flutter

This commit is contained in:
魏少阳 2023-12-27 17:18:25 +08:00
commit 4e2dfece37

View File

@ -1,8 +1,10 @@
import 'dart:typed_data';
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart';
import 'package:flutter_sound/flutter_sound.dart';
import 'package:star_lock/talk/call/g711.dart';
import 'package:star_lock/talk/call/iFrameInfo.dart';
import 'package:star_lock/talk/udp/udp_talkClass.dart';
import '../../tools/eventBusEventManage.dart';
class CallTalk {
@ -21,7 +23,8 @@ class CallTalk {
var growableList;
bool getFirstFrame = false; //
final FlutterSoundPlayer _audioPlayer = FlutterSoundPlayer();
List<int>? allPcmData = [];
List<int> allPcmData = [];
int _bufferSize = 400; //
CallTalk._init() {
iframe = IframeInfo();
@ -40,35 +43,16 @@ class CallTalk {
if (bb[61] == 1) {
Uint8List g711Data = bb.sublist(77, bb.length);
// // PCM
// Uint8List pcmData = G711Decoder().g711Decode(g711Data, G711Type.uLaw);
// // 使 pcmData
// print('得到的pcmData:$pcmData');
// allPcmData!.addAll(pcmData);
// await Future.delayed(const Duration(seconds: 3));
// _playRawData(allPcmData!);
print('dinglingling bb.length:${g711Data.length} 音频数据来:$g711Data ');
List<int> pcmBytes = Uint8List.fromList([]);
List<int> pcmBytes;
try {
// ALaw Linear
pcmBytes = G711().convertList(g711Data);
allPcmData.addAll(pcmBytes);
// await Future.delayed(const Duration(seconds: 1));
_initializeAudioPlayer(allPcmData);
} catch (e) {
print('Error decoding G.711 to PCM: $e');
}
allPcmData!.addAll(pcmBytes!);
await Future.delayed(const Duration(seconds: 1));
print('PCM decoded data: $pcmBytes');
if (pcmBytes != null) {
_initializeAudioPlayer();
_playRawData(Uint8List.fromList(allPcmData!));
} else {
print('Error decoding G.711 to PCM');
}
}
//
else {
@ -150,23 +134,58 @@ class CallTalk {
}
//
Future<void> _initializeAudioPlayer() async {
await _audioPlayer.openPlayer();
Future<void> _initializeAudioPlayer(List<int> audioData) async {
// _audioPlayer.closePlayer();
_audioPlayer.openPlayer();
// await _audioPlayer
// .setSubscriptionDuration(const Duration(milliseconds: 10));
if (audioData.isNotEmpty) {
//
print('转换pcmBytes数据长度为:${audioData.length}');
// _playRawData(audioData);
playAudioStream(audioData);
} else {
print('Failed to read audio data.');
}
}
Future<void> _playRawData(List<int> rawData) async {
print(
'啊啦啦啦啦啦数据长度为:${G711().convertToInt8ListLittleEndian(rawData).length}, 数据为 ${G711().convertToInt8ListLittleEndian(rawData)}');
await _audioPlayer.startPlayer(
fromDataBuffer: Uint8List.fromList(rawData),
fromDataBuffer: G711().convertToInt8ListLittleEndian(rawData),
codec: Codec.pcm16,
numChannels: 1,
sampleRate: 8000,
whenFinished: () {
print('Finished playing');
},
numChannels: 1,
);
}
Future<void> stopLocalAudio() async {
Future<void> playAudioStream(List<int> audioData) async {
await _audioPlayer
.setSubscriptionDuration(const Duration(milliseconds: 10));
//
await _audioPlayer.startPlayer(
codec: Codec.pcm16,
sampleRate: 8000,
numChannels: 1,
);
//
for (int i = 0; i < audioData.length; i += 320) {
int chunkSize = 320;
if (i + chunkSize > audioData.length) {
chunkSize = audioData.length - i;
}
List<int> chunk = audioData.sublist(i, i + chunkSize);
await _audioPlayer
.feedFromStream(G711().convertToInt8ListLittleEndian(chunk));
}
//
await _audioPlayer.stopPlayer();
}
}