首页 > 解决方案 > 使用 assets_audio_player 颤振音频滑块

问题描述

我正在尝试创建一个滑块来观看音频进度并寻找音频的某些部分。为了播放本地音频文件,我使用了这个assets_audio_player包。这是我的代码:

import 'package:assets_audio_player/assets_audio_player.dart';

...
...

final AssetsAudioPlayer _assetsAudioPlayer = AssetsAudioPlayer();

...
...

StreamBuilder<Duration>(
stream: _assetsAudioPlayer.currentPosition,
builder: (BuildContext context, AsyncSnapshot <Duration> snapshot) {

final Duration _currentDuration = snapshot.data;
final int _milliseconds = _currentDuration.inMilliseconds;
final int _songDurationInMilliseconds = snapshot.data.inMilliseconds;

return Slider(
    min: 0,
    max: _songDurationInMilliseconds.toDouble(),
    value: _songDurationInMilliseconds > _milliseconds
            ? _milliseconds.toDouble()
            : _songDurationInMilliseconds.toDouble(),
    onChanged: (double value) {
    _assetsAudioPlayer.seek(Duration(milliseconds: (value / 1000.0).toInt()));
    },
    activeColor: Colors.blue,
    inactiveColor: Colors.grey,
  );
},
),

但是,滑块的行为与预期相差甚远。我无法寻找,它也不会移动。如何解决这个问题?

标签: flutteraudioslider

解决方案


您可以直接使用https://github.com/samupra/local_flutter_audio_player
它具有您需要的所有功能

代码片段

Widget slider() {
    return Slider(
        value: _position.inSeconds.toDouble(),
        min: 0.0,
        max: _duration.inSeconds.toDouble(),
        onChanged: (double value) {
          setState(() {
            seekToSecond(value.toInt());
            value = value;
          });});
  }

  Widget localAsset() {
    return _tab([
      Text('Play Local Asset \'audio.mp3\':'),
      _btn('Play', () => audioCache.play('audio.mp3')),
      _btn('Pause',() => advancedPlayer.pause()),
      _btn('Stop', () => advancedPlayer.stop()),
      slider()
    ]);
  }

工作演示

在此处输入图像描述

完整代码

import 'package:audioplayers/audio_cache.dart';
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart';

typedef void OnError(Exception exception);

void main() {
  runApp(new MaterialApp(home: new ExampleApp()));
}

class ExampleApp extends StatefulWidget {
  @override
  _ExampleAppState createState() => new _ExampleAppState();
}

class _ExampleAppState extends State<ExampleApp> {
  Duration _duration = new Duration();
  Duration _position = new Duration();
  AudioPlayer advancedPlayer;
  AudioCache audioCache;

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

  void initPlayer(){
    advancedPlayer = new AudioPlayer();
    audioCache = new AudioCache(fixedPlayer: advancedPlayer);

    advancedPlayer.durationHandler = (d) => setState(() {
      _duration = d;
    });

    advancedPlayer.positionHandler = (p) => setState(() {
    _position = p;
    });
  }

  String localFilePath;

  Widget _tab(List<Widget> children) {
    return Center(
      child: Container(
        padding: EdgeInsets.all(16.0),
        child: Column(
          children: children
              .map((w) => Container(child: w, padding: EdgeInsets.all(6.0)))
              .toList(),
        ),
      ),
    );
  }

  Widget _btn(String txt, VoidCallback onPressed) {
    return ButtonTheme(
        minWidth: 48.0,
        child: RaisedButton(child: Text(txt), onPressed: onPressed));
  }

  Widget slider() {
    return Slider(
        value: _position.inSeconds.toDouble(),
        min: 0.0,
        max: _duration.inSeconds.toDouble(),
        onChanged: (double value) {
          setState(() {
            seekToSecond(value.toInt());
            value = value;
          });});
  }

  Widget localAsset() {
    return _tab([
      Text('Play Local Asset \'audio.mp3\':'),
      _btn('Play', () => audioCache.play('audio.mp3')),
      _btn('Pause',() => advancedPlayer.pause()),
      _btn('Stop', () => advancedPlayer.stop()),
      slider()
    ]);
  }

  void seekToSecond(int second){
    Duration newDuration = Duration(seconds: second);

    advancedPlayer.seek(newDuration);
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 1,
      child: Scaffold(
        appBar: AppBar(
          bottom: TabBar(
            tabs: [
              Tab(text: 'Local Asset'),
            ],
          ),
          title: Text('audioplayers Example'),
        ),
        body: TabBarView(
          children: [localAsset()],
        ),
      ),
    );
  }
}

推荐阅读