Flutter音频媒体处理插件just_audio_media_kit的使用

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

Flutter音频媒体处理插件just_audio_media_kit的使用

just_audio_media_kit 是一个为 just_audio 提供 media_kit 绑定的Flutter插件,它允许开发者在Linux和Windows等平台上进行更强大的音频处理。以下是关于如何使用这个插件的详细指南。

安装

在你的 pubspec.yaml 中:

dependencies:
  just_audio_media_kit: ^2.0.0

  # 根据你的使用情况选择原生 media_kit 库:
  # 注意:如果你已经包含了视频库,这些音频库是不必要的。
  media_kit_libs_linux: any
  media_kit_libs_windows_audio: any

注意: 对于Android、iOS和macOS,你也可以使用 just_audio_media_kit,但需要确保包含所需的依赖项,并在 ensureInitialized() 方法中启用它们。不过,这不是必需的,因为它们已经被 just_audio 原生支持。

使用mimalloc(可选)

为了防止内存泄漏,建议用mimalloc替换默认的内存分配器。这可以通过向linux/CMakeLists.txt添加一行来实现:

target_link_libraries(${BINARY_NAME} PRIVATE ${MIMALLOC_LIB})

初始化AudioPlayer

在使用 AudioPlayer 之前,必须调用 JustAudioMediaKit.ensureInitialized() 来初始化平台特定的功能。

// 默认情况下,Windows和Linux是启用的
JustAudioMediaKit.ensureInitialized();

// 或者,如果你想手动配置启用的平台:
// 确保为每个启用的平台包含 pubspec.yaml 中所需的依赖项!
JustAudioMediaKit.ensureInitialized(
    linux: true,            // 默认:true  - 依赖:media_kit_libs_linux
    windows: true,          // 默认:true  - 依赖:media_kit_libs_windows_audio
    android: true,          // 默认:false - 依赖:media_kit_libs_android_audio
    iOS: true,              // 默认:false - 依赖:media_kit_libs_ios_audio
    macOS: true,            // 默认:false - 依赖:media_kit_libs_macos_audio
);

插件特定配置

以下是一些可以设置的参数,这些参数必须在播放器初始化之前或之后立即设置,否则它们将不起作用。

  • MPV日志级别:

    JustAudioMediaKit.mpvLogLevel = MPVLogLevel.debug;
    
  • 解复用器缓存大小(字节):

    JustAudioMediaKit.bufferSize = 8 * 1024 * 1024; // 8 MB
    
  • 本地后端窗口和进程名称:

    JustAudioMediaKit.title = 'My Audio Player App';
    
  • 允许的协议列表:

    JustAudioMediaKit.protocolWhitelist = const ['http', 'https'];
    
  • 音高控制:

    JustAudioMediaKit.pitch = true;
    
  • 无缝播放:

    JustAudioMediaKit.prefetchPlaylist = true;
    
  • 手动指定libmpv路径(高级):

    JustAudioMediaKit.ensureInitialized(
        libmpv: '/usr/lib/libmpv.so.2',
    );
    

功能特性

特性 Linux, Windows
从URL读取
从文件读取
从资源读取
从字节流读取 ✅*
请求头 ✅ (未测试)
DASH ✅ (未测试)
HLS ✅ (未测试)
ICY元数据
缓冲状态/位置
播放/暂停/快进
设置音量/速度
裁剪音频
播放列表
循环/随机播放
组合音频
无缝播放 ✅**
报告播放器错误
处理电话中断
缓冲/加载选项
设置音高
跳过静音
均衡器
音量增强
  • 通过 just_audio 提供的本地HTTP服务器读取字节流
    ** 需要启用

注意事项

  • just_audioshuffleOrder 当前被忽略,因此推荐通过手动打乱队列并创建新的 ConcatenatingAudioSource 来实现随机播放。
  • ClippingAudioSource 当前不支持(等待 media-kit/media-kit#581 发布)。
  • 尚未测试多个播放器实例,但应该没有问题。

许可证

此包采用Unlicense许可证,但请注意 package:media_kit(本包的直接依赖)采用MIT许可证。有关潜在的许可问题,请参考 package:media_kit

示例代码

下面是一个完整的示例demo,展示了如何在Flutter项目中使用 just_audio_media_kit

import 'package:flutter/material.dart';
import 'package:just_audio_media_kit/just_audio_media_kit.dart';
import 'package:just_audio/just_audio.dart';

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

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

class AudioPlayerScreen extends StatefulWidget {
  @override
  _AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  final AudioPlayer _audioPlayer = AudioPlayer();

  @override
  void initState() {
    super.initState();
    // 初始化插件
    JustAudioMediaKit.ensureInitialized();
    // 设置一些插件特定配置
    JustAudioMediaKit.mpvLogLevel = MPVLogLevel.debug;
    JustAudioMediaKit.bufferSize = 8 * 1024 * 1024;
    JustAudioMediaKit.title = 'My Audio Player App';
    JustAudioMediaKit.protocolWhitelist = const ['http', 'https'];
    JustAudioMediaKit.pitch = true;

    // 加载音频源
    _audioPlayer.setUrl('https://example.com/audio.mp3');
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Player Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            StreamBuilder<PlayerState>(
              stream: _audioPlayer.playerStateStream,
              builder: (context, snapshot) {
                final playerState = snapshot.data;
                final processingState = playerState?.processingState;
                final playing = playerState?.playing;
                if (processingState == ProcessingState.loading ||
                    processingState == ProcessingState.buffering) {
                  return Container(
                    margin: EdgeInsets.all(8.0),
                    width: 64.0,
                    height: 64.0,
                    child: CircularProgressIndicator(),
                  );
                } else if (playing != true) {
                  return IconButton(
                    icon: Icon(Icons.play_arrow),
                    iconSize: 64.0,
                    onPressed: _audioPlayer.play,
                  );
                } else if (processingState != ProcessingState.completed) {
                  return IconButton(
                    icon: Icon(Icons.pause),
                    iconSize: 64.0,
                    onPressed: _audioPlayer.pause,
                  );
                } else {
                  return IconButton(
                    icon: Icon(Icons.replay),
                    iconSize: 64.0,
                    onPressed: () => _audioPlayer.seek(Duration.zero),
                  );
                }
              },
            ),
            StreamBuilder<Duration>(
              stream: _audioPlayer.positionStream,
              builder: (context, snapshot) {
                final position = snapshot.data ?? Duration.zero;
                return Text("${position.inMinutes}:${(position.inSeconds % 60).toString().padLeft(2, '0')}");
              },
            ),
          ],
        ),
      ),
    );
  }
}

这个例子展示了一个简单的音频播放器界面,包括播放、暂停和显示当前播放时间的功能。希望这对您有所帮助!如果有任何问题,欢迎随时提问。


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

1 回复

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


当然,以下是一个关于如何使用Flutter音频媒体处理插件just_audio_media_kit的代码示例。这个插件主要用于在Flutter应用中处理音频播放和控制媒体会话。

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

dependencies:
  flutter:
    sdk: flutter
  just_audio: ^0.10.0  # 请检查最新版本
  just_audio_media_kit: ^0.2.0  # 请检查最新版本

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

接下来,在你的Flutter项目中创建一个简单的音频播放器。以下是一个完整的示例,展示如何使用just_audiojust_audio_media_kit

import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart';
import 'package:just_audio_media_kit/just_audio_media_kit.dart';

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

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

class AudioPlayerScreen extends StatefulWidget {
  @override
  _AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  late AudioPlayer _audioPlayer;
  late MediaSessionHandler _mediaSessionHandler;

  @override
  void initState() {
    super.initState();
    _audioPlayer = AudioPlayer();
    _mediaSessionHandler = MediaSessionHandler(
      audioPlayer: _audioPlayer,
      androidMediaSession: AndroidMediaSession(
        // Optional: Customize the media session notifications
        title: 'Audio Demo',
        artist: 'Flutter Developer',
        album: 'Demo Album',
        albumArtUri: Uri.parse('https://example.com/album_art.jpg'),
      ),
      iosMediaSession: IosMediaSession(
        // Optional: Customize the media session
      ),
    );

    // Load an audio file (replace with your own URL or local asset)
    _audioPlayer.setUrl('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3');

    // Listen for playback events
    _audioPlayer.playbackEventStream.listen((event) {
      // Handle playback events, e.g., updating UI
      print('Playback event: $event');
    });

    // Initialize media session
    _mediaSessionHandler.init();
  }

  @override
  void dispose() {
    _audioPlayer.dispose();
    _mediaSessionHandler.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Player'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // Play or pause audio
                if (_audioPlayer.playing) {
                  await _audioPlayer.pause();
                } else {
                  await _audioPlayer.play();
                }
              },
              child: Text(_audioPlayer.playing ? 'Pause' : 'Play'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // Stop audio
                await _audioPlayer.stop();
              },
              child: Text('Stop'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖安装

    • pubspec.yaml中添加just_audiojust_audio_media_kit依赖。
  2. 初始化

    • 创建一个AudioPlayer实例。
    • 创建一个MediaSessionHandler实例,并配置Android和iOS的媒体会话(可选)。
  3. 加载音频

    • 使用setUrl方法加载音频文件(可以是网络URL或本地资源)。
  4. 事件监听

    • 监听AudioPlayerplaybackEventStream以处理播放事件,例如更新UI。
  5. 媒体会话初始化

    • 调用_mediaSessionHandler.init()初始化媒体会话。
  6. 播放控制

    • 创建简单的播放、暂停和停止按钮,并绑定到相应的AudioPlayer方法。

这个示例展示了如何使用just_audiojust_audio_media_kit进行基本的音频播放和控制。你可以根据需要进一步扩展功能,例如处理更多媒体会话事件、显示通知等。

回到顶部