Flutter音视频进度条插件audio_video_progress_bar的使用

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

Flutter音视频进度条插件audio_video_progress_bar的使用

audio_video_progress_bar 是一个用于显示或更改音频或视频流位置的进度条小部件。它本身并不播放音频或视频,而是与音频或视频播放器配合使用,以直观地展示播放进度和缓冲状态。

功能特点

  • 显示播放进度:通过 progress 参数设置当前播放时间。
  • 显示缓冲进度:通过 buffered 参数设置已缓冲的时间。
  • 总时长:通过 total 参数设置媒体的总时长。
  • 拖动选择时间点:通过 onSeek 回调函数实现用户拖动进度条选择播放时间点的功能。
  • 自定义样式:支持自定义进度条的颜色、高度、圆角等样式属性。
  • 时间标签位置:可以设置时间标签的位置(如上下方或两侧)。

示例代码

1. 简单静态示例

ProgressBar(
  progress: Duration(milliseconds: 1000),
  buffered: Duration(milliseconds: 2000),
  total: Duration(milliseconds: 5000),
  onSeek: (duration) {
    print('User selected a new time: $duration');
  },
),

2. 结合播放器使用的动态示例

通常情况下,我们会将 ProgressBar 包装在一个 StreamBuilder 中,以便根据播放器的状态实时更新进度条。以下是一个完整的示例,展示了如何与 just_audio 插件结合使用:

主要依赖库

pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  audio_video_progress_bar: ^latest_version
  just_audio: ^latest_version

完整示例代码

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

class AudioPlayerManager {
  final AudioPlayer player = AudioPlayer();

  Stream<DurationState> get durationState => player.positionStream
      .combineLatest3(
        player.bufferedPositionStream,
        player.durationStream,
        (position, buffered, duration) => DurationState(
          position,
          buffered,
          duration ?? Duration.zero,
        ),
      );

  Future<void> init() async {
    // 初始化播放器并加载音频文件
    await player.setUrl('https://example.com/your-audio-file.mp3');
  }

  void dispose() {
    player.dispose();
  }
}

class DurationState {
  const DurationState(this.progress, this.buffered, this.total);
  final Duration progress;
  final Duration buffered;
  final Duration total;
}

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

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

class HomeWidget extends StatefulWidget {
  @override
  _HomeWidgetState createState() => _HomeWidgetState();
}

class _HomeWidgetState extends State<HomeWidget> {
  late AudioPlayerManager manager;

  @override
  void initState() {
    super.initState();
    manager = AudioPlayerManager();
    manager.init();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Audio Player')),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Column(
          children: [
            Expanded(
              child: StreamBuilder<DurationState>(
                stream: manager.durationState,
                builder: (context, snapshot) {
                  final durationState = snapshot.data;
                  final progress = durationState?.progress ?? Duration.zero;
                  final buffered = durationState?.buffered ?? Duration.zero;
                  final total = durationState?.total ?? Duration.zero;
                  return ProgressBar(
                    progress: progress,
                    buffered: buffered,
                    total: total,
                    onSeek: (duration) {
                      manager.player.seek(duration);
                    },
                  );
                },
              ),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                StreamBuilder<PlayerState>(
                  stream: manager.player.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: 32.0,
                        height: 32.0,
                        child: CircularProgressIndicator(),
                      );
                    } else if (playing != true) {
                      return IconButton(
                        icon: Icon(Icons.play_arrow),
                        iconSize: 32.0,
                        onPressed: manager.player.play,
                      );
                    } else if (processingState != ProcessingState.completed) {
                      return IconButton(
                        icon: Icon(Icons.pause),
                        iconSize: 32.0,
                        onPressed: manager.player.pause,
                      );
                    } else {
                      return IconButton(
                        icon: Icon(Icons.replay),
                        iconSize: 32.0,
                        onPressed: () => manager.player.seek(Duration.zero),
                      );
                    }
                  },
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

自定义样式

你可以通过传递不同的参数来自定义 ProgressBar 的外观。例如:

ProgressBar(
  progress: progress,
  buffered: buffered,
  total: total,
  progressBarColor: Colors.red, // 进度条颜色
  baseBarColor: Colors.white.withOpacity(0.24), // 底部背景颜色
  bufferedBarColor: Colors.white.withOpacity(0.24), // 缓冲部分颜色
  thumbColor: Colors.white, // 拖动手柄颜色
  barHeight: 3.0, // 进度条高度
  thumbRadius: 5.0, // 拖动手柄半径
  onSeek: (duration) {
    _player.seek(duration);
  },
  timeLabelLocation: TimeLabelLocation.sides, // 时间标签位置
);

总结

audio_video_progress_bar 是一个非常实用且易于集成的插件,能够帮助开发者快速实现音视频播放器中的进度条功能。通过与 just_audio 或其他播放器插件结合使用,可以轻松构建出功能完善的音视频播放界面。希望这篇教程对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是一个关于如何使用Flutter中的audio_video_progress_bar插件来实现音视频进度条的示例代码。请注意,为了运行这个示例,你需要确保已经安装了audio_video_progress_bar插件以及任何必要的依赖项。

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

dependencies:
  flutter:
    sdk: flutter
  audio_video_progress_bar: ^最新版本号  # 替换为实际可用的最新版本号

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

接下来,我们编写一个简单的Flutter应用,其中包含一个音视频播放器和一个进度条。为了演示起见,这里我们假设你有一个可以播放的音视频文件URL。

import 'package:flutter/material.dart';
import 'package:audio_video_progress_bar/audio_video_progress_bar.dart';
import 'package:chewie/chewie.dart';  // 一个流行的视频播放器库,用于演示
import 'package:video_player/video_player.dart' as videoPlayer;

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  videoPlayer.VideoPlayerController? _controller;
  videoPlayer.ChewieController? _chewieController;

  @override
  void initState() {
    super.initState();
    _controller = videoPlayer.VideoPlayerController.network(
      '你的音视频文件URL',  // 替换为你的音视频文件URL
    );
    _initializeChewieController();
  }

  Future<void> _initializeChewieController() async {
    if (_controller!.value.isInitialized) {
      setState(() {
        _chewieController = videoPlayer.ChewieController(
          _controller!,
          aspectRatio: _controller!.value.aspectRatio,
          autoPlay: false,
          looping: false,
          customProgressBar: AudioVideoProgressBar(
            controller: _controller!,
            color: Colors.blue,
            bufferedColor: Colors.grey,
            playedColor: Colors.red,
            height: 5.0,
          ),
        );
      });
    } else {
      await _controller!.initialize().then((_) {
        setState(() {
          _chewieController = videoPlayer.ChewieController(
            _controller!,
            aspectRatio: _controller!.value.aspectRatio,
            autoPlay: false,
            looping: false,
            customProgressBar: AudioVideoProgressBar(
              controller: _controller!,
              color: Colors.blue,
              bufferedColor: Colors.grey,
              playedColor: Colors.red,
              height: 5.0,
            ),
          );
        });
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Video Progress Bar Demo'),
      ),
      body: Center(
        child: _controller!.value.isInitialized
            ? Chewie(_chewieController!)
            : Container(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            if (_controller!.value.isPlaying) {
              _controller!.pause();
            } else {
              _controller!.play();
            }
          });
        },
        child: Icon(
          _controller!.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }

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

在这个示例中,我们使用了video_playerchewie库来播放音视频文件,并使用audio_video_progress_bar库来自定义进度条。Chewie是一个基于video_player的高级视频播放器控件,它提供了许多方便的功能,包括播放、暂停、全屏等。

请确保将'你的音视频文件URL'替换为实际的音视频文件URL。

运行这个应用,你将看到一个带有自定义进度条的视频播放器。进度条的颜色、缓冲颜色和已播放颜色可以根据你的需求进行调整。

回到顶部