1

在 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();

                }
            });
        }
    })

}
4

0 回答 0