Flutter桌面音频录制插件flutter_desktop_audio_recorder的使用

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

Flutter桌面音频录制插件flutter_desktop_audio_recorder的使用

输出文件类型

  • macOS: .m4a
  • Windows: .wav

使用方法

FlutterDesktopAudioRecorder recorder = FlutterDesktopAudioRecorder();

[@override](/user/override)
void initState() {
  super.initState();
  
  _hasMicPermission = await recorder.hasMicPermission();
  
  recorder.permissionGrantedListener = () {
    if (!mounted) return;
    setState(() {
      _hasMicPermission = true;
    });
  };
}
  
Future startRecording() async {
  _fileName = DateTime.now().millisecondsSinceEpoch.toString();
  String path = await Utilities.getVoiceFilePath();
  try {
    return await recorder.start(path: path, fileName: _fileName);
  } on PlatformException catch (e) {
    switch (e.code) {
      case "permissionError":
        recorder.requestMicPermission();
        break;
      default:
    }
    log(e.message ?? "Unhandled error");
  }
}
  
Future stopRecording() async {
  return recorder.stop();
}
  
Future isRecording() async {
  return recorder.isRecording();
}

macOS权限设置

  1. Info.plist中添加麦克风使用描述:
    <key>NSMicrophoneUsageDescription</key>
    <string>可以使用您的麦克风吗?</string>
    

完整示例代码

import 'dart:developer';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:flutter_desktop_audio_recorder/flutter_desktop_audio_recorder.dart';
import 'package:flutter_desktop_audio_recorder_example/utilities.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _hasMicPermission = false;
  FlutterDesktopAudioRecorder recorder = FlutterDesktopAudioRecorder();
  String _fileName = "";

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
    recorder.permissionGrantedListener = () {
      if (!mounted) return;
      setState(() {
        _hasMicPermission = true;
      });
    };
  }

  // 平台消息异步初始化
  Future<void> initPlatformState() async {
    _hasMicPermission = await recorder.hasMicPermission();

    // 如果在异步平台消息处理期间小部件从树中移除,则丢弃回复而不是调用setState来更新我们的非存在的外观。
    if (!mounted) return;
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("桌面音频录制示例"),
        ),
        body: FutureBuilder<bool>(
            future: recorder.isRecording(),
            builder: (context, snapshot) {
              bool? isRecording = snapshot.data;
              return Center(
                child: Column(
                  children: [
                    startRecordingButton(snapshot, isRecording),
                    const SizedBox(
                      height: 48,
                    ),
                    Text((isRecording ?? false)
                        ? "正在录制音频"
                        : _fileName.isEmpty
                            ? ""
                            : "文件名: $_fileName.wav"),
                    Text(_hasMicPermission
                        ? "权限已授予"
                        : "权限未授予")
                  ],
                ),
              );
            }),
      ),
    );
  }

  TextButton startRecordingButton(
      AsyncSnapshot<bool> snapshot, bool? isRecording) {
    return TextButton(
        onPressed: () async {
          if (snapshot.data != null) {
            if (snapshot.data!) {
              stopRecording().then((value) {
                setState(() {});
              });
              setState(() {});
            } else {
              startRecording().then((value) {
                recorder.isRecording().then((value) {
                  if (kDebugMode) {
                    print(value);
                  }
                });
                setState(() {});
              });
              setState(() {});
            }
          }
        },
        child: Text(isRecording == null
            ? "初始化中"
            : !_hasMicPermission
                ? "请求麦克风权限"
                : isRecording
                    ? "停止"
                    : "开始录制"));
  }

  Future stopRecording() async {
    return recorder.stop();
  }

  Future startRecording() async {
    _fileName = DateTime.now().millisecondsSinceEpoch.toString();
    String path = await Utilities.getVoiceFilePath();
    try {
      return await recorder.start(path: path, fileName: _fileName);
    } on PlatformException catch (e) {
      switch (e.code) {
        case "permissionError":
          recorder.requestMicPermission();
          break;
        default:
      }
      log(e.message ?? "未处理错误");
    }
  }
}

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

1 回复

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


当然,以下是如何在Flutter桌面应用中使用flutter_desktop_audio_recorder插件进行音频录制的代码示例。请确保你已经按照插件的官方文档完成了相应的配置和安装。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_desktop_audio_recorder依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_desktop_audio_recorder: ^x.y.z  # 替换为最新版本号

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

2. 配置插件(仅桌面平台)

对于桌面平台(Windows、macOS、Linux),你需要在相应的配置文件中启用音频录制权限和设置。具体步骤请参考插件的官方文档。

3. 使用插件进行音频录制

以下是一个简单的Flutter应用示例,展示如何使用flutter_desktop_audio_recorder进行音频录制并保存文件。

示例代码

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

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

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

class AudioRecorderScreen extends StatefulWidget {
  @override
  _AudioRecorderScreenState createState() => _AudioRecorderScreenState();
}

class _AudioRecorderScreenState extends State<AudioRecorderScreen> {
  late AudioRecorder _audioRecorder;
  bool _isRecording = false;
  String _recordingPath = '';

  @override
  void initState() {
    super.initState();
    _audioRecorder = AudioRecorder();
    _audioRecorder.initialize().then((_) {
      // Initialization complete
    }).catchError((error) {
      print("Error initializing audio recorder: $error");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Recorder'),
      ),
      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'),
            ),
            SizedBox(height: 20),
            if (_recordingPath.isNotEmpty)
              Text(
                'Recording saved to: $_recordingPath',
                style: TextStyle(fontSize: 18),
              ),
          ],
        ),
      ),
    );
  }

  void _toggleRecording() {
    setState(() {
      if (_isRecording) {
        _stopRecording();
      } else {
        _startRecording();
      }
    });
  }

  void _startRecording() async {
    _isRecording = true;
    String? path = await _audioRecorder.startRecording(
      outputFilePath: '${Directory.systemTemp.path}/audio_recording.wav',
      audioFormat: AudioFormat.wav,
      sampleRate: 44100,
      numChannels: 2,
      bitDepth: 16,
    );

    if (path != null) {
      _recordingPath = path;
    } else {
      _isRecording = false; // Failed to start recording
      print("Failed to start recording");
    }
  }

  void _stopRecording() async {
    bool success = await _audioRecorder.stopRecording();
    _isRecording = !success; // If stop fails, continue recording

    if (success) {
      print("Recording stopped successfully");
    } else {
      print("Failed to stop recording");
    }
  }
}

说明

  1. 初始化插件:在initState方法中初始化AudioRecorder实例。
  2. 录制控制:通过_toggleRecording方法切换录制状态。如果当前在录制,则停止录制;否则开始录制。
  3. 开始录制_startRecording方法启动音频录制,并指定输出文件路径、音频格式、采样率、声道数和位深度。
  4. 停止录制_stopRecording方法停止音频录制。

注意事项

  • 确保你的桌面环境具有音频录制权限。
  • 根据需要调整音频参数(如采样率、声道数、位深度等)。
  • 处理音频文件时,请确保路径和文件名是有效的,并且应用具有写入权限。

以上代码提供了一个基本的音频录制功能示例,你可以根据需要进行扩展和修改。

回到顶部