cloudrecording

package
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 23, 2024 License: MIT Imports: 5 Imported by: 0

README

云端录制服务

服务简介

云端录制是声网为音视频通话和直播研发的录制组件,提供 RESTful API 供开发者实现录制功能,并将录制文件存至第三方云存储。云端录制有稳定可靠、简单易用、成本可控、方案灵活、支持私有化部署等优势,是在线教育、视频会议、金融监管、客户服务场景的理想录制方案。

环境准备

API V1 接口调用示例

获取云端录制资源

在开始云端录制之前,你需要调用 acquire 方法获取一个 Resource ID。一个 Resource ID 只能用于一次云端录制服务。

需要设置的参数有:

  • appId: 声网的项目 AppID
  • username: 声网的Basic Auth认证的用户名
  • password: 声网的Basic Auth认证的密码
  • cname: 频道名
  • uid: 用户 UID
  • 更多 clientRequest中的参数见Acquire接口文档

通过调用Acquire().Do方法来实现获取云端录制资源

	client := core.NewClient(&core.Config{
		AppID:      appId,
		Credential: core.NewBasicAuthCredential(username, password),
		RegionCode: core.CN,
		Logger:     core.NewDefaultLogger(core.LogDebug),
	})

	cloudRecordingAPI := cloudrecording.NewAPI(client)

	resp, err := cloudRecordingAPI.V1().Acquire().Do(context.TODO(), &v1.AcquirerReqBody{
		Cname: "12321",
		Uid:   "43434",
		ClientRequest: &v1.AcquirerClientRequest{
			Scene:               0,
			ResourceExpiredHour: 24,
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	if resp.IsSuccess() {
		log.Printf("resourceId:%s", resp.SuccessRes.ResourceId)
	} else {
		log.Printf("resp:%+v", resp)
	}
开始云端录制

通过 acquire 方法获取云端录制资源后,调用 start 方法开始云端录制。

需要设置的参数有:

  • cname: 频道名
  • uid: 用户 UID
  • token:用户 UID 对应的token
  • resourceId: 云端录制资源ID
  • mode: 云端录制模式
  • 更多 clientRequest中的参数见Start接口文档

通过调用Start().Do方法来实现开始云端录制

	starterResp, err := cloudRecordingAPI.V1().Start().Do(ctx, resp.SuccessRes.ResourceId, mode, &v1.StartReqBody{
		Cname: cname,
		Uid:   uid,
		ClientRequest: &v1.StartClientRequest{
			Token: token,
			RecordingConfig: &v1.RecordingConfig{
				ChannelType:  1,
				StreamTypes:  2,
				AudioProfile: 2,
				MaxIdleTime:  30,
				TranscodingConfig: &v1.TranscodingConfig{
					Width:            640,
					Height:           260,
					FPS:              15,
					BitRate:          500,
					MixedVideoLayout: 0,
					BackgroundColor:  "#000000",
				},
				SubscribeAudioUIDs: []string{
					"22",
					"456",
				},
				SubscribeVideoUIDs: []string{
					"22",
					"456",
				},
			},
			RecordingFileConfig: &v1.RecordingFileConfig{
				AvFileType: []string{
					"hls",
				},
			},
			StorageConfig: &v1.StorageConfig{
				Vendor:    2,
				Region:    3,
				Bucket:    "xxx",
				AccessKey: "xxxx",
				SecretKey: "xxx",
				FileNamePrefix: []string{
					"xx1",
					"xx2",
				},
			},
		},
	})
	if err != nil {
		log.Fatalln(err)
	}
	if starterResp.IsSuccess() {
		log.Printf("success:%+v", &starterResp.SuccessResp)
	} else {
		log.Printf("failed:%+v", &starterResp.ErrResponse)
	}
停止云端录制

开始录制后,你可以调用 stop 方法离开频道,停止录制。录制停止后如需再次录制,必须再调用 acquire 方法请求一个新的 Resource ID。

需要设置的参数有:

  • cname: 频道名
  • uid: 用户ID
  • resourceId: 云端录制资源ID
  • sid: 会话ID
  • mode: 云端录制模式
  • 更多 clientRequest中的参数见Stop接口文档

因为Stop 接口返回的不是一个固定的结构体,所以需要根据返回的serverResponseMode来判断具体的返回类型

通过调用Stop().Do方法来实现停止云端录制

    stopResp, err := cloudRecordingAPI.V1().Stop().Do(ctx, resourceId, sid, mode, &v1.StopReqBody{
		Cname: cname,
		Uid:   uid,
		ClientRequest: &v1.StopClientRequest{
			AsyncStop: true,
		},
	})
	if err != nil {
		log.Fatalln(err)
	}
	if stopResp.IsSuccess() {
		log.Printf("stop success:%+v", &stopResp.SuccessResp)
	} else {
		log.Fatalf("stop failed:%+v", &stopResp.ErrResponse)
	}
	stopSuccess := stopResp.SuccessResp
	var stopServerResponse interface{}
	switch stopSuccess.GetServerResponseMode() {
	case v1.StopServerResponseUnknownMode:
		log.Fatalln("unknown mode")
	case v1.StopIndividualRecordingServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.StopIndividualRecordingServerResponseMode)
		stopServerResponse = stopSuccess.GetIndividualRecordingServerResponse()
	case v1.StopIndividualVideoScreenshotServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.StopIndividualVideoScreenshotServerResponseMode)
		stopServerResponse = stopSuccess.GetIndividualVideoScreenshotServerResponse()
	case v1.StopMixRecordingHlsServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.StopMixRecordingHlsServerResponseMode)
		stopServerResponse = stopSuccess.GetMixRecordingHLSServerResponse()
	case v1.StopMixRecordingHlsAndMp4ServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.StopMixRecordingHlsAndMp4ServerResponseMode)
		stopServerResponse = stopSuccess.GetMixRecordingHLSAndMP4ServerResponse()
	case v1.StopWebRecordingServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.StopWebRecordingServerResponseMode)
		stopServerResponse = stopSuccess.GetWebRecordingServerResponse()
	}
	log.Printf("stopServerResponse:%+v", stopServerResponse)

查询云端录制状态

开始录制后,你可以调用 query 方法查询录制状态。

需要设置的参数有:

  • cname: 频道名
  • uid: 用户ID
  • resourceId: 云端录制资源ID
  • sid: 会话ID
  • mode: 云端录制模式
  • 更多 clientRequest中的参数见Query接口文档

因为 Query 接口返回的不是一个固定的结构体,所以需要根据返回的serverResponseMode来判断具体的返回类型

通过调用Query().Do方法来实现查询云端录制状态

	queryResp, err := cloudRecordingAPI.V1().Query().Do(ctx, resourceId, sid, mode)
	if err != nil {
		log.Fatalln(err)
	}
	if queryResp.IsSuccess() {
		log.Printf("query success:%+v", queryResp.SuccessResp)
	} else {
		log.Printf("query failed:%+v", queryResp.ErrResponse)
		return
	}

	var queryServerResponse interface{}

	querySuccess := queryResp.SuccessResp
	switch querySuccess.GetServerResponseMode() {
	case v1.QueryServerResponseUnknownMode:
		log.Fatalln("unknown mode")
	case v1.QueryIndividualRecordingServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.QueryIndividualRecordingServerResponseMode)
		queryServerResponse = querySuccess.GetIndividualRecordingServerResponse()
	case v1.QueryIndividualVideoScreenshotServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.QueryIndividualVideoScreenshotServerResponseMode)
		queryServerResponse = querySuccess.GetIndividualVideoScreenshotServerResponse()
	case v1.QueryMixRecordingHlsServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.QueryMixRecordingHlsServerResponseMode)
		queryServerResponse = querySuccess.GetMixRecordingHLSServerResponse()
	case v1.QueryMixRecordingHlsAndMp4ServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.QueryMixRecordingHlsAndMp4ServerResponseMode)
		queryServerResponse = querySuccess.GetMixRecordingHLSAndMP4ServerResponse()
	case v1.QueryWebRecordingServerResponseMode:
		log.Printf("serverResponseMode:%d", v1.QueryWebRecordingServerResponseMode)
		queryServerResponse = querySuccess.GetWebRecording2CDNServerResponse()
	}

	log.Printf("queryServerResponse:%+v", queryServerResponse)
更新云端录制设置

开始录制后,你可以调用 update 方法更新如下录制配置:

  • 对单流录制和合流录制,更新订阅名单。
  • 对页面录制,设置暂停/恢复页面录制,或更新页面录制转推到 CDN 的推流地址(URL)。

需要设置的参数有:

  • cname: 频道名
  • uid: 用户 UID
  • resourceId: 云端录制资源ID
  • sid: 会话ID
  • mode: 云端录制模式
  • 更多 clientRequest中的参数见Update接口文档

通过调用Update().Do方法来实现更新云端录制设置

	updateResp, err := cloudRecordingAPI.V1().Update().Do(ctx, resourceId, sid, mode, &v1.UpdateReqBody{
		Cname: cname,
		Uid:   uid,
		ClientRequest: &v1.UpdateClientRequest{
			StreamSubscribe: &v1.UpdateStreamSubscribe{
				AudioUidList: &v1.UpdateAudioUIDList{
					SubscribeAudioUIDs: []string{
						"999",
					},
				},
				VideoUidList: &v1.UpdateVideoUIDList{
					SubscribeVideoUIDs: []string{
						"999",
					},
				},
			},
		},
	})

	if err != nil {
		log.Fatalln(err)
	}
	if updateResp.IsSuccess() {
		log.Printf("update success:%+v", updateResp.SuccessResp)
	} else {
		log.Printf("update failed:%+v", updateResp.ErrResponse)
		return
	}
更新云端录制合流布局

开始录制后,你可以调用 updateLayout 方法更新合流布局。 每次调用该方法都会覆盖原来的布局设置。例如,在开始录制时设置了 backgroundColor 为 "#FF0000"(红色),如果调用 updateLayout 方法更新合流布局时如果不再设置 backgroundColor 字段,背景色就会变为黑色(默认值)。

需要设置的参数有:

  • cname: 频道名
  • uid: 用户 UID
  • resourceId: 云端录制资源ID
  • sid: 会话ID
  • mode: 云端录制模式
  • 更多 clientRequest中的参数见UpdateLayout接口文档

通过调用UpdateLayout().Do方法来实现更新云端录制合流布局

	updateLayoutResp, err := cloudRecordingAPI.V1().UpdateLayout().Do(ctx, resourceId, sid, mode, &v1.UpdateLayoutReqBody{
		Cname: cname,
		Uid:   uid,
		ClientRequest: &v1.UpdateLayoutClientRequest{
			MixedVideoLayout: 3,
			BackgroundColor:  "#FF0000",
			LayoutConfig: []v1.UpdateLayoutConfig{
				{
					UID:        "22",
					XAxis:      0.1,
					YAxis:      0.1,
					Width:      0.1,
					Height:     0.1,
					Alpha:      1,
					RenderMode: 1,
				},
				{
					UID:        "2",
					XAxis:      0.2,
					YAxis:      0.2,
					Width:      0.1,
					Height:     0.1,
					Alpha:      1,
					RenderMode: 1,
				},
			},
		},
	})
	if err != nil {
		log.Fatalln(err)
	}
	if updateLayoutResp.IsSuccess() {
		log.Printf("updateLayout success:%+v", updateLayoutResp.SuccessResp)
	} else {
		log.Printf("updateLayout failed:%+v", updateLayoutResp.ErrResponse)
		return
	}

错误码和响应状态码处理

具体的业务响应码请参考业务响应码文档

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type API

type API struct {
	// contains filtered or unexported fields
}

func NewAPI

func NewAPI(client core.Client) *API

func (*API) V1

func (a *API) V1() *v1.BaseCollection

Directories

Path Synopsis
v1

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL