Flutter音频流处理插件sound_stream_now的使用

Flutter音频流处理插件sound_stream_now的使用

sound_stream_now 是一个用于实时音频流处理的 Flutter 插件。它允许开发者从麦克风获取音频数据流,并将数据发送到音频引擎进行播放或进一步处理。目前该插件支持 Android 和 iOS 平台,且支持同时录音和播放。

当前功能:

  • 提供从麦克风获取的音频数据流(类型为 Uint8List)。
  • 支持接收原始音频数据流并播放(类型为 Uint8List)。
  • 同时支持 Android 和 iOS(跨平台)。
  • 录音器和播放器可以同时工作。

限制:

  • 目前仅支持 PCM 16位单声道。
  • 数据在流中发送和接收必须为 Uint8List 类型(这是由于 Flutter 的平台通道限制)。

待办事项:

  • 支持更多音频格式。
  • 支持更多平台(如 Windows、macOS、Web)。
  • 代码可能需要清理以提高可维护性。

使用示例

以下是一个完整的示例代码,展示如何使用 sound_stream_now 插件实现录音和播放功能。

示例代码

import 'dart:async';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:sound_stream_now/sound_stream_now.dart';

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

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

class _MyAppState extends State<MyApp> {
  RecorderStream _recorder = RecorderStream(); // 录音器实例
  PlayerStream _player = PlayerStream(); // 播放器实例

  List<Uint8List> _micChunks = []; // 存储录音数据
  bool _isRecording = false; // 是否正在录音
  bool _isPlaying = false; // 是否正在播放

  late StreamSubscription _recorderStatus; // 录音状态监听
  late StreamSubscription _playerStatus; // 播放状态监听
  late StreamSubscription _audioStream; // 音频数据流监听

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlugin(); // 初始化插件
  }

  [@override](/user/override)
  void dispose() {
    _recorderStatus?.cancel(); // 取消录音状态监听
    _playerStatus?.cancel(); // 取消播放状态监听
    _audioStream?.cancel(); // 取消音频数据流监听
    super.dispose();
  }

  // 初始化插件
  Future<void> initPlugin() async {
    _recorderStatus = _recorder.status.listen((status) {
      if (mounted)
        setState(() {
          _isRecording = status == SoundStreamStatus.Playing; // 更新录音状态
        });
    });

    _audioStream = _recorder.audioStream.listen((data) {
      if (_isPlaying) {
        _player.writeChunk(data); // 如果正在播放,则写入播放器
      } else {
        _micChunks.add(data); // 如果未播放,则存储录音数据
      }
    });

    _playerStatus = _player.status.listen((status) {
      if (mounted)
        setState(() {
          _isPlaying = status == SoundStreamStatus.Playing; // 更新播放状态
        });
    });

    await Future.wait([ // 确保录音器和播放器都已初始化
      _recorder.initialize(),
      _player.initialize(),
    ]);
  }

  // 开始播放录音数据
  void _play() async {
    await _player.start();

    if (_micChunks.isNotEmpty) { // 如果有录音数据,则逐段播放
      for (var chunk in _micChunks) {
        await _player.writeChunk(chunk);
      }
      _micChunks.clear(); // 清空录音数据
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('sound_stream_now 示例'), // 应用标题
        ),
        body: Row(
          mainAxisAlignment: MainAxisAlignment.spaceAround, // 按钮水平居中分布
          children: [
            IconButton(
              iconSize: 96.0, // 图标大小
              icon: Icon(_isRecording ? Icons.mic_off : Icons.mic), // 图标根据状态切换
              onPressed: _isRecording ? _recorder.stop : _recorder.start, // 切换录音状态
            ),
            IconButton(
              iconSize: 96.0,
              icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow), // 图标根据状态切换
              onPressed: _isPlaying ? _player.stop : _play, // 切换播放状态
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


sound_stream_now 是一个用于 Flutter 的音频流处理插件,它允许你从麦克风捕获音频流,并对音频数据进行实时处理。这个插件通常用于需要实时音频处理的应用场景,比如语音识别、音频分析等。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  sound_stream_now: ^0.0.1  # 请使用最新版本

然后运行 flutter pub get 来安装插件。

基本用法

以下是一个简单的示例,展示了如何使用 sound_stream_now 插件来捕获音频流并处理音频数据。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioStreamExample(),
    );
  }
}

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

class _AudioStreamExampleState extends State<AudioStreamExample> {
  SoundStreamNow _soundStream = SoundStreamNow();
  bool _isRecording = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    _soundStream.onAudioData.listen((data) {
      // 在这里处理音频数据
      print("Received audio data: ${data.length} bytes");
    });
  }

  void _toggleRecording() async {
    if (!_isRecording) {
      await _soundStream.start();
    } else {
      await _soundStream.stop();
    }
    setState(() {
      _isRecording = !_isRecording;
    });
  }

  [@override](/user/override)
  void dispose() {
    _soundStream.stop();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SoundStreamNow Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _isRecording ? 'Recording...' : 'Not Recording',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _toggleRecording,
              child: Text(_isRecording ? 'Stop Recording' : 'Start Recording'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部