在 React Native expo-av 中,您似乎不可能将多个声音文件初始化为单个声音对象。此外,不能使用 'sound' 以外的其他变量来初始化另一个声音对象,这样您就可以一次初始化 3 个或 4 个声音文件。因此,声音文件的播放之间会有轻微的停顿,因为每次声音文件播放完毕时声音对象都会重新初始化。那么有没有办法重新编写以下代码,以便消除声音文件播放之间的轻微停顿?目前,对声音对象调用两次 setOnPlaybackStatusUpdate() 函数似乎不是很理想,特别是如果您要一个接一个地播放大约 10 个声音文件,这需要调用 setOnPlaybackStatusUpdate() 10 次。(仅供参考:这些声音文件是数字,因此最好让它们一个接一个流畅地播放而不会停顿。)
const [sound, setSound] = useState();
let data = [
require(`../../assets/en_num_0.mp3`),
require(`../../assets/en_num_1.mp3`),
require(`../../assets/en_num_2.mp3`),
require(`../../assets/en_num_3.mp3`),
require(`../../assets/en_num_4.mp3`),
require(`../../assets/en_num_5.mp3`),
require(`../../assets/en_num_6.mp3`),
require(`../../assets/en_num_7.mp3`),
require(`../../assets/en_num_8.mp3`),
require(`../../assets/en_num_9.mp3`)
];
async function playSound(num1, num2, num3) {
const { sound } = await Audio.Sound.createAsync(data[num1], { shouldPlay: true });
setSound(sound);
await sound.playAsync();
sound.setOnPlaybackStatusUpdate(async (status) => {
if (status.didJustFinish === true) {
const { sound } = await Audio.Sound.createAsync(data[num2], { shouldPlay: true });
setSound(sound);
await sound.playAsync();
sound.setOnPlaybackStatusUpdate(async (status) => {
if (status.didJustFinish === true) {
const { sound } = await Audio.Sound.createAsync(data[num3], { shouldPlay: true });
setSound(sound);
await sound.playAsync();
}
});
}
})
}