在 vue 中构建音频播放器;如何在更改绑定后开始播放音频:src?

Posted

技术标签:

【中文标题】在 vue 中构建音频播放器;如何在更改绑定后开始播放音频:src?【英文标题】:Building an audioplayer in vue; how to get the audio to begin playing after changing a bound :src? 【发布时间】:2018-07-09 06:25:28 【问题描述】:

问题示例: https://jsfiddle.net/manfrin/tnszqwpd/58/(警告,加载时将开始播放音乐)。

我有一个看起来像的音频标签

  <audio 
    :src="current" 
    @timeupdate="time = $event.target.currentTime" 
    ref="audio" 
    @ended="nextTrack()" 
    autoload preload="auto" autoplay>
  </audio>

当轨道结束时,它会调用 nextTrack 来更改 src,如下所示:

nextTrack: function () 
    if (this.playlist.length > 0) 
    this.current = this.playlist.shift()
    this.$refs.audio.load()
    this.$refs.audio.play()
    this.playing = true
   else 
    this.current = "";
    this.playing = false;
  
,

当播放列表中有曲目时,它可以正常工作 -- this.current 设置为下一个曲目并开始正常播放。

但是,如果您先清除播放列表(当播放列表为空时按“下一曲目”按钮),然后添加曲目并按播放,则曲目不会开始。我在音频标签上调用play(),它仍然无法播放。

我相信这可能是因为我在设置this.current 之后立即调用this.$refs.audio.play(),所以也许vue 没有及时更新:src 以便在正确的src 上调用play(),但我试过了setTimeout 并没有修复它。此外,我认为nextTrack 在有播放列表时有效,因为设置了autoplay,而不是因为我正在调用加载/播放。

如何同时更改音频标签的 src 并使其以相同的顺序播放?

【问题讨论】:

【参考方案1】:

我已经为此苦苦挣扎了几天,最后我决定发布一个 *** 问题,当然 5 分钟后我弄明白了。

由于我需要依赖我在nextTrack() 方法中设置的状态,我可以使用this.$nextTick。我的 nextTrack/play 看起来像这样:

  nextTrack: function () 
    if (this.playlist.length > 0) 
    this.current = this.playlist.shift()
    this.playing = true
    this.play()
   else 
    this.current = "";
    this.playing = false;
  
,
play: function () 
    if (!this.playing) 
    if (!this.current && this.playlist.length > 0) 
      this.$refs.audio.pause()
      this.current = this.playlist.shift()
    
    if (!this.current) 
      this.playing = false
     else 
      this.playing = true
    
    this.$nextTick(() => 
        if (this.playing) 
        this.$refs.audio.play()
      
    )
   else 
    this.$refs.audio.pause()
    this.playing = false
  
,

重要的部分是这个,特别是:

    this.$nextTick(() => 
        if (this.playing) 
        this.$refs.audio.play()
      
    )

nextTick 允许我等到 vue 处理完状态更新,然后我可以在音频参考上调用 play。

工作 jsfiddle:https://jsfiddle.net/manfrin/tnszqwpd/72/(再次,音频自动播放警告)。

【讨论】:

以上是关于在 vue 中构建音频播放器;如何在更改绑定后开始播放音频:src?的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML5 中更改音频标签的来源

android应用程序中的音频无法播放

Next.Js : 更改页面而不停止音频

Xamarin - 绑定到 ControlTemplate 中的静态类

vue3 自定义 audio音频播放效果

视频播放完毕后开始音频?