一星辰一 2024-04-28 15:47 采纳率: 0%
浏览 9

Go语言,一段奇怪的代码


func run() {
    f, _ := os.Open("aa.mp3")
    d, _ := mp3.NewDecoder(f)
    c, _, _ := oto.NewContext(d.SampleRate(), 2, 2)
    p := c.NewPlayer(d)
    p.Play()
    fmt.Println("1")
    time.Sleep(time.Hour)
    fmt.Println("2")
    p.IsPlaying()
    fmt.Println("3")
}

音乐播放代码片段。有p.IsPlaying()的时候可以正常播放音乐,没有这个东西就播放不了,我不知道为什么,控制台输出也没有差别

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-28 15:47
    关注

    引自免费微信小程序:皆我百晓生

    在分析这段 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() 调用而受到影响。如果还有问题,请告诉我结果。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月28日