Flutter - 播放来自平台特定文件夹的声音文件(例如 Android 的 android/app/src/main/res/raw)

Posted

技术标签:

【中文标题】Flutter - 播放来自平台特定文件夹的声音文件(例如 Android 的 android/app/src/main/res/raw)【英文标题】:Flutter - Play sound files from platform specific folders (e.g. android/app/src/main/res/raw for Android) 【发布时间】:2022-01-18 10:44:17 【问题描述】:

在我的 Flutter 应用程序中,我将一些自定义声音文件放在 android/app/src/main/res/raw 中,用作通知音。现在我想在用户选择使用Just audio 包时播放这些声音。不确定如何引用和播放这些文件(或平台文件夹中的任何资源,就此而言)。现在我不得不将它们复制到资产文件夹并从那里播放,这显然不是一个好的解决方案。

【问题讨论】:

为什么资产会不好?您是如何从资产中播放它们的? 我使用的通知包 (pub.dev/packages/awesome_notifications) 不支持资产中的声音文件,并要求将它们放置在该特定位置。 【参考方案1】:

对于原始资源,您可以使用:

Audiosource.uri(Uri('rawresource:///resourceId'))

【讨论】:

如何使用它来播放位于res/raw/abc.m4a的文件?答案中没有这样的 Uri 构造函数。尝试使用 Uri(scheme: 'rawresource', path: 'raw/abc')Uri(scheme: 'rawresource', path: 'abc') 但出现错误。 我想知道这在 Flutter 中是否可以实现,正如 this SO answer 中提到的那样 “但是,您将无法直接将可绘制项目共享给 Flutter”跨度> 资源名称是abc,所以你可以使用这个:Uri.parse('rawresource:///abc)。这应该起作用的原因是 just_audio 将您的 URI 直接传递给解释它的 ExoPlayer,这就是 ExoPlayer 应该如何解释这个 URI。一个例外是,如果您的 URI 具有 asset 方案。这不会传递给 ExoPlayer,它会被 just_audio 拦截,而是从你的颤振资产中加载文件。 这会出现以下错误:E/ExoPlayerImplInternal(29564): Caused by: com.google.android.exoplayer2.upstream.RawResourceDataSource$RawResourceDataSourceException: Resource identifier must be an integer. 有关更多信息,您可以在此处查看 ExoPlayer 文档:exoplayer.dev/doc/reference/com/google/android/exoplayer2/… just_audio 会将您的 URI 直接传递给 ExoPlayer,然后该页面解释 ExoPlayer 如何解释您的资源 URI。

以上是关于Flutter - 播放来自平台特定文件夹的声音文件(例如 Android 的 android/app/src/main/res/raw)的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Audioplayers 延迟

手机进入睡眠状态时不播放自定义通知声音

在特定时间段内播放声音

AudioKit - 使用音序器在特定位置播放声音文件

Flutter - 播放自定义声音更新了吗?

在 python 中播放声音文件的跨平台方式是啥?