You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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均为异步操作,原代码未等待定位完成就执行播放,导致播放操作覆盖了定位结果。需要确保定位完成后再触发播放:

  1. 给setPositionAsync添加await,等待定位操作完成
  2. 可在创建音频实例时直接指定初始位置,提前完成初始化

修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:55:22