Flutter音频裁剪插件flutter_audio_trimmer的使用

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

Flutter音频裁剪插件flutter_audio_trimmer的使用

修剪音频文件意味着从文件的开头或结尾剪切一部分音频,或者从中间移除某些部分。

Dart API

该库提供了几种处理音频修剪相关操作的方法:

Future<File?> trim({
    required File inputFile, // 输入音频文件
    required Directory outputDirectory, // 输出目录
    required String fileName, // 输出文件名
    required AudioFileType fileType, // 音频文件类型
    required AudioTrimTime time, // 剪切时间范围
  }){...};

运行示例应用

  • 导航到示例文件夹 cd example
  • 安装依赖项
    • flutter pub get

贡献

您可以帮助我们改进这个项目,请随时打开一个新的问题或提交一个拉取请求。

示例代码

以下是一个完整的示例应用程序,展示了如何使用flutter_audio_trimmer插件来选择和修剪音频文件。

import 'dart:io';

import 'package:flutter_audio_trimmer/flutter_audio_trimmer.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(home: MyHomePage());
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  File? _file; // 存储选择的音频文件
  File? _outputFile; // 存储修剪后的音频文件

  // 选择音频文件
  Future<void> _onPickAudioFile() async {
    try {
      Permission permission =
          Platform.isAndroid ? Permission.storage : Permission.photos;
      if (await permission.request().isGranted) {
        FilePickerResult? result = await FilePicker.platform.pickFiles(
          allowMultiple: false,
          type: FileType.any,
        );

        if (result != null && result.files.isNotEmpty) {
          setState(() {
            _file = File(result.files.first.path ?? '');
          });
        }
      }
    } catch (e) {
      _showSnackBar(e.toString());
    }
  }

  // 修剪音频文件
  Future<void> _onTrimAudioFile() async {
    try {
      if (_file != null) {
        Directory directory = await getApplicationSupportDirectory();

        File? trimmedAudioFile = await FlutterAudioTrimmer.trim(
          inputFile: _file!, // 输入文件
          outputDirectory: directory, // 输出目录
          fileName: DateTime.now().millisecondsSinceEpoch.toString(), // 文件名
          fileType: Platform.isAndroid ? AudioFileType.mp3 : AudioFileType.m4a, // 文件类型
          time: AudioTrimTime( // 时间范围
            start: const Duration(seconds: 50), // 开始时间
            end: const Duration(seconds: 100), // 结束时间
          ),
        );
        setState(() {
          _outputFile = trimmedAudioFile; // 更新输出文件
        });
      } else {
        _showSnackBar('请选择要修剪的音频文件');
      }
    } on AudioTrimmerException catch (e) {
      _showSnackBar(e.message);
    } catch (e) {
      _showSnackBar(e.toString());
    }
  }

  // 显示提示信息
  void _showSnackBar(String message) {
    SnackBar snackBar = SnackBar(content: Text(message));
    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('插件示例应用')),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Center(
          child: Column(
            children: [
              if (_file != null) Text(_file?.path ?? ''), // 显示选择的文件路径
              ElevatedButton(
                onPressed: _onPickAudioFile, // 按钮点击事件:选择音频文件
                child: const Text('选择音频文件'),
              ),
              const SizedBox(height: 20),
              if (_outputFile != null) Text(_outputFile?.path ?? ''), // 显示修剪后的文件路径
              ElevatedButton(
                onPressed: _onTrimAudioFile, // 按钮点击事件:修剪音频文件
                child: const Text('修剪音频'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_audio_trimmer插件进行音频裁剪的示例代码。这个插件允许用户选择并裁剪音频文件。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_audio_trimmer: ^0.4.0  # 请注意版本号,使用最新版本

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

步骤 2: 配置Android权限

由于音频裁剪需要访问文件系统,你需要在android/app/src/main/AndroidManifest.xml中添加必要的权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    <!-- 其他配置 -->
    
</manifest>

步骤 3: 实现音频裁剪功能

在你的Flutter项目中,你可以按如下方式使用flutter_audio_trimmer插件:

import 'package:flutter/material.dart';
import 'package:flutter_audio_trimmer/flutter_audio_trimmer.dart';
import 'package:path_provider/path_provider.dart';

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

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

class AudioTrimmerScreen extends StatefulWidget {
  @override
  _AudioTrimmerScreenState createState() => _AudioTrimmerScreenState();
}

class _AudioTrimmerScreenState extends State<AudioTrimmerScreen> {
  File? audioFile;
  String? trimmedFilePath;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Trimmer'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _pickAudioFile,
              child: Text('Pick Audio File'),
            ),
            SizedBox(height: 20),
            if (audioFile != null)
              AudioTrimmer(
                audioFile: audioFile!,
                startTime: 0.0,
                endTime: audioFile!.lengthSync()! / 1000.0,
                onTrimmed: (start, end, result) {
                  setState(() {
                    trimmedFilePath = result;
                  });
                },
              ),
            SizedBox(height: 20),
            if (trimmedFilePath != null)
              Text('Trimmed Audio Path: $trimmedFilePath'),
          ],
        ),
      ),
    );
  }

  Future<void> _pickAudioFile() async {
    final directory = await getApplicationDocumentsDirectory();
    final picker = ImagePicker();
    final pickedFile = await picker.pickFile(type: FileType.audio);

    if (pickedFile != null) {
      setState(() {
        audioFile = File(pickedFile.path);
      });
    }
  }
}

解释

  1. 添加依赖:在pubspec.yaml中添加flutter_audio_trimmer
  2. 配置权限:在AndroidManifest.xml中添加读写外部存储权限。
  3. 实现界面
    • 使用ElevatedButton来选择音频文件。
    • 使用AudioTrimmer小部件来显示裁剪界面。
    • 裁剪完成后,onTrimmed回调会返回裁剪后的文件路径。

请确保你已经安装并正确配置了所有必要的依赖和权限,然后运行你的Flutter应用来测试音频裁剪功能。

回到顶部