Expo AV中sound.setPositionAsync()设置音频起始位置无效问题
Expo Audio 指定位置播放失效的解决方法
问题描述
调用playSound()函数时,音频未从设置的1500ms位置启动,而是默认从0ms开始播放。日志显示初始位置已设置为1500ms,但播放时会重置回起始点,即使使用await修饰setPositionAsync()也未生效。
原代码
//PLaying Sound async function playSound() { console.log('Loading Sound'); const { sound} = await Audio.Sound.createAsync(route.params.url, ); setSound(sound); setsound1(false) sound.setOnPlaybackStatusUpdate(playback_staus_update) console.log('Playing Sound'); sound.setPositionAsync(1500) sound.playAsync() setsound1(false) } //Playback Status Update var y=0 async function playback_staus_update(){ if(sound!=undefined){ var x=await sound.getStatusAsync() console.log(x) if(x.isPlaying){ y++ setcurrentaudposition(x.positionMillis) }else{ console.log('Audio Stopped!'); if(y>1){ setsound1(true) } } } }
解决思路与修复代码
问题核心是setPositionAsync和playAsync均为异步操作,原代码未等待定位完成就执行播放,导致播放操作覆盖了定位结果。需要确保定位完成后再触发播放:
- 给
setPositionAsync添加await,等待定位操作完成 - 可在创建音频实例时直接指定初始位置,提前完成初始化
修改后的playSound函数:
async function playSound() { console.log('Loading Sound'); // 创建音频时直接指定初始播放位置 const { sound } = await Audio.Sound.createAsync( route.params.url, { positionMillis: 1500 } ); setSound(sound); setsound1(false); sound.setOnPlaybackStatusUpdate(playback_staus_update); console.log('Playing Sound'); // 若需动态调整位置,必须等待定位完成再播放 await sound.setPositionAsync(1500); await sound.playAsync(); setsound1(false); }
额外说明
- 创建音频时直接设置
positionMillis,可减少后续异步操作的顺序问题 - 所有音频异步操作都需添加
await,避免状态冲突 - 可通过
playback_staus_update中的positionMillis日志,确认定位是否生效
内容的提问来源于stack exchange,提问作者UTKARSH RANA
相关产品推荐
相关产品推荐

