Flutter实时音视频通信插件tencent_rtc_sdk的使用

Flutter实时音视频通信插件tencent_rtc_sdk的使用

利用腾讯21年的网络和音视频技术经验,Tencent Real-Time Communication (TRTC) 提供了群组音频/视频通话和低延迟互动直播解决方案。借助TRTC,您可以快速开发出成本效益高、低延迟且高质量的互动音频/视频服务。

Demo 快速开始

请参阅 Demo 快速开始(Flutter)

SDK 快速集成

请参阅 快速集成(Flutter)

SDK 类文件

  • trtc_cloud - 腾讯云TRTC核心功能接口。
  • trtc_cloud_video_view - 提供用于渲染视频的组件 <code>TRTCCloudVideoView</code>
  • tx_audio_effect_manager - 腾讯云音频效果管理模块。
  • tx_device_manager - 腾讯云设备管理模块。
  • trtc_cloud_def - TRTC关键类定义。描述:如分辨率和质量等级等接口化和常量值的定义。
  • trtc_cloud_listener - 腾讯云TRTC事件通知接口。

示例调用

1. 初始化

// 创建 TRTCCloud 单例
trtcCloud = await TRTCCloud.sharedInstance();
// 腾讯云音频效果管理模块
txDeviceManager = trtcCloud.getDeviceManager();
// 腾讯云音频效果管理模块
txAudioManager = trtcCloud.getAudioEffectManager();

2. 进入/退出房间

// 进入房间
trtcCloud.enterRoom(
        TRTCParams(
            sdkAppId: sdkAppId,
            userId: userId,
            userSig: userSig,
            roomId: roomId),
        TRTCCloudDef.TRTC_APP_SCENE_VIDEOCALL);
// 退出房间
trtcCloud.exitRoom();

3. 监听器注册

// 注册监听器
TRTCCloudListener listener = TRTCCloudListener(
    onError: (errorCode, errorMessage) {
      debugPrint("TRTCCloudListener onError errCode:$errCode errMsg: $errMsg");
    }
    // 其他事件...
)
trtcCloud.registerListener(listener);

// 移除监听器
trtcCloud.unRegisterListener(listener);

4. 播放本地视频

// 参数:
// frontCamera: `true`:前置摄像头;`false`:后置摄像头
// viewId: 由 `TRTCCloudVideoView` 生成的视图ID
TRTCCloudVideoView(
    onViewCreated: (viewId) {
      trtcCloud.startLocalPreview(true, viewId);
});

5. 显示远程视频

// 参数:
// userId: 指定远程用户的用户ID
// streamType: 指定要观看的视频流类型
///* 高清大图:TRTCVideoStreamType.big
///* 低清大图:TRTCVideoStreamType.small
// viewId: 由 `TRTCCloudVideoView` 生成的视图ID
TRTCCloudVideoView(
    onViewCreated: (viewId) {
      trtcCloud.startRemoteView(userId, TRTCVideoStreamType.big, viewId);
});

6. 显示远程屏幕共享

// 参数:
// userId: 指定远程用户的用户ID
// streamType: 指定远程用户的视频流类型
///* 子流(屏幕分享):TRTCVideoStreamType.sub
// viewId: 由 `TRTCCloudVideoView` 生成的视图ID
TRTCCloudVideoView(
    onViewCreated: (viewId) {
      trtcCloud.startRemoteView(userId, TRTCVideoStreamType.sub, viewId);
});

如何查看TRTC日志?

TRTC日志默认被压缩并加密,扩展名为XLOG。您可以设置 setLogCompressEnabled 来指定是否加密日志。如果日志文件名包含C(压缩),则日志已压缩加密;如果包含R(原始),则日志为明文。

  • iOS:应用沙盒的 Documents/log 文件夹
  • Android
    • 6.7或以下版本: /sdcard/log/tencent/liteav
    • 6.8或以上版本: /sdcard/Android/data/package name/files/log/tencent/liteav/

完整示例代码

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_foreground_task/flutter_foreground_task.dart';
import 'package:provider/provider.dart';
import 'package:trtc_demo/ui/login.dart';
import 'package:trtc_demo/ui/meeting.dart';
import 'package:trtc_demo/ui/member_list.dart';
import 'package:trtc_demo/ui/test/test_api.dart';
import 'package:trtc_demo/models/meeting_model.dart';

part 'main_ext.dart';

void main() {
  FlutterForegroundTask.initCommunicationPort();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  [@override](/user/override)
  void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((_) {
      // 请求权限并初始化服务。
      ServiceManager()._requestPermissions();
      ServiceManager()._initService();
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => MeetingModel(),
      child: MaterialApp(
        routes: {
          "/": (context) => LoginPage(),
          "/login": (context) => LoginPage(),
          "/meeting": (context) => MeetingPage(),
          "/memberList": (context) => MemberListPage(),
          "/test": (context) => TestPage(),
        },
      ),
    );
  }
}

更多关于Flutter实时音视频通信插件tencent_rtc_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter实时音视频通信插件tencent_rtc_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用 tencent_rtc_sdk 插件在 Flutter 中实现实时音视频通信的基本代码示例。这个示例将涵盖初始化 SDK、加入房间、发布音视频流以及订阅其他用户的音视频流的基本流程。

首先,确保你的 Flutter 项目中已经添加了 tencent_rtc_sdk 依赖。在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  tencent_rtc_sdk: ^最新版本号  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,是主要的代码实现:

main.dart

import 'package:flutter/material.dart';
import 'package:tencent_rtc_sdk/tencent_rtc_sdk.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late TRTCClient _client;
  late String _roomId;
  late String _userId;

  @override
  void initState() {
    super.initState();
    // 初始化 TRTCClient
    _client = TRTCClient();
    _client.setListener(TRTCClientListener());

    // 设置 SDK 相关的配置(例如,AppID)
    var config = TRTCClientConfig();
    config.sdkAppId = '你的SDK_APP_ID'; // 请替换为你的SDK_APP_ID
    _client.init(config);

    // 设置房间ID和用户ID(实际应用中这些值可能来自服务器或其他逻辑)
    _roomId = '123456';
    _userId = 'user_${DateTime.now().millisecondsSinceEpoch}';

    // 加入房间
    _joinRoom();
  }

  Future<void> _joinRoom() async {
    var roomConfig = TRTCRoomConfig();
    roomConfig.roomId = _roomId;
    roomConfig.userId = _userId;

    try {
      await _client.enterRoom(roomConfig);
      print('Joined room: $_roomId');

      // 发布音视频流
      _publishStream();
    } catch (e) {
      print('Failed to join room: $e');
    }
  }

  Future<void> _publishStream() async {
    try {
      var localStream = await _client.createLocalStream();
      await _client.publishLocalStream(localStream);
      print('Published local stream');

      // 订阅远程流(通常在实际应用中,这会在收到远程用户加入房间的通知后进行)
      _client.remoteStreamAdded = (remoteStream) {
        print('Remote stream added');
        // 在这里处理远程流的显示,例如将其添加到 UI 中
      };
    } catch (e) {
      print('Failed to publish stream: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Tencent RTC Demo'),
        ),
        body: Center(
          child: Text('Joining room...'), // 这里可以添加更复杂的 UI,例如显示视频流
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 退出房间并释放资源
    _client.exitRoom();
    _client.unInit();
    super.dispose();
  }
}

class TRTCClientListener extends TRTCClientListenerMixin {
  @override
  void onEnterRoomSuccess(String roomId, int userId, int elapsed) {
    print('Entered room successfully: $roomId, userId: $userId');
  }

  @override
  void onEnterRoomFailed(int code, String message) {
    print('Failed to enter room: $code, $message');
  }

  // 其他回调方法可以根据需要实现
}

注意事项

  1. 权限配置:确保在 Android 和 iOS 项目中配置了必要的音视频权限。
  2. UI 更新:上述示例中未详细处理 UI 更新,实际项目中需要将视频流显示在界面上,可以使用 Texture 或其他方式来实现。
  3. 错误处理:示例中仅简单打印了错误信息,实际项目中应添加更完善的错误处理逻辑。
  4. 信号服务器:实际应用中,房间管理、用户加入/离开通知等通常需要通过信令服务器来实现,这里未涉及信令服务器的部分。

这个示例提供了一个基本的框架,你可以根据实际需求进行扩展和修改。希望这对你有所帮助!

回到顶部