Intercom.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package Intercom
  2. import (
  3. "log"
  4. "os/exec"
  5. )
  6. type Intercom struct {
  7. Volume int `toml:"Volume"`
  8. queue chan []byte
  9. }
  10. func (i *Intercom) Init() {
  11. i.queue = make(chan []byte, 10)
  12. }
  13. func (i *Intercom) Add(data []byte) {
  14. i.queue <- data
  15. }
  16. func (i *Intercom) Start() {
  17. for {
  18. // 创建 ffplay 命令
  19. // -i pipe:0 表示从标准输入读取数据
  20. cmd := exec.Command("ffplay", "-nodisp", "-autoexit", "-i", "pipe:0")
  21. // 获取命令的标准输入
  22. stdin, err := cmd.StdinPipe()
  23. if err != nil {
  24. log.Fatalf("无法获取标准输入: %v\n", err)
  25. }
  26. // 启动 ffplay
  27. if err := cmd.Start(); err != nil {
  28. log.Fatalf("无法启动 ffplay: %v\n", err)
  29. }
  30. // 将音频数据写入标准输入
  31. _, err = stdin.Write(<-i.queue)
  32. if err != nil {
  33. log.Fatalf("无法写入音频数据: %v\n", err)
  34. }
  35. // 关闭标准输入
  36. if err := stdin.Close(); err != nil {
  37. log.Fatalf("无法关闭标准输入: %v\n", err)
  38. }
  39. // 等待 ffplay 退出
  40. if err := cmd.Wait(); err != nil {
  41. log.Fatalf("播放失败: %v\n", err)
  42. }
  43. }
  44. }