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');
}
}
插件默认会改变视频流的颜色:
- 本地视频变为绿色
- 远程视频变为粉色
你可以在以下位置找到代码:
- Android: AgoraRtcRawdataPlugin.kt
- 本地视频:
onCaptureVideoFrame
- 远程视频:
onRenderVideoFrame
- 本地视频:
- iOS: AgoraRawdata.swift
- 本地视频:
onCapture
- 远程视频:
onRenderVideoFrame
- 本地视频:
如果你能用C++编程,建议在C++层处理原始数据以提高性能并移除关于调用Android和iOS的代码。
你可以在以下位置找到代码:
- 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());
}
资源
- 文档 用于
agora_rtc_engine
- Android原始视频数据文档
- iOS原始视频数据文档
许可证
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
更多关于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();
}