package Intercom import ( "log" "os/exec" ) type Intercom struct { Volume int `toml:"Volume"` queue chan []byte } func (i *Intercom) Init() { i.queue = make(chan []byte, 10) } func (i *Intercom) Add(data []byte) { i.queue <- data } func (i *Intercom) Start() { for { // 创建 ffplay 命令 // -i pipe:0 表示从标准输入读取数据 cmd := exec.Command("ffplay", "-nodisp", "-autoexit", "-i", "pipe:0") // 获取命令的标准输入 stdin, err := cmd.StdinPipe() if err != nil { log.Fatalf("无法获取标准输入: %v\n", err) } // 启动 ffplay if err := cmd.Start(); err != nil { log.Fatalf("无法启动 ffplay: %v\n", err) } // 将音频数据写入标准输入 _, err = stdin.Write(<-i.queue) if err != nil { log.Fatalf("无法写入音频数据: %v\n", err) } // 关闭标准输入 if err := stdin.Close(); err != nil { log.Fatalf("无法关闭标准输入: %v\n", err) } // 等待 ffplay 退出 if err := cmd.Wait(); err != nil { log.Fatalf("播放失败: %v\n", err) } } }