Flutter音频处理插件flutter_pcm_sound的使用

Flutter音频处理插件flutter_pcm_sound的使用

插件简介

pub package

Logo

flutter_pcm_sound 是一个用于将实时PCM音频(16位整数)发送到设备扬声器的Flutter插件。它没有额外的依赖,除了Flutter、Android、iOS和MacOS本身。与其它插件不同的是,flutter_pcm_sound不是用于播放音频文件,而是用于生成实时音频的应用,例如使用dart_melty_soundfont

主要特性

  • 无依赖:除了Flutter、Android、iOS和MacOS外,没有任何其他依赖。
  • 非音频文件:不使用音频文件,而是用于实时生成音频。
  • 基于回调的实时音频:使用setFeedCallback回调函数来通知何时需要提供更多的样本。
  • 一键操作:通过调用feed方法开始播放音频,停止调用feed方法则停止播放。

使用方法

以下是一个简单的示例,展示了如何使用flutter_pcm_sound插件:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_pcm_sound/flutter_pcm_sound.dart';

const int sampleRate = 44100;

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

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

  @override
  Widget build(BuildContext context) {
    return PcmSoundApp();
  }
}

class PcmSoundApp extends StatefulWidget {
  @override
  _PcmSoundAppState createState() => _PcmSoundAppState();
}

class _PcmSoundAppState extends State<PcmSoundApp> {
  int _remainingFrames = 0;
  MajorScale scale = MajorScale(sampleRate: sampleRate, noteDuration: 0.20);

  @override
  void initState() {
    super.initState();
    FlutterPcmSound.setLogLevel(LogLevel.verbose);
    FlutterPcmSound.setup(sampleRate: sampleRate, channelCount: 1);
    if (Platform.isAndroid) {
      FlutterPcmSound.setFeedThreshold(-1);
    } else {
      FlutterPcmSound.setFeedThreshold(sampleRate ~/ 30);
    }
    FlutterPcmSound.setFeedCallback(_onFeed);
  }

  @override
  void dispose() {
    super.dispose();
    FlutterPcmSound.release();
  }

  void _onFeed(int remainingFrames) async {
    setState(() {
      _remainingFrames = remainingFrames;
    });
    if (remainingFrames < 6000) {
      List<int> frames = scale.generate(periods: 10);
      await FlutterPcmSound.feed(PcmArrayInt16.fromList(frames));
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: Text('Flutter PCM Sound'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              ElevatedButton(
                onPressed: () {
                  FlutterPcmSound.setFeedCallback(_onFeed);
                  _onFeed(0); // start feeding
                },
                child: Text('Play'),
              ),
              ElevatedButton(
                onPressed: () {
                  FlutterPcmSound.setFeedCallback(null); // stop
                  setState(() {
                    _remainingFrames = 0;
                  });
                },
                child: Text('Stop'),
              ),
              Text('$_remainingFrames Remaining Frames')
            ],
          ),
        ),
      ),
    );
  }
}

关键步骤说明

  1. 初始化设置

    • 设置日志级别为详细模式。
    • 初始化音频参数(采样率和声道数)。
    • 根据平台设置不同的喂入阈值。
  2. 回调函数

    • _onFeed函数在需要更多音频帧时被调用。
    • 当剩余帧数小于6000时,生成新的音频帧并喂入。
  3. UI交互

    • 提供两个按钮用于控制音频的播放和停止。
    • 显示当前剩余的音频帧数。

示例应用

要运行示例应用,请执行以下命令:

cd ./example                      
flutter config --enable-macos-desktop                                                      
flutter config --enable-android 
flutter config --enable-ios 
flutter create .
flutter run

这样你就可以在支持的平台上测试flutter_pcm_sound插件的功能了。

结语

希望这篇文章能帮助你了解和使用flutter_pcm_sound插件。如果你有任何问题或建议,欢迎在GitHub上提交Issue或Pull Request。请记得给这个项目一个Star,让更多人受益于这个插件! ⭐


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用flutter_pcm_sound插件进行音频处理的代码案例。这个插件允许你通过PCM(Pulse Code Modulation)格式来处理音频数据。以下是一个基本的示例,展示了如何播放和录制音频。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_pcm_sound: ^最新版本号  # 请替换为实际发布的最新版本号

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

2. 导入包并初始化

在你的Dart文件中导入包并初始化FlutterPcmSound

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

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

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

class AudioProcessingScreen extends StatefulWidget {
  @override
  _AudioProcessingScreenState createState() => _AudioProcessingScreenState();
}

class _AudioProcessingScreenState extends State<AudioProcessingScreen> {
  late FlutterPcmSound pcmSound;

  @override
  void initState() {
    super.initState();
    pcmSound = FlutterPcmSound();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter PCM Sound Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                await playAudio();
              },
              child: Text('Play Audio'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                await recordAudio();
              },
              child: Text('Record Audio'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> playAudio() async {
    try {
      // 假设你有一个PCM格式的音频文件路径
      String audioFilePath = 'path_to_your_pcm_audio_file.pcm';
      await pcmSound.play(audioFilePath);
    } catch (e) {
      print('Error playing audio: $e');
    }
  }

  Future<void> recordAudio() async {
    try {
      // 设置录音配置
      final Map<String, dynamic> config = {
        'sampleRate': 44100,  // 采样率
        'channels': 1,       // 单声道
        'bitDepth': 16,      // 位深度
      };

      // 开始录音
      await pcmSound.startRecording(config);

      // 录音5秒钟后停止
      await Future.delayed(Duration(seconds: 5));
      await pcmSound.stopRecording('output_audio.pcm');

      print('Recording saved to output_audio.pcm');
    } catch (e) {
      print('Error recording audio: $e');
    }
  }
}

3. 权限配置

如果你需要录制音频,你需要在AndroidManifest.xmlInfo.plist文件中添加相应的权限。

Android

android/app/src/main/AndroidManifest.xml中添加:

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

iOS

ios/Runner/Info.plist中添加:

<key>NSMicrophoneUsageDescription</key>
<string>We need your permission to use the microphone</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>We need your permission to save audio files</string>

注意事项

  1. PCM文件路径:确保你提供的PCM文件路径是正确的,并且文件存在。
  2. 权限处理:在实际应用中,你应该处理权限请求,确保用户已经授予了必要的权限。
  3. 音频格式:PCM是一种原始的音频格式,不包含任何压缩或编码。确保你的音频处理逻辑与PCM格式兼容。

这个示例代码展示了如何使用flutter_pcm_sound插件进行基本的音频播放和录制。根据你的需求,你可以进一步扩展和自定义这些功能。

回到顶部