You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

just_audio包播放长音频列表10分钟后自动停止,已加载音频无法播放的问题求助

just_audio包播放长音频列表10分钟后自动停止,已加载音频无法播放的问题求助

大家好,我遇到了一个用just_audio播放音频列表的棘手问题,想请各位帮忙分析下原因:

我有一个很长的音频列表,设置了音频之间的延迟,逐个播放。初始时加载列表的第一个音频,当前一个音频播放结束进入延迟阶段时,我会创建新的AudioPlayer对象,并用setAsset方法加载下一个音频。

刚开始播放一切正常,但运行10分钟后,就算音频已经加载完成,也会停止播放。就算中途跳转到列表里的新音频,播放10分钟后同样会出现这个问题——明明音频已经加载了,就是播不出来。

以下是我的代码:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart';
import 'package:pavamana/globla.dart';

class AudioPLayer extends StatefulWidget {
  const AudioPLayer({super.key, required this.audioList, required this.audio});

  final Map<String, dynamic> audioList;
  final AudioPlayer audio;

  @override
  State<AudioPLayer> createState() => _AudioPlayerState();
}

class _AudioPlayerState extends State<AudioPLayer> {
  int audioCount = 0;
  double gap = 1.5;
  Timer gapTimer = Timer(
    Duration.zero,
        () {},
  );
  String firstLine = "";
  String secondLine = "";
  AudioPlayer? currentPlayingAudio;

  Future changeAudio() async {
    await currentPlayingAudio!
        .setAsset(widget.audioList[audioCount.toString()]["asset"])
        .onError(
          (error, stackTrace) {
        currentPlayingAudio = widget.audio;
        return Duration();
      },
    );
  }

  Future<void> playAudio() async {
    if (currentPlayingAudio == null) {
      await widget.audio.play();
    } else {
      await currentPlayingAudio!.play();
    }
    finishedAudio();
  }

  void finishedAudio() async {
    if (audioCount >= widget.audioList.length - 1) {
      return;
    }
    await widget.audio.pause();
    final startTime = DateTime.now();
    audioCount++;
    currentPlayingAudio = AudioPlayer();
    changeAudio();
    final endTime = DateTime.now();
    final finalTime =endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch;
    gapTimer = Timer(
      Duration(milliseconds: (gap * 1000).toInt() - finalTime),
          () {
        setState(() {});
      },
    );
  }

  @override
  void dispose() {
    super.dispose();
    widget.audio.pause();
    widget.audio.stop();
    widget.audio.dispose();
    if (currentPlayingAudio != null) {
      currentPlayingAudio!.pause();
      currentPlayingAudio!.stop();
    }
  }

  @override
  Widget build(BuildContext context) {
    firstLine = widget.audioList[audioCount.toString()]["first"];
    secondLine = widget.audioList[audioCount.toString()]["second"];
    Future(() {
      playAudio();
    });
    return Scaffold(
      body: Column(
        children: [
          Text(firstLine,),
          Text(secondLine,),
        ],
      ),);
  }
}

我也尝试过在开始播放前一次性加载所有音频播放器,而不是每次播放完前一个音频才创建新的播放器,但问题依然存在。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:03:00