Flutter音频录制插件audio_in_app的使用

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

Flutter音频录制插件audio_in_app的使用

简介

audio_in_app 是一个用于在Flutter应用程序中播放音频文件的插件。它非常适合游戏或需要声音的应用程序。

快速开始与使用

  1. 导入 audio_in_app

    在你的Dart文件中,首先需要导入 audio_in_app 包:

    import 'package:audio_in_app/audio_in_app.dart';
    
  2. 创建 AudioInApp 类的实例

    创建一个 AudioInApp 类的实例,用于管理音频播放:

    AudioInApp _audioInApp = AudioInApp();
    
  3. 加载音频文件

    使用 createNewAudioCache 方法来加载你将在应用中使用的音频文件。你需要提供一个唯一的ID(playerId),音频文件的路径(route),以及音频的类型(audioInAppType)。音频文件应放置在 assets 文件夹中。

    • 点播音频(例如按钮点击、角色跳跃或射击时的声音):

      await _audioInApp.createNewAudioCache(
        playerId: 'button', 
        route: 'audio/button.wav', 
        audioInAppType: AudioInAppType.determined
      );
      
    • 背景音频(例如游戏进行中的背景音乐):

      背景音频有以下特点:

      • 同一时间只能播放一段背景音频。如果开始播放新的背景音频,当前播放的背景音频会停止。
      • 背景音频会无限循环播放,直到你决定停止它或切换到其他音频。

      示例代码:

      await _audioInApp.createNewAudioCache(
        playerId: 'intro1', 
        route: 'audio/intro_1.wav', 
        audioInAppType: AudioInAppType.background
      );
      
  4. 播放音频

    使用 play 方法来播放音频。你可以通过 playerId 来指定要播放的音频:

    • 播放点播音频:

      await _audioInApp.play(playerId: 'button');
      
    • 播放背景音频:

      await _audioInApp.play(playerId: 'intro1');
      
  5. 停止背景音频

    如果你想停止正在播放的背景音频,可以使用 stopBackgroun 方法:

    await _audioInApp.stopBackgroun();
    

完整示例Demo

以下是一个完整的示例,展示了如何在Flutter应用程序中使用 audio_in_app 插件。该示例包含两个页面:加载页面和主页面。加载页面会在1.5秒后加载所有音频文件并跳转到主页面,主页面则提供了几个按钮来播放不同的音频。

1. 加载页面 (LoadingActivity)
import 'package:audio_in_app/audio_in_app.dart';
import 'package:flutter/material.dart';

class LoadingActivity extends StatefulWidget {
  [@override](/user/override)
  State<LoadingActivity> createState() => _LoadingActivityState();
}

class _LoadingActivityState extends State<LoadingActivity> {
  AudioInApp _audioInApp = AudioInApp();

  [@override](/user/override)
  void initState() {
    super.initState();
    // 延迟1.5秒后加载音频并跳转到主页面
    Future.delayed(Duration(milliseconds: 1500)).then((value) => goToMain());
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('Loading Activity'),
      ),
    );
  }

  // 加载音频并跳转到主页面
  Future<void> goToMain() async {
    // 加载背景音频
    await _audioInApp.createNewAudioCache(
      playerId: 'intro1', 
      route: 'audio/intro_1.wav', 
      audioInAppType: AudioInAppType.background
    );
    await _audioInApp.createNewAudioCache(
      playerId: 'intro2', 
      route: 'audio/intro_2.wav', 
      audioInAppType: AudioInAppType.background
    );

    // 加载点播音频
    await _audioInApp.createNewAudioCache(
      playerId: 'button', 
      route: 'audio/button.wav', 
      audioInAppType: AudioInAppType.determined
    );

    // 跳转到主页面
    Navigator.pushReplacementNamed(context, 'main');
  }
}
2. 主页面 (MainActivity)
import 'package:audio_in_app/audio_in_app.dart';
import 'package:flutter/material.dart';

class MainActivity extends StatefulWidget {
  [@override](/user/override)
  State<MainActivity> createState() => _MainActivityState();
}

class _MainActivityState extends State<MainActivity> {
  AudioInApp _audioInApp = AudioInApp();

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  // 播放背景音频1
  Future<void> play_intro_1() async {
    await _audioInApp.play(playerId: 'intro1');
  }

  // 播放背景音频2
  Future<void> play_intro_2() async {
    await _audioInApp.play(playerId: 'intro2');
  }

  // 停止背景音频
  Future<void> stop_background() async {
    await _audioInApp.stopBackgroun();
  }

  // 播放点播音频
  Future<void> play_button() async {
    await _audioInApp.play(playerId: 'button');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Container(
              margin: EdgeInsets.only(bottom: 30),
              child: Text('Main Activity'),
            ),
            OutlinedButton(
              onPressed: () {
                play_intro_1(); // 播放背景音频1
              },
              child: Text("Play background intro 1"),
            ),
            OutlinedButton(
              onPressed: () {
                play_intro_2(); // 播放背景音频2
              },
              child: Text("Play background intro 2"),
            ),
            OutlinedButton(
              onPressed: () {
                play_button(); // 播放点播音频
              },
              child: Text("Play Button Sound"),
            ),
            OutlinedButton(
              onPressed: () {
                stop_background(); // 停止背景音频
              },
              child: Text("Stop background sound"),
            )
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用audio_in_app插件进行音频录制的示例代码。这个示例展示了如何初始化插件、开始和停止录音,以及保存录音文件。

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

dependencies:
  flutter:
    sdk: flutter
  audio_in_app: ^3.0.3  # 请检查最新版本号

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

接下来,是一个简单的Flutter应用示例,展示了如何使用audio_in_app插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Audio Recorder Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AudioRecorderScreen(),
    );
  }
}

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

class _AudioRecorderScreenState extends State<AudioRecorderScreen> {
  late AudioInApp _audioInApp;
  bool isRecording = false;
  String? recordedFilePath;

  @override
  void initState() {
    super.initState();
    _audioInApp = AudioInApp();
    _audioInApp.init().then((_) {
      print("Audio recorder initialized");
    }).catchError((e) {
      print("Error initializing audio recorder: $e");
    });
  }

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

  Future<void> startRecording() async {
    if (!isRecording) {
      setState(() {
        isRecording = true;
      });

      final Directory appDocDir = await getApplicationDocumentsDirectory();
      String appDocPath = appDocDir.path;
      String filePath = "${appDocPath}/audio_recording.wav";

      recordedFilePath = filePath;

      _audioInApp.startRecorder(
        filePath,
        audioFormat: AudioFormat.WAV,
        codec: AudioCodec.PCM_16BIT,
        sampleRate: 44100,
      );

      _audioInApp.recorder!.recordingListener = (RecordingStatus status) {
        if (status == RecordingStatus.COMPLETED) {
          setState(() {
            isRecording = false;
          });
          print("Recording completed");
        } else if (status == RecordingStatus.ERROR) {
          setState(() {
            isRecording = false;
          });
          print("Recording error");
        }
      };
    }
  }

  Future<void> stopRecording() async {
    if (isRecording) {
      await _audioInApp.stopRecorder();
      setState(() {
        isRecording = false;
      });
      print("Recording stopped");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Recorder Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: isRecording ? stopRecording : startRecording,
              child: Text(isRecording ? 'Stop Recording' : 'Start Recording'),
            ),
            if (recordedFilePath != null)
              Text(
                'Recorded File Path: $recordedFilePath',
                style: TextStyle(fontSize: 16),
              ),
          ],
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖添加:在pubspec.yaml文件中添加audio_in_app依赖。
  2. 初始化:在initState方法中初始化AudioInApp实例。
  3. 开始录音startRecording方法负责开始录音,设置录音文件的路径和格式,并监听录音状态。
  4. 停止录音stopRecording方法负责停止录音。
  5. UI界面:一个简单的UI界面,包含一个按钮用于开始和停止录音,并在录音完成后显示录音文件的路径。

请确保在实际项目中处理异常和错误情况,并根据需要调整录音参数和UI设计。

回到顶部