導覽

Go

在 Go 中渲染影片Beta

用 Go SDK 把影片範本渲染成 MP4,並追蹤渲染進度。

影片範本會渲染成 MP4。影片每一秒計為一次生成,60 fps 時計為兩次。如何設計影片範本,請見生成影片。

RenderVideo 和 RenderAndWaitVideo 接受 context、範本 ID 和 modifications。

#templateIDstringrequired

影片範本的 ID,例如 tpl_xxx。

#modifications[]bannerify.Modification

要放進範本圖層的值。影片圖層接受 Src,音訊軌則接受名稱和 src。每種圖層接受哪些欄位,請見 Modifications。

渲染並等待網址

RenderAndWaitVideo 會回傳 MP4 的網址。錯誤是 *ErrorResponse。

headline := "Summer sale"
url, err := client.RenderAndWaitVideo(ctx, "tpl_xxx", []bannerify.Modification{
	{Name: "headline", Text: &headline},
})
if err != nil {
	log.Fatal(err)
}

fmt.Println(url)

追蹤進度

RenderVideo 會回傳 iter.Seq[RenderVideoEvent]。最後一個事件是 done 或 error。

for event := range client.RenderVideo(ctx, "tpl_xxx", nil) {
	switch event.Type {
	case "queued":
		fmt.Printf("%d videos before this one\n", event.Ahead)
	case "progress":
		fmt.Printf("%.0f%%\n", event.Progress*100)
	case "done":
		fmt.Println(event.URL)
	case "error":
		fmt.Println(event.Error)
	}
}
事件 欄位
created ID:影片的 ID,例如 vid_xxx
queued Ahead:排在這部影片前面的影片數量
progress Frame、TotalFrames,以及從 0 到 1 的 Progress
done URL:MP4 的網址
error Error:Code、Message 和 RequestID

被拒絕的請求,例如 API 金鑰無效或配額用完,會產生一個 error 事件。影片可能要排隊好幾分鐘,因此用戶端的逾時時間不適用於渲染。若要停止,請取消 ctx。

連線中斷後重新連線

即使連線中斷,影片仍會渲染到完成。接著 RenderVideo 會用 created 事件中的 ID 再次讀取同一部影片,並繼續產生事件。它不會再次傳送渲染請求,所以你不會為第二部影片付費。

嘗試 嘗試前的等待時間
1 1 秒
2 2 秒
3 4 秒
4 8 秒

嘗試次數用完,或連線在 created 事件之前中斷時,最後一個事件會是代碼為 TIMEOUT_ERROR 的 error。RenderAndWaitVideo 以相同方式重新連線。

不等待就開始影片

CreateVideo 會開始影片,並立即回傳它的 ID,不會等待渲染完成。接著用 GetVideo 或 WatchVideo 讀取影片。錯誤是 *ErrorResponse。

created, err := client.CreateVideo(ctx, "tpl_xxxxxxxxx", nil)
if err != nil {
	log.Fatal(err)
}

fmt.Println(created.ID) // vid_xxx, with the status queued

CreateVideo 只會傳送一次渲染請求。再請求一次,就會渲染第二部影片。

再次讀取影片

請保留 created 事件中的 ID。GetVideo 會回傳影片的狀態,影片完成後也會回傳它的網址。錯誤是 *ErrorResponse。

video, err := client.GetVideo(ctx, "vid_xxx")
if err != nil {
	log.Fatal(err)
}

fmt.Println(video.Status, video.URL)

Status 是 queued、rendering、done 或 failed。失敗的影片有一個 Error 字串。未知的 ID 會得到代碼為 NOT_FOUND 的錯誤。

WatchVideo 會從最新的事件開始,再次產生影片的事件。它沒有 created 事件,重新連線的方式與 RenderVideo 相同。

for event := range client.WatchVideo(ctx, "vid_xxx") {
	if event.Type == "done" {
		fmt.Println(event.URL)
	}
}