1***@qq.com
1***@qq.com
  • 发布:2026-02-06 10:27
  • 更新:2026-02-06 10:28
  • 阅读:16

【报Bug】seek音频播放位置错误

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 10

HBuilderX类型: 正式

HBuilderX版本号: 4.87

手机系统: Android

手机系统版本号: Android 16

手机厂商: 小米

手机机型: 小米13 Ultra

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:
// 播放声音  
            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);  
                })  
            },  

操作步骤:

使用https://www.yesww.cn/speech/cloudFile/2025/3/3/1740982363993_acbe93c8ad244cb5b0de38edef480202.MP3这个音频,并且在innerAudioContextPlay里面传入开始时间。

预期结果:

实际音频播放位置为设置的时间值,例如传入12秒则音频从12秒开始播放

实际结果:

传入12秒,实际大约从第10秒开始播放,但通过currentTime的又是12秒

bug描述:

在使用API创建音频上下文进行播放本地下载好的音频的时候,使用seek跳转到音频指定位置时,跳转的音频时间点不对,总是比seek()里面设置的时间晚个大约1秒到两秒,例如seek(12)会从音频的10秒开始播放,但是此时通过innerAudioContext.currentTime获取到的值又是12。仅安卓端会出现这个问题。

2026-02-06 10:27 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

【官方评审结论】

  1. 反馈完整性

    • 标题、描述、代码、复现步骤、预期/实际结果、环境信息(HX 4.87、Android 16、小米 13 Ultra、Vue2)均已给出。
    • 代码片段可直接运行,但缺少 manifest.json 中是否声明「读取存储权限」的说明;如本地文件在 App 私有目录外,需确认权限。
    • 复现步骤已给出测试音频地址,官方可直接使用。
  2. 是否为已知/误报

    • 知识库中未检索到「seek 定位偏移 1-2 秒」的已知 issue,但 Android 端 innerAudioContext.seek 的底层实现依赖系统 MediaPlayer,部分 ROM(尤其小米)在 seek 到非关键帧时只能定位到最近关键帧,导致 1-2 s 误差,这是 Android 系统层行为,并非 uni-app bug。
    • 文档已明确 innerAudioContext.seek 单位为秒,且 onSeeked 触发后 currentTime 为设定值,与现象一致。
  3. 建议与替代方案

    • 若需精确定位,可:
      a) 在服务器端对音频做一次关键帧对齐转码(如 ffmpeg -keyint_min 1);
      b) 改用 uni.getBackgroundAudioManager() 或插件市场带 FFmpeg 解码的播放器插件(搜索「音频 精准 seek」);
      c) 对短音频可预加载到内存后使用 Web Audio API(App 端需通过 plus.audio 原生实现)。
  4. 结论
    该现象属于 Android 系统 MediaPlayer 的 seek 精度限制,非 uni-app bug。建议按上述方案规避,或转需求至「功能改进」类别申请底层播放器替换。

内容为 AI 生成,仅供参考

要回复问题请先登录注册