better_audio_capture 0.1.1 copy "better_audio_capture: ^0.1.1" to clipboard
better_audio_capture: ^0.1.1 copied to clipboard

A audio capture plugin for Flutter.

example/lib/main.dart

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';

import 'package:audio_session/audio_session.dart';
import 'package:better_audio_capture/better_audio_capture.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

class _MyAppState extends State<MyApp> {
  PermissionStatus? permissionStatus;

  BetterAudioCapture? betterAudioCapture;

  StreamSubscription? subscription;

  BytesBuilder bytesBuilder = BytesBuilder();

  AudioPlayer audioPlayer = AudioPlayer();

  @override
  void initState() {
    super.initState();

    Future.microtask(() async {
      PermissionStatus value = await Permission.microphone.status;
      setState(() {
        this.permissionStatus = value;
      });
    });

  }

  @override
  void dispose() {
    subscription?.cancel();
    betterAudioCapture?.dispose();
    audioPlayer.dispose();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Offstage(
                offstage: permissionStatus == PermissionStatus.granted,
                child: CupertinoButton(
                  child: Text("request microphone permission"),
                  onPressed: () async {
                    final value = await Permission.microphone.request();
                    if (value == PermissionStatus.permanentlyDenied || value == PermissionStatus.restricted) {
                      openAppSettings();
                    }

                    setState(() {
                      permissionStatus = value;
                    });
                  },
                ),
              ),
              Offstage(
                offstage: permissionStatus != PermissionStatus.granted,
                child: CupertinoButton(
                  child: Text("start"),
                  onPressed: () async {
                    bytesBuilder.clear();

                    if (betterAudioCapture != null) {
                      subscription?.cancel();
                      betterAudioCapture?.stopCapture();
                      betterAudioCapture?.dispose();
                    }

                    betterAudioCapture = BetterAudioCapture();
                    subscription = betterAudioCapture?.pcmStream.listen((event) {
                      bytesBuilder.add(event);
                      print("recording");
                    });

                    betterAudioCapture?.init();
                    betterAudioCapture?.startCapture();
                  },
                ),
              ),
              Offstage(
                offstage: permissionStatus != PermissionStatus.granted,
                child: CupertinoButton(
                  child: Text("stop"),
                  onPressed: () async {
                    if (betterAudioCapture == null) {
                      return;
                    }

                    subscription?.cancel();
                    betterAudioCapture?.stopCapture();
                    betterAudioCapture?.dispose();
                    betterAudioCapture = null;


                    Directory tempDir = await getTemporaryDirectory();
                    File waveFile = File(tempDir.path + "/record.wav");
                    if (waveFile.existsSync()) {
                      waveFile.deleteSync();
                    }

                    // 写入wav文件
                    if (bytesBuilder.length > 0) {
                      IOSink waveFileSink = waveFile.openWrite();
                      waveFileSink.add(BetterAudioCapture.waveHeader(bytesBuilder.length));
                      waveFileSink.add(bytesBuilder.takeBytes());
                      await waveFileSink.close();
                    }

                  },
                ),
              ),
              Offstage(
                offstage: permissionStatus != PermissionStatus.granted,
                child: CupertinoButton(
                  child: Text("play"),
                  onPressed: () async {
                    Directory tempDir = await getTemporaryDirectory();
                    File waveFile = File(tempDir.path + "/record.wav");

                    if (waveFile.existsSync() && waveFile.lengthSync() > 0) {

                      // request audio session
                      final session = await AudioSession.instance;
                      await session.configure(AudioSessionConfiguration.speech());

                      if (await session.setActive(true)) {
                        audioPlayer = AudioPlayer();
                        audioPlayer.setFilePath(waveFile.path);
                        audioPlayer.play();
                      }
                    }
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
6
likes
110
pub points
55%
popularity

Publisher

unverified uploader

A audio capture plugin for Flutter.

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

BSD-3-Clause (LICENSE)

Dependencies

flutter

More

Packages that depend on better_audio_capture