Flutter音频处理插件oboe的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter音频处理插件oboe的使用

oboe 是一个优雅的状态管理库。从名字到使用方式都非常简洁。其描述只需要两张截图:

特性

  • oboe 不需要在根部件中使用 Provider
  • oboe 使用 memo 来拦截更新,类似于 react.Hooks
  • oboe 非常小巧且易于使用,仅包含两个API:obnext

安装 oboe

修改 pubspec.yaml 文件:

dependencies:
  oboe:

整体解释

实例化一个 User 类,继承自 Oboe

// 定义 Oboe
class User extends Oboe {
  String name = "dog";
  int age = 0;

  void changeName(String newName) {
    name = newName;
  }

  void add() {
    age++;
  }
}

// 实例化,使用一些部件
var user = User();

订阅并返回一个部件:

user.ob(() => Text(user.name));

提交并更新 user.ob 的订阅:

user.next();

更好的性能

使用 memo 选项参数,类似于 React.useMemo,仅在 memo 数组中的数据变化时重新渲染。

示例仅在 user.name 变化时重新渲染:

user.ob(
  () => Text(user.name), 
  memo: () => [user.name],
);

示例代码

以下是一个完整的示例代码,展示了如何使用 oboe 插件来管理状态:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Hello"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(
                'You have pushed the button this many times:',
              ),
              user.ob(() => Text(user.age.toString())), // 显示年龄
              user.ob(() => Text(user.name)), // 显示名字
              TextField(
                onChanged: (text) => user.changeName(text), // 更新名字
              )
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () => user.add(), // 增加年龄
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter项目中,虽然Oboe本身是一个专为Android设计的C++音频处理库,用于高性能音频应用,但直接在Flutter中使用Oboe涉及到一些原生代码集成。以下是一个基本的示例,展示如何在Flutter项目中集成并使用Oboe进行音频处理。

步骤 1: 创建Flutter项目

首先,创建一个新的Flutter项目。如果你已经有一个现有的项目,可以跳过这一步。

flutter create oboe_flutter_example
cd oboe_flutter_example

步骤 2: 添加平台通道

由于Oboe是原生库,我们需要通过平台通道(Platform Channel)在Flutter和原生代码之间进行通信。

android/app/src/main/java/com/example/oboe_flutter_example/ 下创建 OboePlugin.java

package com.example.oboe_flutter_example;

import android.content.Context;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;

public class OboePlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
    private MethodChannel channel;
    private Context applicationContext;

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
        applicationContext = flutterPluginBinding.getApplicationContext();
        channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "oboe_channel");
        channel.setMethodCallHandler(this);
    }

    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
        if (call.method.equals("startAudio")) {
            // 这里调用Oboe的启动音频流的代码
            // 例如:startOboeAudioStream();
            result.success("Audio started");
        } else {
            result.notImplemented();
        }
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        channel.setMethodCallHandler(null);
    }

    @Override
    public void onAttachedToActivity(ActivityPluginBinding binding) {
        // 可以在这里处理Activity相关的事件
    }

    @Override
    public void onDetachedFromActivityForConfigChanges() {
        // 可以在这里处理配置变化时的事件
    }

    @Override
    public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {
        // 可以在这里处理重新附加到Activity时的事件
    }

    @Override
    public void onDetachedFromActivity() {
        // 可以在这里处理Activity销毁时的事件
    }

    // 这里添加实际的Oboe音频流启动代码
    private void startOboeAudioStream() {
        // 示例代码,具体实现需要参考Oboe官方文档
        // ...
    }
}

修改 MainActivity.ktMainActivity.java 以注册插件

如果你使用的是Kotlin:

package com.example.oboe_flutter_example

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        flutterEngine.plugins.add(OboePlugin())
    }
}

如果你使用的是Java:

package com.example.oboe_flutter_example;

import io.flutter.embedding.android.FlutterActivity;

public class MainActivity extends FlutterActivity {
    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        flutterEngine.getPlugins().add(new OboePlugin());
    }
}

步骤 3: 在Flutter中调用原生方法

lib/ 目录下创建或修改 main.dart 文件,添加对平台通道的调用。

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

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

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

class _MyAppState extends State<MyApp> {
  static const platform = MethodChannel('oboe_channel');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Oboe Flutter Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _startAudio,
            child: Text('Start Audio'),
          ),
        ),
      ),
    );
  }

  Future<void> _startAudio() async {
    try {
      final String result = await platform.invokeMethod('startAudio');
      print(result);
    } on PlatformException catch (e) {
      print("Failed to invoke: '${e.message}'.");
    }
  }
}

步骤 4: 实现Oboe音频流

OboePlugin.javastartOboeAudioStream 方法中,你需要实现具体的Oboe音频流启动代码。这部分涉及到Oboe库的详细使用,建议参考Oboe的官方文档和示例代码。

由于Oboe是一个复杂的库,上述代码仅展示了如何在Flutter和原生代码之间建立通信,并启动一个占位符方法。实际项目中,你需要根据Oboe的API来实现音频流的创建、数据处理和释放。

注意

  • Oboe库的使用需要对C++和Android音频系统有一定的了解。
  • 在实际项目中,可能需要处理更多的音频格式、错误处理和资源管理。
  • 确保在 build.gradle 文件中添加了Oboe库的依赖项。

这个示例代码提供了一个基础框架,你可以根据具体需求进行扩展和修改。

回到顶部