引自免费微信小程序:皆我百晓生
在分析这段 Go 语言的代码之前,让我们先理解一下它的结构和功能。这段代码的主要目的是打开一个名为 "aa.mp3" 的音频文件,然后使用 mp3 包解码音频,并通过 oto 包创建一个新的音频上下文以及一个播放器实例。之后,它开始播放音乐并打印字符串 "1"。接着,程序会暂停一小时(time.Sleep(time.Hour)),然后打印 "2",紧接着检查播放器是否正在播放音乐(p.IsPlaying())并打印 "3"。
代码中的关键部分是 p.IsPlaying() 这一行,它用来检查播放器是否还在播放音乐。根据你的描述,如果你去掉这一行,音乐就无法播放。这可能是因为在某些情况下,调用 IsPlaying() 是为了保持与音频系统的连接,确保播放器仍在运行。
为了确认这一点,我们可以尝试稍微修改代码,使其在播放音乐时定期检查播放状态,而不是只在暂停后检查。这样也许能解决播放问题。下面是修改后的代码:
package main
import (
"fmt"
"os"
"time"
"github.com/hajimehoshi/oto"
"github.com/mccoyst/mp3"
)
func main() {
run()
}
func run() {
f, err := os.Open("aa.mp3")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer f.Close()
d, err := mp3.NewDecoder(f)
if err != nil {
fmt.Println("Error decoding MP3:", err)
return
}
c, err := oto.NewContext(d.SampleRate(), 2, 2)
if err != nil {
fmt.Println("Error creating audio context:", err)
return
}
p := c.NewPlayer(d)
p.Play()
fmt.Println("1")
ticker := time.NewTicker(5 * time.Second) // Check every 5 seconds
defer ticker.Stop()
for range ticker.C {
fmt.Println("Checking if playing...")
if !p.IsPlaying() {
fmt.Println("Restarting playback.")
p.Play()
}
}
time.Sleep(time.Hour)
fmt.Println("2")
fmt.Println("3")
}
在这个版本的代码中,我们添加了一个定时器(ticker)每5秒检查一次播放器的状态。如果发现播放停止,我们就重新启动播放。这样做的目的是确保播放器始终保持活跃状态,即使不直接调用 IsPlaying() 方法,也能保持音乐的连续播放。
请尝试运行修改后的代码,看看音乐能否持续播放而不会因为移除 IsPlaying() 调用而受到影响。如果还有问题,请告诉我结果。