Flutter WebRTC扩展插件dart_webrtc_plus的使用

Flutter WebRTC扩展插件dart_webrtc_plus的使用

dart-webrtc_plus

dart-webrtc_plus 是一个用 Dart 封装的 WebRTC 接口。它通过 dart/js 库重新封装了浏览器中的 WebRTC JS 接口,以适配常见的浏览器。

该库将用于 flutter-webrtc 的 Flutter Web 插件。


编译 E2EE worker

要编译 E2EE worker,可以运行以下命令:

dart compile js ./lib/src/e2ee.worker/e2ee.worker.dart -o web/e2ee.worker.dart.js

如何开发

以下是开发 dart-webrtc_plus 的步骤:

  1. 克隆仓库并进入目录:

    git clone https://github.com/flutter-webrtc/dart-webrtc_plus && cd dart-webrtc_plus
    
  2. 获取依赖项:

    dart pub get
    
  3. 激活全局工具 webdev

    dart pub global activate webdev
    
  4. 启动开发服务器并启用自动刷新:

    webdev serve --auto=refresh
    

完整示例 DEMO

以下是一个完整的 Flutter Web 示例,展示如何使用 dart_webrtc_plus 实现一个简单的 WebRTC 视频通话功能。

1. 创建 Flutter Web 项目

首先,创建一个新的 Flutter Web 项目:

flutter create web_rtc_example
cd web_rtc_example

2. 添加依赖

pubspec.yaml 文件中添加 dart_webrtc_plus 依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_webrtc_plus: ^0.1.0 # 确保版本号与最新版本匹配

然后运行以下命令安装依赖:

flutter pub get

3. 编写代码

lib/main.dart 中编写以下代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: RTCVideoPage(),
    );
  }
}

class RTCVideoPage extends StatefulWidget {
  @override
  _RTCVideoPageState createState() => _RTCVideoPageState();
}

class _RTCVideoPageState extends State<RTCVideoPage> {
  late RTCPeerConnection _peerConnection;
  MediaStream? _localStream;

  @override
  void initState() {
    super.initState();
    initializeWebRTC();
  }

  Future<void> initializeWebRTC() async {
    // 创建本地流
    final mediaConstraints = {"audio": true, "video": true};
    _localStream = await navigator.mediaDevices.getUserMedia(mediaConstraints);

    // 创建 RTCPeerConnection
    final configuration = {"iceServers": [{"urls": ["stun:stun.l.google.com:19302"]}]};
    _peerConnection = await createPeerConnection(configuration);

    // 添加本地流到 PeerConnection
    _peerConnection.addTrack(_localStream!.getTracks()[0]);
    _peerConnection.addTrack(_localStream!.getTracks()[1]);

    // 设置远程流监听器
    _peerConnection.onTrack = (event) {
      print("Remote track added");
      setState(() {
        _localStream?.addTrack(event.track);
      });
    };
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebRTC Example'),
      ),
      body: Center(
        child: _localStream == null
            ? CircularProgressIndicator()
            : RTCVideoView(_localStream!),
      ),
    );
  }

  @override
  void dispose() {
    _localStream?.getTracks().forEach((track) => track.stop());
    _peerConnection.close();
    super.dispose();
  }
}

4. 运行应用

确保你已经启用了 Flutter Web 支持,然后运行以下命令:

flutter run -d chrome

更多关于Flutter WebRTC扩展插件dart_webrtc_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter WebRTC扩展插件dart_webrtc_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dart_webrtc_plus 是一个 Flutter 插件,用于在 Flutter 应用中实现 WebRTC 功能。它是对 dart_webrtc 插件的增强版本,提供了更多的功能和更好的兼容性。以下是如何在 Flutter 项目中使用 dart_webrtc_plus 的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 dart_webrtc_plus 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  dart_webrtc_plus: ^0.9.0  # 请检查最新版本

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

2. 导入插件

在你的 Dart 文件中导入 dart_webrtc_plus 插件。

import 'package:dart_webrtc_plus/dart_webrtc_plus.dart';

3. 初始化 WebRTC

在使用 WebRTC 功能之前,你需要初始化 WebRTC。

void initWebRTC() async {
  await WebRTC.initialize();
}

4. 创建本地和远程视频轨道

你可以使用 MediaStreamMediaStreamTrack 来创建本地和远程视频轨道。

Future<MediaStream> createLocalStream() async {
  final Map<String, dynamic> mediaConstraints = {
    "audio": true,
    "video": {
      "mandatory": {
        "minWidth": '640',
        "minHeight": '480',
        "minFrameRate": '30',
      },
      "optional": [],
    }
  };

  return await navigator.mediaDevices.getUserMedia(mediaConstraints);
}

5. 创建 RTCPeerConnection

RTCPeerConnection 是 WebRTC 的核心,用于管理对等连接。

final Map<String, dynamic> configuration = {
  "iceServers": [
    {"url": "stun:stun.l.google.com:19302"},
  ]
};

RTCPeerConnection peerConnection = await createPeerConnection(configuration);

6. 添加 ICE 候选

ICE 候选用于建立对等连接。你可以通过监听 onIceCandidate 事件来获取 ICE 候选。

peerConnection.onIceCandidate = (RTCIceCandidate candidate) {
  // 发送候选到远程对等端
};

7. 创建和设置本地和远程描述

你需要创建和设置本地和远程的 SDP 描述。

RTCSessionDescription offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);

// 接收远程描述
RTCSessionDescription remoteDescription = ...;
await peerConnection.setRemoteDescription(remoteDescription);

8. 处理媒体流

你可以将本地和远程的媒体流绑定到 RTCVideoRenderer 上以显示视频。

final localRenderer = RTCVideoRenderer();
final remoteRenderer = RTCVideoRenderer();

await localRenderer.initialize();
await remoteRenderer.initialize();

localRenderer.srcObject = localStream;
remoteRenderer.srcObject = remoteStream;

9. 清理资源

在不需要使用 WebRTC 时,记得清理资源。

void dispose() {
  localRenderer.dispose();
  remoteRenderer.dispose();
  peerConnection.close();
}

10. 完整示例

以下是一个简单的完整示例,展示了如何使用 dart_webrtc_plus 进行视频通话。

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

class WebRTCPage extends StatefulWidget {
  @override
  _WebRTCPageState createState() => _WebRTCPageState();
}

class _WebRTCPageState extends State<WebRTCPage> {
  late RTCPeerConnection peerConnection;
  late RTCVideoRenderer localRenderer;
  late RTCVideoRenderer remoteRenderer;
  MediaStream? localStream;
  MediaStream? remoteStream;

  @override
  void initState() {
    super.initState();
    initWebRTC();
  }

  Future<void> initWebRTC() async {
    await WebRTC.initialize();
    localRenderer = RTCVideoRenderer();
    remoteRenderer = RTCVideoRenderer();
    await localRenderer.initialize();
    await remoteRenderer.initialize();

    localStream = await createLocalStream();
    localRenderer.srcObject = localStream;

    final Map<String, dynamic> configuration = {
      "iceServers": [
        {"url": "stun:stun.l.google.com:19302"},
      ]
    };

    peerConnection = await createPeerConnection(configuration);

    peerConnection.onIceCandidate = (RTCIceCandidate candidate) {
      // 发送候选到远程对等端
    };

    peerConnection.onAddStream = (MediaStream stream) {
      setState(() {
        remoteRenderer.srcObject = stream;
      });
    };

    RTCSessionDescription offer = await peerConnection.createOffer();
    await peerConnection.setLocalDescription(offer);

    // 接收远程描述
    // RTCSessionDescription remoteDescription = ...;
    // await peerConnection.setRemoteDescription(remoteDescription);
  }

  Future<MediaStream> createLocalStream() async {
    final Map<String, dynamic> mediaConstraints = {
      "audio": true,
      "video": {
        "mandatory": {
          "minWidth": '640',
          "minHeight": '480',
          "minFrameRate": '30',
        },
        "optional": [],
      }
    };

    return await navigator.mediaDevices.getUserMedia(mediaConstraints);
  }

  @override
  void dispose() {
    localRenderer.dispose();
    remoteRenderer.dispose();
    peerConnection.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebRTC Example'),
      ),
      body: Column(
        children: [
          Expanded(
            child: RTCVideoView(localRenderer),
          ),
          Expanded(
            child: RTCVideoView(remoteRenderer),
          ),
        ],
      ),
    );
  }
}

11. 运行项目

确保你已经配置好了 Flutter 开发环境,然后运行项目:

flutter run
回到顶部