Flutter加载.mp3文件时出现“无法加载资产”的错误。

8

我正在使用audioplayers包为我的应用程序添加声音,但在第一次构建时没有播放声音。然而,在热重启时加载文件时,我会得到以下异常:

E/flutter (32175): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Unable to load asset: assets/assets/click.mp3
E/flutter (32175): #0      PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:221:7)
E/flutter (32175): <asynchronous suspension>
E/flutter (32175): #1      AudioCache._fetchAsset (package:audioplayers/audio_cache.dart:60:29)
E/flutter (32175): #2      AudioCache.fetchToMemory (package:audioplayers/audio_cache.dart:67:30)
E/flutter (32175): <asynchronous suspension>
E/flutter (32175): #3      AudioCache.load (package:audioplayers/audio_cache.dart:82:37)
E/flutter (32175): #4      AudioCache.getAbsoluteUrl (package:audioplayers/audio_cache.dart:140:23)
E/flutter (32175): #5      AudioCache.play (package:audioplayers/audio_cache.dart:103:24)
E/flutter (32175): #6      _MapScreenState.build.<anonymous closure> (package:fixit_cloud_biking/Screens/map_screen.dart:1239:46)
E/flutter (32175): #7      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
E/flutter (32175): #8      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
E/flutter (32175): #9      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (32175): #10     TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11)
E/flutter (32175): #11     BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5)
E/flutter (32175): #12     BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:199:7)
E/flutter (32175): #13     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:467:9)
E/flutter (32175): #14     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter (32175): #15     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:117:9)
E/flutter (32175): #16     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter (32175): #17     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:115:18)
E/flutter (32175): #18     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:7)
E/flutter (32175): #19     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter (32175): #20     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (32175): #21     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (32175): #22     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (32175): #23     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (32175): #24     _rootRunUnary (dart:async/zone.dart:1138:13)
E/flutter (32175): #25     _CustomZone.runUnary (dart:async/zone.dart:1031:19)
E/flutter (32175): #26     _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7)
E/flutter (32175): #27     _invoke1 (dart:ui/hooks.dart:273:10)
E/flutter (32175): #28     _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)
E/flutter (32175): 

我将文件放在与所有图标使用的图片位于同一资产文件夹中,因此pubspec.yaml文件中的缩进是正确的。 问题不应该是文件命名,因为我使用驼峰命名法或单词命名(从命名带空格的图像中得出教训..)。 值得一提的是,如果我将文件拖放到assets文件夹上,就会出现错误。我尝试删除文件夹,重新创建它,然后拖放会起作用,但只能一次..第二次添加的文件会引发错误。 这是应该播放声音的按钮:

IconButton(
                        icon: Image.asset('assets/centerMapButton.png'),
                        iconSize: 60,
                        onPressed: () async {
                          await widget.cache.play('assets/click.mp3',
                              volume: 50, mode: PlayerMode.MEDIA_PLAYER);
                          print('Center map button pressed');
                          _mapController.move(userLocation, 16);
                        }),

AudioCache()被声明为AudioCache cache = new AudioCache();


1
第二次添加文件后,您是否重新启动了应用程序(通过停止和重新启动)? - Constantin N.
我尝试了两种情况,一种是应用程序正在运行时,另一种是应用程序没有运行。我解决了文件加载问题,因为事实证明路径不必指定,插件直接查找资产文件夹。play('assets/click.mp3')是错误的,play('click.mp3')按预期工作。我从错误信息Unable to load asset: assets/assets/click.mp3中注意到'assets/'出现了两次,所以我尝试省略它,结果成功了。但我仍然需要解决拖放文件添加问题,因为使用finder复制文件可以正常工作,但显然有些问题。 - Vincenzo
这真的很奇怪。 - Constantin N.
是的,我打算尝试将项目文件夹移动到另一个驱动器上,看看是否有任何区别。 - Vincenzo
@Vincenzo 这实际上是设计上的。您可以在此处阅读文档:https://github.com/luanpotter/audioplayers/blob/master/doc/audio_cache.md - Midhun MP
@MidhunMP 确实是按设计来的。我认为必须指定文件路径,但在看到它可以正常工作后,我更仔细地查看了文档并发现了这一点。谢谢。 - Vincenzo
5个回答

7
如果您未在pubspec.yaml中设置资产位置,在just_audio可能会发生这种情况。
flutter:
  assets:
    - audio/

这告诉Flutter在您的项目根目录下有一个audio文件夹,其中包含音频资产。
这样做后,您应该能够像这样设置资产并播放它:
await player.setAsset('audio/cow.mp3');
player.play();

错误也可能是因为您在路径中拼错了某些内容,但我假设您已经检查过了。

3

试着更改这个路径:

assets/click.mp3

为:

click.mp3

我也遇到了同样的错误,路径中忽略了 "assets/" 会使其从本地无缝播放声音。Audioplayers 默认路径为 assets/。


嗨。欢迎并感谢您的回答。幸运的是,我确实发现了这一点,并且由于MidhumMP的评论,我明白了原因。再次感谢并欢迎加入社区。 - Vincenzo

1
清空资产文件夹对我有帮助:
await AudioPlayer.clearAssetCache();

清除插件的内部资产缓存目录。当应用程序的资产发生更改时,请调用此功能以强制从资产包重新获取资产。请保留HTML标签。

0

错误在于assets,你不需要写它。


您的答案可以通过添加更多支持信息来改进。请[编辑]以添加进一步详细信息,例如引用或文档,以便他人可以确认您的答案是否正确。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

0
如果你的资源路径是:lib/assets/audio/
并且在你的文件pubspec.yaml中
资源: - lib/assets/audio/
class Sound {
  static final AudioPlayer player = AudioPlayer();

  static void playSound(int option){
    player.audioCache.prefix = 'lib/assets/audio/';
    player.setPlayerMode(PlayerMode.mediaPlayer);
    player.play(AssetSource('note$option.wav'), mode: PlayerMode.lowLatency);
    player.audioCache.clearAll();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接