首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Flutter/Dart中不播放的情况下获取音频文件的长度

如何在Flutter/Dart中不播放的情况下获取音频文件的长度
EN

Stack Overflow用户
提问于 2019-11-23 01:27:38
回答 8查看 7.7K关注 0票数 4

我正在尝试在Flutter应用程序中显示音频文件的长度。我用过flutter_sound和audioplayers插件,但我不确定如何在不播放音频文件和获取持续时间的情况下获得音频文件的长度(我想在列表中显示每个音频文件的长度,以便用户在播放之前知道它有多长)。除了在其中一个插件中使用播放音频文件的持续时间之外,我在网上找不到任何显示如何在dart中获取音频文件长度的方法。有人知道怎么用dart得到音频文件的长度吗?

EN

回答 8

Stack Overflow用户

发布于 2020-03-13 14:10:24

这是一个迟来的答案,但如果你仍然想知道如何做到这一点,有一个音频库just_audio

代码语言:javascript
复制
final player = AudioPlayer();
var duration = await player.setUrl('file.mp3');

可在android和IOS上运行,同时支持本地文件和下载urls。

票数 5
EN

Stack Overflow用户

发布于 2021-02-03 21:36:06

如果你仍然想使用AudioPlayersAudioCache,那么在实际播放之前加载文件。否则,在实现Slider除法时会出现错误。

使用AudioCache预加载文件,这将返回文件的未来。使用then块链接它,并使用传递的文件,该文件中将包含路径。在音频播放器上设置url并返回它。将这个链接到另一个块中,并在其中从getDuration调用返回未来。现在在将来的构建器中使用它,当快照为空时使用旋转加载器,当快照有值时使用音乐播放器。

考虑这个例子:

代码语言:javascript
复制
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变量中。

代码语言:javascript
复制
  @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变量。在将来的构建器中,我还添加了一个加载器。

代码语言:javascript
复制
return FutureBuilder(
  future: _loadFile,
  builder: (context, snapshot) {
    if (snapshot.data == null)
      return // Implement your loading spinning widget here
    else
      return // Implement your widget here
票数 2
EN

Stack Overflow用户

发布于 2020-08-24 22:12:06

回答晚了,但也许它仍然对某些人有帮助。

您可以像这样尝试flutter_ffmpeg:

代码语言:javascript
复制
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是一个非常大的库,但它避免了播放我也不喜欢的音频文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58999064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档