Flutter音视频原始数据处理插件agora_rtc_rawdata的使用

Flutter音视频原始数据处理插件agora_rtc_rawdata的使用

重要

该插件仅导出了四个方法到Dart层,用于注册或注销观察者。

class AgoraRtcRawdata {
  static const MethodChannel _channel =
      const MethodChannel('agora_rtc_rawdata');

  static Future<void> registerAudioFrameObserver(int engineHandle) {
    return _channel.invokeMethod('registerAudioFrameObserver', engineHandle);
  }

  static Future<void> unregisterAudioFrameObserver() {
    return _channel.invokeMethod('registerAudioFrameObserver');
  }

  static Future<void> registerVideoFrameObserver(int engineHandle) {
    return _channel.invokeMethod('registerVideoFrameObserver', engineHandle);
  }

  static Future<void> unregisterVideoFrameObserver() {
    return _channel.invokeMethod('unregisterVideoFrameObserver');
  }
}

插件默认会改变视频流的颜色:

  • 本地视频变为绿色
  • 远程视频变为粉色

你可以在以下位置找到代码:

如果你能用C++编程,建议在C++层处理原始数据以提高性能并移除关于调用Android和iOS的代码。

你可以在以下位置找到代码:

安装

你应该fork此仓库,并修改代码以实现你的需求,例如使用第三方美颜SDK。

使用

import 'package:agora_rtc_engine/rtc_engine.dart';
import 'package:agora_rtc_rawdata/agora_rtc_rawdata.dart';

_initEngine() async {
  var engine = await RtcEngine.create(config.appId);
  await AgoraRtcRawdata.registerAudioFrameObserver(
      await engine.getNativeHandle());
  await AgoraRtcRawdata.registerVideoFrameObserver(
      await engine.getNativeHandle());
}

资源

许可证

MIT


示例代码

import 'dart:developer';

import 'package:agora_rtc_engine/rtc_engine.dart';
import 'package:agora_rtc_engine/rtc_local_view.dart' as RtcLocalView;
import 'package:agora_rtc_engine/rtc_remote_view.dart' as RtcRemoteView;
import 'package:agora_rtc_rawdata/agora_rtc_rawdata.dart';
import 'package:agora_rtc_rawdata_example/config/agora.config.dart' as config;
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

class _MyAppState extends State<MyApp> {
  late RtcEngine engine;
  bool startPreview = false, isJoined = false;
  List<int> remoteUid = [];

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

  [@override](/user/override)
  void dispose() {
    super.dispose();
    this._deinitEngine();
  }

  _initEngine() async {
    if (defaultTargetPlatform == TargetPlatform.android) {
      await [Permission.microphone, Permission.camera].request();
    }

    engine = await RtcEngine.create(config.appId);
    engine.setEventHandler(
        RtcEngineEventHandler(joinChannelSuccess: (channel, uid, elapsed) {
      log('joinChannelSuccess $channel $uid $elapsed');
      setState(() {
        isJoined = true;
      });
    }, userJoined: (uid, elapsed) {
      log('userJoined  $uid $elapsed');
      setState(() {
        remoteUid.add(uid);
      });
    }, userOffline: (uid, reason) {
      log('userJoined  $uid $reason');
      setState(() {
        remoteUid.removeWhere((element) => element == uid);
      });
    }));
    await engine.enableVideo();
    await engine.startPreview();
    setState(() {
      startPreview = true;
    });
    var handle = await engine.getNativeHandle();
    if (handle != null) {
      await AgoraRtcRawdata.registerAudioFrameObserver(handle);
      await AgoraRtcRawdata.registerVideoFrameObserver(handle);
    }
    await engine.joinChannel(config.token, config.channelId, null, config.uid);
  }

  _deinitEngine() async {
    await AgoraRtcRawdata.unregisterAudioFrameObserver();
    await AgoraRtcRawdata.unregisterVideoFrameObserver();
    await engine.destroy();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Stack(
          children: [
            if (startPreview) RtcLocalView.SurfaceView(),
            Align(
              alignment: Alignment.topLeft,
              child: SingleChildScrollView(
                scrollDirection: Axis.horizontal,
                child: Row(
                  children: List.of(remoteUid.map(
                    (e) => Container(
                      width: 120,
                      height: 120,
                      child: RtcRemoteView.SurfaceView(
                        uid: e,
                        channelId: config.channelId,
                      ),
                    ),
                  )),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}

更多关于Flutter音视频原始数据处理插件agora_rtc_rawdata的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音视频原始数据处理插件agora_rtc_rawdata的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


agora_rtc_rawdata 是 Agora 提供的一个 Flutter 插件,用于处理原始音视频数据。通过这个插件,开发者可以在 Flutter 应用中获取到音视频的原始数据,并进行自定义处理,例如添加滤镜、音频混音、视频水印等。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  agora_rtc_engine: ^4.x.x # 确保使用兼容的版本
  agora_rtc_rawdata: ^1.x.x # 添加 rawdata 插件

然后运行 flutter pub get 来安装依赖。

初始化插件

在使用 agora_rtc_rawdata 之前,你需要初始化 Agora RTC Engine 和 RawData 插件。

import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:agora_rtc_rawdata/agora_rtc_rawdata.dart';

void initializeAgora() async {
  // 初始化 Agora RTC Engine
  await RtcEngine.create('your_app_id');

  // 初始化 Agora RawData 插件
  AgoraRtcRawData rawDataPlugin = AgoraRtcRawData();
  await rawDataPlugin.initialize();
}

注册音视频数据回调

通过 agora_rtc_rawdata 插件,你可以注册回调函数来处理原始的音视频数据。

处理原始音频数据

rawDataPlugin.registerAudioFrameObserver(
  onRecordAudioFrame: (AudioFrame frame) {
    // 处理录制的音频帧
    print('Recorded audio frame: ${frame.buffer}');
  },
  onPlaybackAudioFrame: (AudioFrame frame) {
    // 处理播放的音频帧
    print('Playback audio frame: ${frame.buffer}');
  },
  onMixedAudioFrame: (AudioFrame frame) {
    // 处理混音后的音频帧
    print('Mixed audio frame: ${frame.buffer}');
  },
);

处理原始视频数据

rawDataPlugin.registerVideoFrameObserver(
  onCaptureVideoFrame: (VideoFrame frame) {
    // 处理捕获的视频帧
    print('Captured video frame: ${frame.buffer}');
  },
  onRenderVideoFrame: (VideoFrame frame) {
    // 处理渲染的视频帧
    print('Rendered video frame: ${frame.buffer}');
  },
);

启动音视频流

在注册了回调之后,你可以启动音视频流,开始接收原始数据。

void startStreaming() async {
  // 加入频道
  await RtcEngine.joinChannel('your_token', 'your_channel_id', null, 0);

  // 启动本地视频预览
  await RtcEngine.startPreview();
}

处理音视频数据

在回调函数中,你可以对原始音视频数据进行处理。例如,你可以对视频帧应用滤镜,或者对音频帧进行混音。

rawDataPlugin.registerVideoFrameObserver(
  onCaptureVideoFrame: (VideoFrame frame) {
    // 对视频帧应用滤镜
    applyFilter(frame.buffer);
  },
);

rawDataPlugin.registerAudioFrameObserver(
  onRecordAudioFrame: (AudioFrame frame) {
    // 对音频帧进行混音
    mixAudio(frame.buffer);
  },
);

释放资源

在应用退出或不再需要处理原始数据时,记得释放资源。

void releaseResources() async {
  // 离开频道
  await RtcEngine.leaveChannel();

  // 释放 Agora RTC Engine
  await RtcEngine.destroy();

  // 释放 Agora RawData 插件
  await rawDataPlugin.release();
}
回到顶部