Skip to content

Go SDK 接入

Go SDK 适合在无界面的 macOS 或 Linux 程序中连接设备、接收音视频帧,并按需截图或保存播放内容。SDK 不创建播放器界面;应用通过 Output 回调取得解码帧或编码帧,自行渲染、处理或转发。

确认运行环境

  • Go 1.25;
  • CGO_ENABLED=1
  • macOS arm64 或 Linux amd64。

添加 SDK 与构建工具

在应用 module 中执行:

bash
go get github.com/tangeai/tirtc-client-go/v2@v2.4.1
go get -tool github.com/tangeai/tirtc-client-go/v2/cmd/tirtc-build@v2.4.1

使用 tirtc-build 构建 Go 应用并整理运行所需的 TiRTC Native 动态库:

bash
go tool tirtc-build build --output dist/bin/app ./cmd/app

部署时保留整个 dist/ 目录,不要只复制可执行文件。

初始化并创建连接

AppID 来自申请开通CacheDir 必须是可写的绝对路径。deviceID 是目标设备 ID,clientToken 由业务服务端签发,获取方式见连接设备

go
package main

import (
	"context"
	"log"
	"os/signal"
	"syscall"

	tirtc "github.com/tangeai/tirtc-client-go/v2"
)

func main() {
	ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
	defer stop()

	err := tirtc.Init(tirtc.InitOptions{
		AppID:    appID,
		CacheDir: "/var/lib/my-app/tirtc-cache",
	})
	if err != nil {
		log.Fatal(err)
	}
	defer tirtc.Shutdown()

	connectionEnded := make(chan error, 1)
	notifyEnded := func(err error) {
		select {
		case connectionEnded <- err:
		default:
		}
	}
	var conn *tirtc.Conn
	conn, err = tirtc.NewConn(tirtc.ConnOptions{
		OnStateChanged: func(state tirtc.ConnState, err error) {
			log.Printf("RTC state=%v err=%v", state, err)
			if state == tirtc.ConnConnected {
				if subscribeErr := conn.SubscribeVideo(11); subscribeErr != nil {
					notifyEnded(subscribeErr)
				}
			}
			if state == tirtc.ConnDisconnected {
				notifyEnded(err)
			}
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	videoOutput, err := tirtc.NewVideoOutput(tirtc.VideoOutputOptions{
		OnFrame: func(frame tirtc.VideoFrame) {
			renderOrProcess(frame)
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	defer videoOutput.Close()

	if err := videoOutput.Attach(conn, 11); err != nil {
		log.Fatal(err)
	}
	defer videoOutput.Detach()

	if err := conn.Connect(deviceID, clientToken); err != nil {
		log.Fatal(err)
	}

	select {
	case <-ctx.Done():
		_ = conn.Disconnect()
	case err := <-connectionEnded:
		if err != nil {
			log.Printf("connection ended: %v", err)
		}
	}
}

Connect 成功只表示请求已被接受,最终结果通过 OnStateChanged 返回。上例在发起连接前绑定视频 Stream 11,连接成功后订阅同一个 Stream,并保持进程运行到连接结束或收到退出信号。音频使用 AudioOutputSubscribeAudio,调用顺序相同。

需要保存播放内容或截图时,继续看保存播放内容与当前画面。完整 API 和资源释放约束见 Go API 说明

TiRTC 开发文档