Flutter音频播放插件last_pod_player的使用

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

Flutter音频播放插件last_pod_player的使用

描述

last_pod_player 是一个基于 Flutter 官方 video_player 插件构建的简单易用的视频播放器,支持在 Flutter Web 和移动端设备上播放来自 YouTube 和 Vimeo 的视频。它提供了类似于 YouTube 播放器的控制功能,并且可以根据需要自定义控件。

支持平台

  • Android:✅
  • iOS:✅
  • Web:✅

功能特性

  • 播放 YouTube 视频(通过视频 URL 或 ID)
  • 播放 Vimeo 视频(通过视频 ID,带或不带哈希)
  • 播放 Vimeo 私有视频(通过视频 ID,带或不带哈希,以及访问令牌)
  • 类似于 YouTube 的视频覆盖层
  • 双击以快进/快退视频
  • 点击视频时显示/隐藏视频覆盖层
  • 自动隐藏覆盖层
  • 更改播放速度
  • 自定义覆盖层
  • 自定义进度条
  • 自定义标签
  • 更改视频质量(适用于 Vimeo 和 YouTube)
  • 启用/禁用全屏播放器
  • 支持直播 YouTube 视频
  • [待办] 支持视频播放列表

Web 特性

  • 双击视频播放器以启用/禁用全屏
  • 静音/取消静音
  • 视频播放器与键盘集成
    • SPACE:播放/暂停视频
    • M:静音/取消静音
    • F:启用/禁用全屏
    • ESC:启用/禁用全屏
    • ->:向前快进视频
    • <-:向后快退视频
  • 双击视频(启用/禁用全屏)

示例代码

以下是一个完整的示例 Demo,展示了如何使用 last_pod_player 播放来自不同来源的视频。

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

void main() {
  // 启用日志记录
  PodVideoPlayer.enableLogs = true;
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      routes: {
        '/fromVimeoId': (context) => const PlayVideoFromVimeoId(),
        '/fromVimeoPrivateId': (context) => const PlayVideoFromVimeoPrivateId(),
        '/fromYoutube': (context) => const PlayVideoFromYoutube(),
        '/fromAsset': (context) => const PlayVideoFromAsset(),
        '/fromNetwork': (context) => const PlayVideoFromNetwork(),
        '/fromNetworkQualityUrls': (context) =>
            const PlayVideoFromNetworkQualityUrls(),
        '/customVideo': (context) => const CustomVideoControlls(),
      },
      home: const MainPage(),
    );
  }
}

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

  [@override](/user/override)
  State<MainPage> createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('last_pod_player Demo'),
      ),
      body: Center(
        child: ListView(
          shrinkWrap: true,
          children: [
            _button(
              '从网络播放视频',
              onPressed: () => Navigator.of(context).pushNamed('/fromNetwork'),
            ),
            _button(
              '从YouTube播放视频',
              onPressed: () => Navigator.of(context).pushNamed('/fromYoutube'),
            ),
            _button(
              '从网络播放带有质量选择的视频',
              onPressed: () =>
                  Navigator.of(context).pushNamed('/fromNetworkQualityUrls'),
            ),
            _button(
              '从资源文件播放视频(带自定义标签)',
              onPressed: () => Navigator.of(context).pushNamed('/fromAsset'),
            ),
            _button(
              '从Vimeo播放视频',
              onPressed: () => Navigator.of(context).pushNamed('/fromVimeoId'),
            ),
            _button(
              '从Vimeo播放私有视频',
              onPressed: () =>
                  Navigator.of(context).pushNamed('/fromVimeoPrivateId'),
            ),
            _button(
              '自定义视频播放器',
              onPressed: () => Navigator.of(context).pushNamed('/customVideo'),
            ),
          ],
        ),
      ),
    );
  }

  Widget _button(String text, {void Function()? onPressed}) {
    return Center(
      child: Padding(
        padding: const EdgeInsets.all(20),
        child: OutlinedButton(
          onPressed: onPressed ?? () {},
          child: Text(
            text,
            style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
          ),
        ),
      ),
    );
  }
}

// 播放来自网络的视频
class PlayVideoFromNetwork extends StatelessWidget {
  const PlayVideoFromNetwork({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('从网络播放视频'),
      ),
      body: Center(
        child: PodVideoPlayer(
          videoUrl: 'https://www.example.com/video.mp4', // 替换为实际的视频URL
        ),
      ),
    );
  }
}

// 播放来自YouTube的视频
class PlayVideoFromYoutube extends StatelessWidget {
  const PlayVideoFromYoutube({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('从YouTube播放视频'),
      ),
      body: Center(
        child: PodVideoPlayer(
          videoUrl: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', // 替换为实际的YouTube视频URL
        ),
      ),
    );
  }
}

// 播放来自Vimeo的视频
class PlayVideoFromVimeoId extends StatelessWidget {
  const PlayVideoFromVimeoId({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('从Vimeo播放视频'),
      ),
      body: Center(
        child: PodVideoPlayer(
          videoUrl: 'https://vimeo.com/123456789', // 替换为实际的Vimeo视频ID
        ),
      ),
    );
  }
}

// 播放来自Vimeo的私有视频
class PlayVideoFromVimeoPrivateId extends StatelessWidget {
  const PlayVideoFromVimeoPrivateId({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('从Vimeo播放私有视频'),
      ),
      body: Center(
        child: PodVideoPlayer(
          videoUrl: 'https://vimeo.com/123456789', // 替换为实际的Vimeo视频ID
          accessToken: 'your_vimeo_access_token', // 替换为实际的Vimeo访问令牌
        ),
      ),
    );
  }
}

// 播放来自资源文件的视频
class PlayVideoFromAsset extends StatelessWidget {
  const PlayVideoFromAsset({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('从资源文件播放视频'),
      ),
      body: Center(
        child: PodVideoPlayer(
          videoUrl: 'assets/videos/sample_video.mp4', // 替换为实际的资源文件路径
        ),
      ),
    );
  }
}

// 播放带有质量选择的视频
class PlayVideoFromNetworkQualityUrls extends StatelessWidget {
  const PlayVideoFromNetworkQualityUrls({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('从网络播放带有质量选择的视频'),
      ),
      body: Center(
        child: PodVideoPlayer(
          videoUrl: 'https://www.example.com/video.mp4', // 替换为实际的视频URL
          qualityUrls: {
            '360p': 'https://www.example.com/video_360p.mp4',
            '720p': 'https://www.example.com/video_720p.mp4',
            '1080p': 'https://www.example.com/video_1080p.mp4',
          }, // 替换为实际的质量选择URL
        ),
      ),
    );
  }
}

// 自定义视频播放器
class CustomVideoControlls extends StatelessWidget {
  const CustomVideoControlls({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('自定义视频播放器'),
      ),
      body: Center(
        child: PodVideoPlayer(
          videoUrl: 'https://www.example.com/video.mp4', // 替换为实际的视频URL
          customControls: CustomControls(), // 使用自定义控件
        ),
      ),
    );
  }
}

// 自定义控件类
class CustomControls extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        // 自定义进度条
        Slider(
          value: 0.5, // 当前播放进度
          onChanged: (value) {
            // 处理进度条变化
          },
        ),
        // 自定义按钮
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            IconButton(
              icon: Icon(Icons.play_arrow),
              onPressed: () {
                // 处理播放按钮点击
              },
            ),
            IconButton(
              icon: Icon(Icons.pause),
              onPressed: () {
                // 处理暂停按钮点击
              },
            ),
            IconButton(
              icon: Icon(Icons.stop),
              onPressed: () {
                // 处理停止按钮点击
              },
            ),
          ],
        ),
      ],
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用last_pod_player插件进行音频播放的代码示例。last_pod_player是一个强大的音频播放插件,支持多种音频控制功能。

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

dependencies:
  flutter:
    sdk: flutter
  last_pod_player: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,我们来看一个简单的示例,展示如何使用last_pod_player进行音频播放。

1. 导入依赖并初始化

在你的主Dart文件中(例如main.dart),导入必要的包并初始化LastPodPlayer

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

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

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

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

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  LastPodPlayer? _player;

  @override
  void initState() {
    super.initState();
    _initPlayer();
  }

  Future<void> _initPlayer() async {
    _player = await LastPodPlayer.init();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Player'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _playAudio,
              child: Text('Play Audio'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pauseAudio,
              child: Text('Pause Audio'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _stopAudio,
              child: Text('Stop Audio'),
            ),
          ],
        ),
      ),
    );
  }

  void _playAudio() {
    if (_player != null) {
      _player!.play('path/to/your/audio/file.mp3');
    }
  }

  void _pauseAudio() {
    if (_player != null) {
      _player!.pause();
    }
  }

  void _stopAudio() {
    if (_player != null) {
      _player!.stop();
    }
  }

  @override
  void dispose() {
    _player?.dispose();
    super.dispose();
  }
}

2. 播放音频文件

在上面的代码中,我们定义了三个按钮:播放、暂停和停止。点击按钮时,会调用相应的音频控制方法。

  • _playAudio方法用于播放音频文件。你需要将'path/to/your/audio/file.mp3'替换为你的实际音频文件路径。
  • _pauseAudio方法用于暂停当前播放的音频。
  • _stopAudio方法用于停止音频播放。

3. 清理资源

dispose方法中,我们调用_player?.dispose()来释放音频播放器资源,这是一个良好的编程实践,可以避免内存泄漏。

注意事项

  • 确保音频文件路径正确。你可以使用本地文件路径或网络URL。
  • 在实际项目中,你可能需要处理更多的状态管理,比如播放进度、音量控制等。last_pod_player提供了丰富的API来满足这些需求。

通过上述代码示例,你应该能够在Flutter应用中成功集成并使用last_pod_player插件进行音频播放。如果你需要更多高级功能,请参考last_pod_player的官方文档

回到顶部