123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- 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)
- }
- }
- }
|