Flutter音频处理插件vinyl的使用

Flutter音频处理插件vinyl的使用

关于

我需要一种快速的方法来构建需要在Flutter中处理音频的应用程序,并且我希望这些应用程序能够在所有平台上运行而无需任何额外设置。

如果没有这个库,我将不得不手动编写所有播放器逻辑、控制器类以及进行状态管理。

此库允许你快速上手。只需进行初始设备特定的设置,就可以开始使用了。

快速开始

第一步:在pubspec.yaml中包含库

vinyl:
  git:
    url: https://github.com/RA341/vinyl
    ref: [最新提交引用]

第二步:根据特定平台进行设置

第三步:初始化Vinyl

Future<void> main() async {
  ....

  await vinyl.init(AudioConfig(...)) // 如果你需要后台播放支持
  // 或者
  await vinyl.init() // 如果你不需要

  ....
  runApp(MyApp());
}

第四步:开始使用

只需调用vinyl.player即可访问播放器方法和元数据。

注意

谁不适合使用此库

如果你需要对音频播放器进行更多定制,那么这可能不是你要找的库。

虽然我尝试使大多数功能易于访问,但你可能会失去自己编写设置代码时获得的精细控制。

如果你觉得缺少某些功能,请随时提出问题。

开始使用

设置平台以支持后台音频

所有说明都取自audio_service

Android

这些说明假定你的项目遵循Flutter 1.12项目模板或更新版本。如果 你的项目是在1.12之前创建的,并使用旧项目结构,你可以更新项目以遵循新的项目模板。

  1. 修改项目的AndroidManifest.xml文件:
<manifest xmlns:tools="http://schemas.android.com/tools" ...>
  <!-- 添加这两个权限 -->
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

  <application ...>
    ...

    <!-- 编辑现有 "ACTIVITY" 元素中的 android:name 属性 -->
    <activity android:name="com.ryanheise.audioservice.AudioServiceActivity" ...>...</activity>

    <!-- 添加这个 "SERVICE" 元素 -->
    <service android:name="com.ryanheise.audioservice.AudioService"
      android:foregroundServiceType="mediaPlayback" android:exported="true" tools:ignore="Instantiable">
      <intent-filter>
        <action android:name="android.media.browse.MediaBrowserService" />
      </intent-filter>
    </service>
    
    <!-- 添加这个 "RECEIVER" 元素 -->
    <receiver android:name="com.ryanheise.audioservice.MediaButtonReceiver" android:exported="true"
      tools:ignore="Instantiable">
      <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
      </intent-filter>
    </receiver>
  </application>
</manifest>

注意:当目标Android 12或以上时,你必须在每个具有意图过滤器的组件上设置android:exported。如果合并清单过程导致“Instantiable”警告,请使用tools:ignore="Instantiable"(如上)来抑制它们。

如果你在通知中使用任何自定义图标,请创建文件android/app/src/main/res/raw/keep.xml以防止它们在构建过程中被剥离:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/*" />

默认情况下,插件的默认图标不会被R8剥离。如果你不使用它们,可以有选择地剥离它们。例如,以下规则会保留所有你的图标并丢弃插件的所有图标:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/*"
tools:discard="@drawable/audio_service_*"
/>

有关缩减的信息,请参阅Android文档。 自定义Android活动

如果你的应用需要使用自己的自定义活动,请确保更新你的AndroidManifest.xml文件以引用你的活动类名而不是AudioServiceActivity。例如,如果你的活动类名为MainActivity,则使用:

<activity android:name=".MainActivity" ...>

根据你的活动是否是一个常规Activity还是一个FragmentActivity,你还必须包括一些代码来链接到audio_service的共享FlutterEngine。最简单的方法是继承来自audio_service提供的基类之一的代码。

作为活动集成:

import com.ryanheise.audioservice.AudioServiceActivity;

class MainActivity extends AudioServiceActivity {
// ...
}

作为FragmentActivity集成:

import com.ryanheise.audioservice.AudioServiceFragmentActivity;

class MainActivity extends AudioServiceFragmentActivity {
// ...
}

你也可以从头开始编写自己的活动类,并自行覆盖provideFlutterEnginegetCachedEngineIdshouldDestroyEngineWithHost方法。有关灵感,请参见提供的AudioServiceActivity和AudioServiceFragmentActivity类的源代码。

iOS

在你的Info.plist文件中插入以下内容:

<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>

示例项目可作为上下文参考。

请注意,音频后台模式仅允许应用程序在播放音频时在后台运行。如果你的应用程序需要在几秒钟内暂停以播放音频轨道之间的间隔,建议使用静音音频轨道来实现这种效果,而不是使用空闲计时器。

MacOS

在你的Info.plist文件中插入以下内容:

<key>NSAppleMusicUsageDescription</key>
<string>Allow access to music library</string>
<key>NSMicrophoneUsageDescription</key>
<string>Allow access to microphone</string>

示例项目可作为上下文参考。

请注意,音频后台模式仅允许应用程序在播放音频时在后台运行。如果你的应用程序需要在几秒钟内暂停以播放音频轨道之间的间隔,建议使用静音音频轨道来实现这种效果,而不是使用空闲计时器。

Web

无需额外设置

Windows

不支持

Linux

初始化Vinyl

AudioServiceConfig用于后台音频,请在此处阅读更多信息:audio_service

注意

vinyl是一个方便的变量,供你使用。

可以在任何地方调用它,总是会返回已初始化的Vinyl实例。

Vinyl本身是一个单例,始终只会有一个实例。

内部初始化如下:

vinyl = Vinyl.i;

如果需要使用后台播放器:

final config = AudioServiceConfig(...);
vinyl.init(audioConfig: config);

如果不使用后台播放:

vinyl.init();

使用

所有媒体方法都是通过播放器控制器访问的。

vinyl.player
vinyl.player.play()
vinyl.player.pause()
vinyl.player.loadMedia()
.....

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

1 回复

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


vinyl 是一个 Flutter 插件,用于音频处理和播放。它提供了丰富的功能,可以帮助你轻松地在 Flutter 应用中处理音频文件,包括播放、暂停、停止、音量控制、音频文件加载等。

以下是如何使用 vinyl 插件进行音频处理的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  vinyl: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 vinyl 插件:

import 'package:vinyl/vinyl.dart';

3. 初始化音频播放器

你可以使用 VinylPlayer 来初始化音频播放器:

VinylPlayer player = VinylPlayer();

4. 加载音频文件

你可以通过 load 方法加载音频文件。音频文件可以是一个本地文件路径或一个网络 URL。

await player.load('assets/your_audio_file.mp3');  // 本地文件
// 或者
await player.load('https://example.com/your_audio_file.mp3');  // 网络文件

5. 播放音频

使用 play 方法播放音频:

await player.play();

6. 暂停音频

使用 pause 方法暂停音频:

await player.pause();

7. 停止音频

使用 stop 方法停止音频:

await player.stop();

8. 控制音量

你可以通过 setVolume 方法控制音量,音量范围是 0.0 到 1.0:

await player.setVolume(0.5);  // 设置音量为 50%

9. 控制播放位置

你可以通过 seek 方法控制音频的播放位置(以秒为单位):

await player.seek(Duration(seconds: 30));  // 跳转到 30 秒的位置

10. 释放资源

当你不再需要使用播放器时,记得释放资源:

await player.dispose();

11. 监听播放状态

你可以监听播放器的状态变化,例如播放、暂停、停止等:

player.onPlayerStateChanged.listen((VinylPlayerState state) {
  print('Player state changed: $state');
});

12. 监听播放进度

你可以监听播放进度,以便更新 UI 中的进度条:

player.onPositionChanged.listen((Duration duration) {
  print('Current position: ${duration.inSeconds} seconds');
});

完整示例

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

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

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

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

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  VinylPlayer player = VinylPlayer();

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

  Future<void> _initAudioPlayer() async {
    await player.load('https://example.com/your_audio_file.mp3');
    player.onPlayerStateChanged.listen((VinylPlayerState state) {
      print('Player state changed: $state');
    });
    player.onPositionChanged.listen((Duration duration) {
      print('Current position: ${duration.inSeconds} seconds');
    });
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Vinyl Audio Player'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () async {
                await player.play();
              },
              child: Text('Play'),
            ),
            ElevatedButton(
              onPressed: () async {
                await player.pause();
              },
              child: Text('Pause'),
            ),
            ElevatedButton(
              onPressed: () async {
                await player.stop();
              },
              child: Text('Stop'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部