我正在尝试在Flutter应用程序中显示音频文件的长度。我用过flutter_sound和audioplayers插件,但我不确定如何在不播放音频文件和获取持续时间的情况下获得音频文件的长度(我想在列表中显示每个音频文件的长度,以便用户在播放之前知道它有多长)。除了在其中一个插件中使用播放音频文件的持续时间之外,我在网上找不到任何显示如何在dart中获取音频文件长度的方法。有人知道怎么用dart得到音频文件的长度吗?
发布于 2020-03-13 14:10:24
这是一个迟来的答案,但如果你仍然想知道如何做到这一点,有一个音频库just_audio
final player = AudioPlayer();
var duration = await player.setUrl('file.mp3');可在android和IOS上运行,同时支持本地文件和下载urls。
发布于 2021-02-03 21:36:06
如果你仍然想使用AudioPlayers和AudioCache,那么在实际播放之前加载文件。否则,在实现Slider除法时会出现错误。
使用AudioCache预加载文件,这将返回文件的未来。使用then块链接它,并使用传递的文件,该文件中将包含路径。在音频播放器上设置url并返回它。将这个链接到另一个块中,并在其中从getDuration调用返回未来。现在在将来的构建器中使用它,当快照为空时使用旋转加载器,当快照有值时使用音乐播放器。
考虑这个例子:
Future<int> loadFile() {
return audioCache.loadFile(widget.fileName)
.then((value) {
print(value);
cachedFilePath = value.path;
return audioPlayer.setUrl(value.path, isLocal: true);
})
.then((value) => audioPlayer.getDuration());
}我在initState中调用了这个函数,以避免多次调用future,并将future存储在Future变量中。
@override
void initState() {
print("init");
super.initState();
audioPlayer = AudioPlayer();
audioCache.init();
audioPlayer.onDurationChanged.listen((d) => setState(() => _duration = d));
audioPlayer.onAudioPositionChanged.listen((p) => setState(() => _position = p));
audioPlayer.onPlayerCompletion.listen((event) {
setState(() {
_position = Duration(seconds: 0);
issongplaying = false;
});
});
_loadFile = loadFile();
}接下来,我在未来的构建器中使用了_loadFile变量。在将来的构建器中,我还添加了一个加载器。
return FutureBuilder(
future: _loadFile,
builder: (context, snapshot) {
if (snapshot.data == null)
return // Implement your loading spinning widget here
else
return // Implement your widget here发布于 2020-08-24 22:12:06
回答晚了,但也许它仍然对某些人有帮助。
您可以像这样尝试flutter_ffmpeg:
import 'package:flutter_ffmpeg/flutter_ffmpeg.dart';
import 'package:flutter_ffmpeg/log_level.dart';
final FlutterFFprobe _flutterFFprobe = new FlutterFFprobe();
Future<int> lenghOfAudio(File audio)async{
Map info = await _flutterFFprobe.getMediaInformation(audio.path);
// the given duration is in milliseconds, assuming you want to have seconds I divide by 1000
int seconds = (info['duration']/1000).round();
print('DURATION: ${seconds.toString()}');
return seconds;
}当然,对于这么小的任务,ffmpeg是一个非常大的库,但它避免了播放我也不喜欢的音频文件。
https://stackoverflow.com/questions/58999064
复制相似问题