【发布时间】:2021-04-25 01:16:02
【问题描述】:
试图通过从事一个项目来学习 React Native,但遇到了阻碍。
目标:尝试创建一种自动播放功能,在按下按钮时音频文件一个接一个地连续播放,并且在再次按下该按钮时也可以暂停。
当前进度:我可以让音频一个接一个地连续播放,没有任何问题。如果你看下面的截图,音频文件是在“useEffect”中加载的,当按下按钮时,它会调用“handlePlayPause”函数,音频会持续播放。
const [autoPlayIndex, setAutoPlayIndex] = useState(0);
const [playBackInstance, setPlayBackInstance] = useState(null);
const [clickNum, setClickNum] = useState(0);
const loadAudio = async () => {
if(autoPlayIndex < data.length) {
if(data[autoPlayIndex].id == 101) {
const { sound } = await Audio.Sound.createAsync(require("../assets/zoning.mp3"), {progressUpdateIntervalMillis: 100});
sound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);
setPlayBackInstance(sound);
} else if (data[autoPlayIndex].id == 103) {
const { sound } = await Audio.Sound.createAsync(require("../assets/draymond_green.mp3"), {progressUpdateIntervalMillis: 100});
sound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);
setPlayBackInstance(sound);
} else {
const { sound } = await Audio.Sound.createAsync({uri: data[autoPlayIndex].file}, {progressUpdateIntervalMillis: 100});
sound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);
setPlayBackInstance(sound);
}
if(clickNum % 2 != 0) {
await playBackInstance.playAsync();
}
}
}
const handlePlayPause = () => {
if(clickNum % 2 == 0) {
playBackInstance.playAsync();
} else {
playBackInstance.pauseAsync()
}
setClickNum(clickNum => clickNum + 1);
}
const handleNext = async () => {
setAutoPlayIndex(autoPlayIndex => autoPlayIndex + 1);
}
const onPlaybackStatusUpdate = async (status) => {
if(status.isPlaying) {
const duration = status.positionMillis;
const length = status.durationMillis;
const diff = length - duration;
setTimeRemaining(Moment.utc(diff).format("m:ss"));
}
if(status.didJustFinish) {
handleNext();
}
}
useEffect(() => {
if(data.length != 0 ) {
loadAudio();
}
}, [autoPlayIndex, clickNum]);
问题:音频文件不会立即暂停,而是在播放完当前音频剪辑后暂停。不知道究竟是为什么,因为我指定了“pauseAsync()”,但它似乎是某种异步问题之类的。
参考文献:
对此问题的任何帮助将不胜感激!谢谢!
【问题讨论】:
-
请发布代码而不是代码图片,这些图片不适合移动设备,不可搜索,不可复制和粘贴,不适合屏幕阅读器。
-
@jnpdx 抱歉。刚刚更新了问题!
标签: react-native expo audio-player