Flutter音频处理插件carp_audio_package的使用

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

Flutter音频处理插件carp_audio_package的使用

pub package pub points github stars MIT License arXiv

此库包含一个用于媒体(音频、视频、图像、噪声)采样的包,以配合 carp_mobile_sensing 包使用。 该包支持以下 Measure 类型:

  • dk.cachet.carp.noise
  • dk.cachet.carp.audio
  • dk.cachet.carp.video
  • dk.cachet.carp.image

由于历史原因,Flutter pub.dev 包的名称为 “audio”,但实际上它是一个 “media” 包,CAMS 包的名称为 MediaSamplingPackage

有关更多文档,请参阅 wiki。有关如何构建 Flutter 移动感知应用的示例,请参阅 CARP Mobile Sensing App

对于其他 CARP 产品的 Flutter 插件,请参阅 CARP Mobile Sensing in Flutter

如果你有兴趣编写自己的 CARP 采样包,请参阅 wiki 上的说明。

安装

要使用此包,请在 pubspec.yaml 文件中添加以下内容。请注意,此包仅与 carp_mobile_sensing 一起工作。

dependencies:
  carp_core: ^latest
  carp_mobile_sensing: ^latest
  carp_audio_package: ^latest
  ...

Android 集成

在你的应用的 AndroidManifest.xml 文件中添加以下内容(位于 android/app/src/main 目录下):

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

iOS 集成

Info.plist 文件中添加以下内容(位于 ios/Runner 目录下):

<key>NSMicrophoneUsageDescription</key>
<string>Uses the microphone to record ambient noise in the phone's environment.</string>
<key>NSCameraUsageDescription</key>
<string>Uses the camera to ....</string>
<key>UIBackgroundModes</key>
  <array>
  <string>audio</string>
  <string>external-accessory</string>
  <string>fetch</string>
  </array>

使用

要使用此包,请将其导入到你的应用中,并与 carp_mobile_sensing 包一起使用:

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_audio_package/media.dart';

在创建并运行研究之前,在 SamplingPackageRegistry 中注册此包:

SamplingPackageRegistry().register(MediaSamplingPackage());

noise 措施是基于事件的,而 audiovideoimage 措施是一次性措施。使用此包中的措施在研究协议中的示例如下:

// 创建一个研究协议
StudyProtocol protocol = StudyProtocol(
  ownerId: 'owner@dtu.dk',
  name: 'Audio Sensing Example',
);

// 定义哪些设备用于数据收集
// 在这种情况下,只有这台智能手机
Smartphone phone = Smartphone();
protocol.addPrimaryDevice(phone);

// 添加一个任务立即开始收集噪音。
protocol.addTaskControl(
    ImmediateTrigger(),
    BackgroundTask(measures: [
      Measure(type: MediaSamplingPackage.NOISE),
    ]),
    phone);

noise 的默认采样配置是每5分钟采样10秒。但可以覆盖此配置:

// 收集噪音,但更改默认的采样配置
protocol.addTaskControl(
    ImmediateTrigger(),
    BackgroundTask(measures: [
      Measure(type: MediaSamplingPackage.NOISE)
        ..overrideSamplingConfiguration = PeriodicSamplingConfiguration(
          interval: const Duration(seconds: 30),
          duration: const Duration(seconds: 5),
        ),
    ]),
    phone);

audio 措施是一次性措施,必须显式启动和停止。示例如下:

// 采样一个音频录制
var audioTask = BackgroundTask(measures: [
  Measure(type: MediaSamplingPackage.AUDIO),
]);

// 在20秒后启动音频任务,在40秒后停止它
protocol
  ..addTaskControl(
    DelayedTrigger(delay: const Duration(seconds: 20)),
    audioTask,
    phone,
    Control.Start,
  )
  ..addTaskControl(
    DelayedTrigger(delay: const Duration(seconds: 40)),
    audioTask,
    phone,
    Control.Stop,
  );

注意,imagevideo 措施不用于后台感知,因此没有相关的探针。这些措施仅用于 AppTask,即用户执行的任务。

示例代码

以下是完整的示例代码:

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_audio_package/media.dart';

/// 这是一个非常简单的示例,展示了如何使用 CARP Mobile Sensing (CAMS) 与此采样包。
/// 注意,下面的代码不会运行。
/// 请参阅文档了解如何使用 CAMS: https://github.com/cph-cachet/carp.sensing-flutter/wiki
void main() async {
  // 注册此采样包
  SamplingPackageRegistry().register(MediaSamplingPackage());

  // 创建一个研究协议
  StudyProtocol protocol = StudyProtocol(
    ownerId: 'owner@dtu.dk',
    name: 'Audio Sensing Example',
  );

  // 定义哪些设备用于数据收集
  // 在这种情况下,只有这台智能手机
  Smartphone phone = Smartphone();
  protocol.addPrimaryDevice(phone);

  // 添加一个任务立即开始收集噪音。
  protocol.addTaskControl(
      ImmediateTrigger(),
      BackgroundTask(measures: [
        Measure(type: MediaSamplingPackage.NOISE),
      ]),
      phone);

  // 收集噪音,但更改默认的采样配置
  protocol.addTaskControl(
      ImmediateTrigger(),
      BackgroundTask(measures: [
        Measure(type: MediaSamplingPackage.NOISE)
          ..overrideSamplingConfiguration = PeriodicSamplingConfiguration(
            interval: const Duration(seconds: 30),
            duration: const Duration(seconds: 5),
          ),
      ]),
      phone);

  // 采样一个音频录制
  var audioTask = BackgroundTask(measures: [
    Measure(type: MediaSamplingPackage.AUDIO),
  ]);

  // 在20秒后启动音频任务,在40秒后停止它
  protocol
    ..addTaskControl(
      DelayedTrigger(delay: const Duration(seconds: 20)),
      audioTask,
      phone,
      Control.Start,
    )
    ..addTaskControl(
      DelayedTrigger(delay: const Duration(seconds: 40)),
      audioTask,
      phone,
      Control.Stop,
    );
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter音频处理插件carp_audio_package的示例代码。请注意,carp_audio_package是一个假设的插件名称,因为实际的Flutter音频处理插件可能有所不同(例如audioplayersjust_audio等)。不过,我会根据假设的carp_audio_package来提供一个代码示例,展示如何进行音频录制和播放的基本操作。

首先,确保你已经在pubspec.yaml文件中添加了carp_audio_package依赖:

dependencies:
  flutter:
    sdk: flutter
  carp_audio_package: ^1.0.0  # 假设的版本号

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

接下来,在你的Flutter项目中,你可以按照以下方式使用carp_audio_package进行音频录制和播放:

import 'package:flutter/material.dart';
import 'package:carp_audio_package/carp_audio_package.dart';  // 假设的导入路径

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

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

class AudioScreen extends StatefulWidget {
  @override
  _AudioScreenState createState() => _AudioScreenState();
}

class _AudioScreenState extends State<AudioScreen> {
  late AudioManager _audioManager;
  String _status = "Ready";

  @override
  void initState() {
    super.initState();
    _audioManager = AudioManager();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Processing with carp_audio_package'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_status),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                setState(() {
                  _status = "Recording...";
                });
                await _audioManager.startRecording("path/to/record/audio.wav");
                setState(() {
                  _status = "Recording Stopped";
                });
              },
              child: Text('Start Recording'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                setState(() {
                  _status = "Playing...";
                });
                await _audioManager.playAudio("path/to/record/audio.wav");
                setState(() {
                  _status = "Playback Stopped";
                });
              },
              child: Text('Play Audio'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _audioManager.dispose();
    super.dispose();
  }
}

// 假设的AudioManager类,用于管理音频录制和播放
class AudioManager {
  Future<void> startRecording(String filePath) async {
    // 这里应该实现音频录制的逻辑
    // 例如,使用MediaRecorder API或第三方库
    // 这里只是模拟一个延迟
    await Future.delayed(Duration(seconds: 5));
    print("Recording saved to $filePath");
  }

  Future<void> playAudio(String filePath) async {
    // 这里应该实现音频播放的逻辑
    // 例如,使用AudioPlayer库
    // 这里只是模拟一个延迟
    await Future.delayed(Duration(seconds: 5));
    print("Audio played from $filePath");
  }

  void dispose() {
    // 清理资源,如果有的话
  }
}

请注意,上述代码中的AudioManager类是一个假设的实现,用于展示如何组织音频处理的功能。在实际应用中,你需要使用具体的音频处理库(如audioplayersjust_audio)来实现startRecordingplayAudio方法。

由于carp_audio_package是一个假设的插件名称,你可能需要查阅实际音频处理插件的文档来了解如何正确实现音频录制和播放的功能。如果你使用的是具体的插件,比如audioplayers,你可以参考该插件的官方文档和示例代码来进行实现。

回到顶部