Browse Source

channels of publisher

Melon 2 years ago
parent
commit
a4df9b84d5

+ 6 - 6
lib/base/player.dart

@@ -12,16 +12,16 @@ abstract class BasePlayer implements IPlayer {
   final BaseRoom room;
 
   BasePlayer({required this.room}) {
-    channelAdded = FEventHandler<BaseChannel>();
-    channelRemoved = FEventHandler<BaseChannel>();
+    channelAdded = FEventHandler<BasePlayChannel>();
+    channelRemoved = FEventHandler<BasePlayChannel>();
     _listenMembers();
   }
 
   @override
-  late final FEventHandler<IChannel> channelAdded;
+  late final FEventHandler<IPlayChannel> channelAdded;
 
   @override
-  late final FEventHandler<IChannel> channelRemoved;
+  late final FEventHandler<IPlayChannel> channelRemoved;
 
   void _listenMembers() {
     final members = [room.localMember, ...room.remoteMembers];
@@ -44,12 +44,12 @@ abstract class BasePlayer implements IPlayer {
   }
 
   void _onMemberChannelAdded(Object _, BaseChannel channel) {
-    channelAdded.emit(this, channel);
+    channelAdded.emit(this, channel as BasePlayChannel);
   }
 
   void _onMemberChannelRemoved(Object _, BaseChannel channel) {
     // channel.stop() //TODO:
-    channelRemoved.emit(this, channel);
+    channelRemoved.emit(this, channel as BasePlayChannel);
   }
 
   void _listenMember(BaseMember member) {

+ 4 - 4
lib/base/room.dart

@@ -9,7 +9,7 @@ import '../interface/room.dart';
 
 /// 会话房间
 abstract class BaseRoom implements IRoom {
-  final List<BaseMember> _remoteMembers = [];
+  final List<RemoteMember> _remoteMembers = [];
   late final String _roomId;
   late IMember _localMember;
   bool _isEntered = false;
@@ -29,7 +29,7 @@ abstract class BaseRoom implements IRoom {
   }
 
   @override
-  UnmodifiableListView<BaseMember> get remoteMembers =>
+  UnmodifiableListView<RemoteMember> get remoteMembers =>
       UnmodifiableListView(_remoteMembers);
 
   @override
@@ -67,12 +67,12 @@ abstract class BaseRoom implements IRoom {
   }
 
   @protected
-  void addMember(BaseMember member) {
+  void addMember(RemoteMember member) {
     _remoteMembers.add(member);
   }
 
   @protected
-  void removeMember(BaseMember member) {
+  void removeMember(RemoteMember member) {
     _remoteMembers.remove(member);
   }
 

+ 4 - 4
lib/implementations/trtc/player.dart

@@ -18,12 +18,12 @@ class TrtcPlayer extends BasePlayer with TrtcClientGetterMixin {
   }
 
   @override
-  UnmodifiableListView<IChannel> get channels => _combinChannels();
+  UnmodifiableListView<IPlayChannel> get channels => _combinChannels();
 
-  UnmodifiableListView<BaseChannel> _combinChannels() {
-    final arr = <BaseChannel>[];
+  UnmodifiableListView<BasePlayChannel> _combinChannels() {
+    final arr = <BasePlayChannel>[];
     for (var member in room.remoteMembers) {
-      arr.addAll(member.channels);
+      arr.addAll(member.channels.map((e) => e as BasePlayChannel));
     }
     return UnmodifiableListView(arr);
   }

+ 36 - 30
lib/implementations/trtc/publisher.dart

@@ -1,9 +1,11 @@
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:fis_common/logger/logger.dart';
 import 'package:fis_lib_media_rt/implementations/trtc/channel.dart';
 import 'package:fis_lib_media_rt/implementations/trtc/resolutions.dart';
 import 'package:fis_lib_media_rt/implementations/trtc/room.dart';
+import 'package:fis_lib_media_rt/interface/channel.dart';
 import 'package:fis_lib_media_rt/interface/enums.dart';
 import 'package:flutter/foundation.dart';
 import 'package:tencent_trtc_cloud/trtc_cloud_def.dart';
@@ -12,7 +14,6 @@ import 'package:tencent_trtc_cloud/trtc_cloud_listener.dart';
 import '../../base/publisher.dart';
 import '../../interface/publisher.dart';
 import 'client_getter_mixin.dart';
-import 'player.dart';
 
 class TrtcPublisher extends BasePublisher with TrtcClientGetterMixin {
   // ignore: non_constant_identifier_names
@@ -27,40 +28,41 @@ class TrtcPublisher extends BasePublisher with TrtcClientGetterMixin {
   final quality = TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT;
   final isFrontCamera = true;
   final localViewId = 0;
-  TrtcPublishChannel? _publishChannel;
+  TrtcPublishChannel? get _channel =>
+      room.localMember.channels.first as TrtcPublishChannel;
 
   PublisherProfile? _profile;
 
   TrtcPublisher({required super.room}) {
     _trtcRoom = room as TrtcRoom;
+    _buildPreviewChannel();
   }
 
   late TrtcRoom _trtcRoom;
 
+  @override
+  UnmodifiableListView<IPublishChannel> get channels => UnmodifiableListView(
+      room.localMember.channels.map((e) => e as IPublishChannel));
+
   @override
   Future<void> startLocal() async {
     try {
-      _buildPreviewChannel();
-      if (isOpenMic) {
-        if (kIsWeb) {
-          // _trtcRoom.events.once(
-          //   TRTCCloudListener.onStreamPublish,
-          //   (param) async {
-          //     if (param == 0) {
-          //       await client
-          //           .startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT);
-          //       print('🎉Mic Capture Started');
-          //     }
-          //   },
-          // );
-        } else {
-          await client.startLocalAudio(quality);
-        }
+      // _buildPreviewChannel();
+      if (kIsWeb) {
+        _trtcRoom.events.once(
+          TRTCCloudListener.onStreamPublish,
+          (param) async {
+            if (param == 0) {
+              await client
+                  .startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT);
+              print('🎉Mic Capture Started');
+            }
+          },
+        );
+      } else {
+        await client.startLocalAudio(quality);
       }
-      if (isOpenCamera) {
-        // TODO: set mute state of video & audio
-      }
-      room.localMember.addChannel(_publishChannel!);
+      _channel!.isPreviewing = true;
     } catch (e) {
       logger.e("[TrtcPublisher] start local preview error", e);
     }
@@ -69,9 +71,10 @@ class TrtcPublisher extends BasePublisher with TrtcClientGetterMixin {
   @override
   Future<void> stopLocal() async {
     try {
-      _removePreviewChannel();
-      await client.stopLocalAudio(); //await client.muteLocalAudio(isMute);
+      await client.stopLocalAudio();
       await client.stopLocalPreview();
+      _channel!.isPreviewing = false;
+      // _removePreviewChannel();
     } catch (e) {
       logger.e("[TrtcPublisher] stop local preview error", e);
     }
@@ -89,25 +92,28 @@ class TrtcPublisher extends BasePublisher with TrtcClientGetterMixin {
         C_BITRATE_RANGE[currProfile.resolution]?.defaultBitrate ??
         900;
 
-    _buildPreviewChannel();
-    _publishChannel!.videoEncParam = TRTCVideoEncParam(
+    // _buildPreviewChannel();
+    _channel!.videoEncParam = TRTCVideoEncParam(
       videoFps: currProfile.frameRate,
       videoResolution: resolution,
       videoBitrate: bitrate,
       videoResolutionMode: currProfile.resolutionMode.index,
     );
 
-    client.setVideoEncoderParam(_publishChannel!.videoEncParam!);
+    client.setVideoEncoderParam(_channel!.videoEncParam!);
     print('✨Changed Resolution to 480P');
   }
 
   void _buildPreviewChannel() {
-    _publishChannel ??= TrtcPublishChannel(member: room.localMember);
+    if (channels.isEmpty) {
+      final channel = TrtcPublishChannel(member: room.localMember);
+      room.localMember.addChannel(channel);
+    }
   }
 
   void _removePreviewChannel() {
-    if (_publishChannel != null) {
-      room.localMember.removeChannel(_publishChannel!);
+    if (channels.isNotEmpty) {
+      room.localMember.clearChannels(); //TODO: 目前只有主画面的
     }
   }
 

+ 3 - 3
lib/interface/player.dart

@@ -7,11 +7,11 @@ import 'channel.dart';
 /// 播放器
 abstract class IPlayer {
   /// 播放频道集合
-  UnmodifiableListView<IChannel> get channels;
+  UnmodifiableListView<IPlayChannel> get channels;
 
   /// 频道增加事件
-  late final FEventHandler<IChannel> channelAdded;
+  late final FEventHandler<IPlayChannel> channelAdded;
 
   /// 频道移除事件
-  late final FEventHandler<IChannel> channelRemoved;
+  late final FEventHandler<IPlayChannel> channelRemoved;
 }

+ 7 - 0
lib/interface/publisher.dart

@@ -1,6 +1,13 @@
+import 'dart:collection';
+
+import 'package:fis_lib_media_rt/interface/channel.dart';
+
 import 'enums.dart';
 
 abstract class IPublisher {
+  /// 推流通道集合
+  UnmodifiableListView<IPublishChannel> get channels;
+
   Future<void> setProfile(PublisherProfile profile);
   Future<void> startLocal();
   Future<void> stopLocal();