flutter - 使用 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,
);
},
),
但是,滑块的行为与预期相差甚远。我无法寻找,它也不会移动。如何解决这个问题?
解决方案
您可以直接使用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()],
),
),
);
}
}
推荐阅读
- wordpress - 如何更改密码更改电子邮件的内容。这可能吗?
- python - 是否可以在我的烧瓶应用程序中将图形界面集成到网页中?
- python - 在 python 中的 virtualenv 中运行命令
- javascript - 如何在单个标签中使用两个 data-min 和 data-max 属性
- python - 工厂类方法是否违反了 Liskov 替换原则?
- angular7 - 如何在foreach中添加延迟
- python-3.x - 如何显示仪表板
- r - 从几个横截面中提取数据点的子集
- delphi - 如何读取未知大小的未知类型文件
- python - Python - 将不同值的组合计算为总和