Flutter 音频插件无法处理我的音乐链接

Mar*_* Dz 5 avplayer android-mediaplayer firebase flutter

希望有人正面临我的问题或可以提供解决方案。我使用 firebase 来保存和播放我的音乐。来自我的数据库项目的以下流链接不适用于 AudioManager ( https://pub.dev/packages/audio_manager ) 或 audioplayers 插件 ( https://pub.dev/packages/audioplayers ),我没有找到任何其他插件它以正确的方式工作的地方。老实说,让它与 AudioManager 插件一起工作会很棒。我还尝试在两个插件提供程序项目中提出问题,但目前没有任何成功。

我面临的问题: 功能停止功能无法识别停止。上一个和下一个以及 PlayPause 仅适用于延迟。在提供的示例中,我使用 AudioManager 插件。

在提供的示例中,我们有一个水平列表,当您按下右上角的按钮时,我试图停止播放音乐。使用流媒体链接无法识别任何内容。它忽略停止歌曲。下一首歌曲也有轻微的延迟。

如果您将音频链接更改为带有文件结尾的链接,则停止播放歌曲的效果非常好,延迟也更少。在我的情况下更重要的是在没有文件结尾的情况下获取链接源!

var audioFiles = [
    "https://docs.google.com/uc?export=open&id=1SaJWqfQuHnFtL7uqrzfYG31hzOnqDM3r",
    "https://docs.google.com/uc?export=open&id=1FZkFMjQyWguAl0RMAsYDEZ07c_Qf7gjz",
    "https://docs.google.com/uc?export=open&id=1GqrwQ3eRuiil0p-Na_R1tMAvggp9YrbH",
  ];
Run Code Online (Sandbox Code Playgroud)

如果您使用文件类型结尾的链接,如下例所示,一切正常且没有延迟:

var audioFiles = [
    "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3",
    "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3",
    "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-3.mp3"
  ];
Run Code Online (Sandbox Code Playgroud)

重现代码:

import 'package:audio_manager/audio_manager.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int currentIndex = 0;

  @override
  Widget build(BuildContext context) {
    // Page selector for tab list
    void _selectPage(int index) {
      print('page index: $index');
      setState(() {
        currentIndex = index;
      });
    }

    // Routes list for tab navigation Android
    final List<Widget> _pages = [
      ScreenA(),
      ScreenB(func: _selectPage),
    ];

    return Scaffold(
      appBar: AppBar(),
      body: _pages[currentIndex],
      bottomNavigationBar: SafeArea(
        child: BottomNavigationBar(
          onTap: _selectPage,
          iconSize: 22,
          currentIndex: currentIndex,
          type: BottomNavigationBarType.fixed,
          items: [
            BottomNavigationBarItem(
              backgroundColor: Theme.of(context).primaryColor,
              icon: Icon(Icons.description),
              label: 'ScreenA',
            ),
            BottomNavigationBarItem(
                backgroundColor: Theme.of(context).primaryColor,
                icon: Icon(Icons.ac_unit_outlined),
                label: 'ScreenB'),
          ],
        ),
      ),
    );
  }
}

class ScreenA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('HOME'),
    );
  }
}

class ScreenB extends StatefulWidget {
  Function func;
  ScreenB({Key key, @required this.func}) : super(key: key);
  @override
  _ScreenBState createState() => _ScreenBState();
}

var audioFiles = [
    "https://docs.google.com/uc?export=open&id=1SaJWqfQuHnFtL7uqrzfYG31hzOnqDM3r",
    "https://docs.google.com/uc?export=open&id=1FZkFMjQyWguAl0RMAsYDEZ07c_Qf7gjz",
    "https://docs.google.com/uc?export=open&id=1GqrwQ3eRuiil0p-Na_R1tMAvggp9YrbH",
  ];
var audioIndex = 0;

class _ScreenBState extends State<ScreenB> {

  //var _controller = PageController();
  PlayMode playMode = AudioManager.instance.playMode;

  var globalIndex =0;

  @override
  void initState() {
    // TODO: implement initState
    
    List<AudioInfo> _list = [];
    for (var i = 0; i < audioFiles.length; i++) {
      _list.add(AudioInfo(audioFiles[i], coverUrl: '', desc: '', title: ''));
    }

    print(_list);

    AudioManager.instance.audioList = _list;
    //AudioManager.instance.intercepter = true;
    AudioManager.instance.play(auto: true);

    super.initState();
  }


@override
void dispose() {
    // TODO: implement dispose
   // AudioManager.instance.release();
    super.dispose();
  }

  var lastPage =0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          IconButton(
            icon: Icon(Icons.close),
            onPressed: () {
              AudioManager.instance.stop();
              widget.func(0);
            },
          ),
        ],
      ),
      body: PageView.custom(
          onPageChanged: (page){
            if(page != lastPage){
              if(lastPage < page){
                print('swipe right');
                lastPage = page;
                setState(() {
                //audioIndex = page;
                AudioManager.instance.next();
                });
              } else{
                print('swipe left');
                lastPage = page;
              }
            }
          },
          //controller: _controller,
          physics: PageScrollPhysics(),
          scrollDirection: Axis.horizontal,
          childrenDelegate: SliverChildBuilderDelegate((ctx, pageIndex) =>
              // GestureDetector(
              //     onPanUpdate: (details) {
              //       if (details.delta.dx < 0) {
              //         _controller.nextPage(
              //             duration: Duration(milliseconds: 200),
              //             curve: Curves.easeInOut);

              //         setState(() {
              //           //audioIndex = pageIndex;
              //           AudioManager.instance.next();
              //         });
                      
              //       }
              //     },
                  //child: 
                  Center(
                      child: Container(
                          width: 200,
                          height: 200,
                          color: Colors.red,
                          child: Text(audioFiles[audioIndex]))))),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)