// 播放声音
async playVoice(){
this.stopPlay();
const { startTime, sentenceContent, articleMaterialType, sentenceId, articleId } = this.sentenceInfo;
this.isPlaying = true;
let src = '';
if (this.articleMaterialType > 0 || articleMaterialType) {
const key = articleId;
const obj = uni.getStorageSync('videoFileObject') || JSON.stringify({});
const videoFileObject = JSON.parse(obj);
const videoPath = videoFileObject[key] || '';
const url = plus.io.convertLocalFileSystemURL(videoPath);
this.innerAudioContextPlay(url);
} else {
src = speak.speak(sentenceContent);
this.innerAudioContextPlay(src);
}
},
innerAudioContextPlay(src){
this.isAwait = false;
if(this.platform != 'iOS') this.initInnerAudioContext();
this.innerAudioContext.autoplay = false;
if(!this.materialUrl || this.platform != 'iOS') this.innerAudioContext.src = src;
this.innerAudioContext.playbackRate = this.playbackRate;
const { articleMaterialType, startTime } = this.sentenceInfo;
this.innerAudioContext.play();
setTimeout(()=>{
this.innerAudioContext.seek(startTime || 0);
console.log(startTime,this.innerAudioContext.currentTime);
}, 0.3*1000)
},
// 音频初始化
initInnerAudioContext(){
if(this.innerAudioContext){
this.innerAudioContext.stop();
this.innerAudioContext.destroy()
}
this.innerAudioContext = uni.createInnerAudioContext();
this.innerAudioContext.onPlay(()=>{
console.log('播放');
});
this.innerAudioContext.onTimeUpdate(this.timeupdate);
// 结束
this.innerAudioContext.onEnded(()=>{
this.isPause = false;
if (this.isHidden > 0) {
this.backEndContinuousPlay();
} else this.continuousPlay();
const e = this.dataList[this.indexNum + 1];
if(!e){
const timing = uni.getStorageSync('localTiming');
if(timing) this.clearDurTimer();
}
});
// 错误
this.innerAudioContext.onError(()=>{
console.log('播放错误');
if (this.isHidden > 0) {
this.backEndContinuousPlay();
} else this.continuousPlay();
});
this.innerAudioContext.onSeeked((err)=>{
console.log(err);
})
}, - 发布:2026-02-06 10:27
- 更新:2026-02-06 10:28
- 阅读:16
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: 10
HBuilderX类型: 正式
HBuilderX版本号: 4.87
手机系统: Android
手机系统版本号: Android 16
手机厂商: 小米
手机机型: 小米13 Ultra
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
示例代码:
操作步骤:
使用https://www.yesww.cn/speech/cloudFile/2025/3/3/1740982363993_acbe93c8ad244cb5b0de38edef480202.MP3这个音频,并且在innerAudioContextPlay里面传入开始时间。
使用https://www.yesww.cn/speech/cloudFile/2025/3/3/1740982363993_acbe93c8ad244cb5b0de38edef480202.MP3这个音频,并且在innerAudioContextPlay里面传入开始时间。
预期结果:
实际音频播放位置为设置的时间值,例如传入12秒则音频从12秒开始播放
实际音频播放位置为设置的时间值,例如传入12秒则音频从12秒开始播放
实际结果:
传入12秒,实际大约从第10秒开始播放,但通过currentTime的又是12秒
传入12秒,实际大约从第10秒开始播放,但通过currentTime的又是12秒
bug描述:
在使用API创建音频上下文进行播放本地下载好的音频的时候,使用seek跳转到音频指定位置时,跳转的音频时间点不对,总是比seek()里面设置的时间晚个大约1秒到两秒,例如seek(12)会从音频的10秒开始播放,但是此时通过innerAudioContext.currentTime获取到的值又是12。仅安卓端会出现这个问题。
1 个回复
Ask小助手 - Ask社区AI助手
【官方评审结论】
反馈完整性
是否为已知/误报
建议与替代方案
a) 在服务器端对音频做一次关键帧对齐转码(如 ffmpeg -keyint_min 1);
b) 改用 uni.getBackgroundAudioManager() 或插件市场带 FFmpeg 解码的播放器插件(搜索「音频 精准 seek」);
c) 对短音频可预加载到内存后使用 Web Audio API(App 端需通过 plus.audio 原生实现)。
结论
该现象属于 Android 系统 MediaPlayer 的 seek 精度限制,非 uni-app bug。建议按上述方案规避,或转需求至「功能改进」类别申请底层播放器替换。
要回复问题请先登录或注册
公告
更多>相关问题