0%

OBS for Mac 多平台推送辅助工具开发笔记

OBS for Mac 多平台推送辅助工具的开发笔记

开发环境

本程序选择Go 语言的fyne框架完成 GUI 的设计。
主要具有三大块的功能: 1.配置文件操作 2. 使用osascript启动终端窗口运行命令 3. 配合ffmpeg完成多路推流功能。
而本文也将针对这三大块功能,依次展开的描述。

配置文件读取

这一部分功能是最简单的,在程序路径下创建一个配置文件,每次把新添加的推流路径追加到配置文件最后。配置路径的每一行对应一条推流路径。删除整个文件就实现了删除全部推流路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const fileName = ".multi-push.conf"
func insert(newRTMP string){
_, err := os.Stat(fileName) //os.Stat获取文件信息
if err != nil {
if !os.IsExist(err) {
os.Create(fileName)
}
}
f, err := os.OpenFile(fileName, os.O_WRONLY, 0600)
defer f.Close()
if err != nil {
fmt.Println(err.Error())
} else {
n, _ := f.Seek(0, os.SEEK_END)
// 从末尾的偏移量开始写入内容
_, err = f.WriteAt([]byte(newRTMP+"\n"), n)
}
}
func showAll() string {
var contentByte []byte
f, err := os.OpenFile(fileName, os.O_CREATE,0600)
defer f.Close()
if err !=nil {
fmt.Println(err.Error())
panic(err)
} else {
contentByte,err=ioutil.ReadAll(f)
}
return string(contentByte)
}

调用终端窗口运行命令

这部分是这个程序最核心的部分,我选择使用命令创建一个新的终端窗口执行命令,这样做可以不阻塞整个程序的运行,同时也方便观察命令运行的效果。
执行命令的函数如下:

1
2
3
4
5
6
7
func exec_shell(s string) (string){
cmd := exec.Command(`osascript`, "-s", "h", "-e",`tell application "Terminal" to do script `+s)
if err := cmd.Run(); err != nil {
fmt.Println("Error: ", err)
}
return "OK"
}

一个使用上述函数安装 FFmpeg 的例子如下:

1
exec_shell("\"brew install ffmpeg && exit\" ")

其他方面的总结

  1. 使fyne支持中文显示
    fyne框架默认是不支持中文显示的,为了让fyne显示中文,需要在系统中创建一个环境变量FYNE_FONT,然后赋予中文字体路径。而这里遇到的问题是不同的系统中安装有不同的字体,只能通过不断的尝试,将大家都拥有的中文字体添加进去。这里我只写了两种常见的系统中文字体。具体的代码如下:

在程序文件中添加下方的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func init() {
fontPaths := findfont.List()
for _, path := range fontPaths {
// fmt.Println(path)
//楷体:simkai.ttf
//黑体:simhei.ttf
if strings.Contains(path, "STHeiti Light.ttc") {
os.Setenv("FYNE_FONT", path)
break
}else if strings.Contains(path, "simkai.ttf") {
os.Setenv("FYNE_FONT", path)
break
}
}
}

并且,在main函数的最后,添加下方的语句.

1
_ = os.Unsetenv("FYNE_FONT")
  1. 多平台推流命令
    结合 FFmpeg 工具,我使用下方的命令实现多平台推流。
    1
    ffmpeg -re -i rtmp://127.0.0.1/live/HkJDIOgMd -acodec aac -vcodec h264 -flags +global_header -strict experimental -f tee -map 0:v -map 0:a "[f=flv]rtmp://live-push.bilivideo.com/live-bvc/?streamname=XXXX&key=XXXX&schedule=rtmp | [f=flv]rtmp://live-push.bilivideo.com/live-bvc/?streamname=XXXX&key=XXXX&schedule=rtmp"
    后面可以结合管道符不断追加直播地址,所有直播页面的内容都是同步推送的,延时很低。