当前位置: 首页 > 知识库问答 >
问题:

react-native - expo-av如何实现动态播放本地音频?

富建章
2023-11-03

我想实现一个基于 expo 开发的 RN 项目,里面有很多的音频文件,点击不同的按钮播放不同的音频,音频文件如果坚持使用本地文件,还有其他的可行方案吗?
感谢��

前提条件:

  • 动态播放
  • 本地音频文件

目前我查到的解决方法有 2 种,但都不是很符合我的需求

方案 1

引入全部,然后以下标方式使用,因为我音频文件有点多,似乎这个不是很好的解决方法

  {    "paths": [        require('./assets/one.mp3'),        require('./assets/two.mp3'),        require('./assets/three.mp3'),    ]  }

参考:https://stackoverflow.com/questions/75410617/how-to-load-local-audio-files-dynamically-with-expo-av

方案 2

改成线上链接

expo官方的解释是 require statements actually "require" a static string,建议动态播放的话音频文件改成线上链接

参考:https://github.com/expo/expo/issues/4332

我想做一个单机的 app,所以也 pass

共有1个答案

松秦斩
2023-11-03

对于你的问题,我理解你需要实现一个基于 Expo 开发的 React Native 项目,其中包含多个本地音频文件,并且希望通过点击不同的按钮来动态播放这些音频文件。然而,你希望避免使用方案1(全部引入)和方案2(线上链接)。

尽管如此,还是有一些其他的解决方案可以考虑。

方案3:使用动态导入

你可以考虑使用动态导入(dynamic imports)的方式。这是一种 JavaScript 的特性,允许你在运行时加载模块。这样,你就可以只导入需要的音频文件,而不是全部都导入。

例如:

buttonOne.addEventListener('click', async () => {    const sound = await Expo.Audio.loadAsync(require('./assets/one.mp3'));    const player = new Expo.Audio.Players.create(sound);    player.play();});buttonTwo.addEventListener('click', async () => {    const sound = await Expo.Audio.loadAsync(require('./assets/two.mp3'));    const player = new Expo.Audio.Players.create(sound);    player.play();});

在上述代码中,当用户点击不同的按钮时,会动态加载并播放不同的音频文件。注意,这里的 require 是动态的,它会在运行时决定加载哪个文件。

方案4:使用文件系统(FileSystem)API

Expo 的 FileSystem API 允许你访问项目中的文件系统。你可以使用这个 API 来读取和播放你的本地音频文件。

例如:

buttonOne.addEventListener('click', async () => {    const fileSystem = new Expo.FileSystem.FileSystem();    const sound = await fileSystem.readAsync(new Expo.FileSystem.Asset('assets/one.mp3'));    const player = new Expo.Audio.Players.create(sound);    player.play();});

在上述代码中,我们首先创建了一个 FileSystem 实例,然后使用 readAsync 方法读取音频文件,然后创建一个音频播放器并播放这个音频。这个方法可以避免动态导入的冗余代码,因为你只需要在创建播放器时指定音频文件的位置。

 类似资料:
  • 我正在使用Expo构建一个react原生应用程序。我用的是“EXPO-AV”。 我无法在后台播放我的音频文件。 我有以下的,但仍然不能使它工作,当我切换我的应用程序到另一个应用程序。我没有任何错误;音乐就停在我的应用程序里了。有什么建议可以让它工作吗?或者我的代码可能出了问题?

  • 本文向大家介绍Android10.0实现本地音乐播放(附源码下载),包括了Android10.0实现本地音乐播放(附源码下载)的使用技巧和注意事项,需要的朋友参考一下 1.概述 本篇文章仅是Android小白在写一个小程序,内容仅供参考,有很多不足之处希望各位大神指出,文章末尾有整个项目的下载,不需要币,只求帮你们解决到问题的同时收获到一颗小小的赞。这个项目中还有很多不足的地方,如:在按键中设置图

  • 问题内容: 我正在制作音频播放器。它具有暂停,倒带和时间搜索功能。如何以及由谁处理音频元素? 我可以把它放在商店旁边。我不能将其直接放在状态上,因为它可能会被克隆。然后,在减速器中,我可以与其进行交互。问题是,如果我需要将时间滑块与音频同步,则需要使用动作不断地轮询商店。从语义上讲,这也没有任何意义。 我可以创建一个自定义的React组件Audio,它可以完成我所说的一切。问题没有解决。如何刷新滑

  • 我目前正在尝试学习反应原生。我使用create-react-nate-app创建了一个项目。项目创建后,我在显示二维码的文件夹上启动了npm start。我已经在我的android手机上安装了expo应用程序并扫描了代码,但我收到了未捕获的错误:超时,我的expo应用程序上的缓存中没有清单,并且没有给出堆栈跟踪。 我已经让它工作了一段时间,但不知何故,它目前不工作。 我正在使用windows 10

  • 我在造一个Xamarin。Forms应用程序本质上是一个音频播放器,我需要为两个平台上的音频播放器实现锁屏控制(用户可以播放/暂停/ff/rw音频播放器而无需解锁手机)。我以前从来没有这样做过,我很难找到可靠的文档来解释它是如何完成的。 有没有可能在Xamarin.Forms中实现这一功能,或者我必须在iOS和Android原生项目中分别实现这一功能?在这两种情况下,如何实现?我是初级学生,需要一

  • 问题内容: 我正在模拟器中测试我的应用。 我正在下载文件,并以这种方式获取本地文件: 现在,我想使用AVAudioPlayer播放此文件,但是我总是遇到此错误: 播放代码: 我应该如何播放? 问题答案: 在iOS8下,您保存的路径在启动期间将无效。您看到的ID“ E5F13797-A6A8-48A1-B3C3-FBC3D7A03151”将随每次启动而更改。 解决方案是保存文件名而不是完整路径,并通