一、服务端四种混流模板 1、悬浮模板(LayoutParams.Template = 0):
第一个进入房间的用户的视频画面会铺满整个屏幕,其他用户的视频画面从左下角依次水平排列,显示为小画面。 最多4行,每行最多4个,小画面悬浮于大画面之上。 最多支持1个大画面和15个小画面。 如果用户只发送音频,仍然会占用画面位置。
代码如下:
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.trtc.v20190722.TrtcClient;
import com.tencentcloudapi.trtc.v20190722.models.*;;
public class StartMCUMixTranscode
{
public static void main(String [] args) {
try{
Credential cred = new Credential("SecretId", "SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("trtc.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
TrtcClient client = new TrtcClient(cred, "ap-guangzhou", clientProfile);
StartMCUMixTranscodeRequest req = new StartMCUMixTranscodeRequest();
req.setSdkAppId(1400505488L);
req.setRoomId(661L);
OutputParams outputParams1 = new OutputParams();
outputParams1.setStreamId("crk661");
outputParams1.setPureAudioStream(0L);
outputParams1.setRecordId("crk");
outputParams1.setRecordAudioOnly(0L);
req.setOutputParams(outputParams1);
EncodeParams encodeParams1 = new EncodeParams();
encodeParams1.setVideoWidth(720L);
encodeParams1.setVideoHeight(1280L);
encodeParams1.setVideoBitrate(1500L);
encodeParams1.setVideoFramerate(20L);
encodeParams1.setVideoGop(3L);
encodeParams1.setBackgroundColor(3394560L);
encodeParams1.setAudioSampleRate(48000L);
encodeParams1.setAudioBitrate(64L);
encodeParams1.setAudioChannels(2L);
encodeParams1.setAudioCodec(0L);
req.setEncodeParams(encodeParams1);
LayoutParams layoutParams1 = new LayoutParams();
layoutParams1.setTemplate(0L);
layoutParams1.setMainVideoUserId("666");
layoutParams1.setMainVideoStreamType(0L);
SmallVideoLayoutParams smallVideoLayoutParams1 = new SmallVideoLayoutParams();
smallVideoLayoutParams1.setUserId("555");
smallVideoLayoutParams1.setStreamType(0L);
smallVideoLayoutParams1.setImageWidth(350L);
smallVideoLayoutParams1.setImageHeight(350L);
smallVideoLayoutParams1.setLocationX(370L);
smallVideoLayoutParams1.setLocationY(930L);
layoutParams1.setSmallVideoLayoutParams(smallVideoLayoutParams1);
layoutParams1.setMainVideoRightAlign(0L);
String[] mixVideoUids1 = {"111", "222", "333", "444"};
layoutParams1.setMixVideoUids(mixVideoUids1);
req.setLayoutParams(layoutParams1);
PublishCdnParams publishCdnParams1 = new PublishCdnParams();
publishCdnParams1.setBizId(9926L);
String[] publishCdnUrls1 = {"http://cctv.com"};
publishCdnParams1.setPublishCdnUrls(publishCdnUrls1);
req.setPublishCdnParams(publishCdnParams1);
StartMCUMixTranscodeResponse resp = client.StartMCUMixTranscode(req);
System.out.println(StartMCUMixTranscodeResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
2、九宫格模板(LayoutParams.Template = 1):
所有用户的视频画面大小一致,平分整个屏幕,人数越多,每个画面的尺寸越小。 最多支持16个画面,如果用户只发送音频,仍然会占用画面位置。
代码如下:
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.trtc.v20190722.TrtcClient;
import com.tencentcloudapi.trtc.v20190722.models.*;;
public class StartMCUMixTranscode
{
public static void main(String [] args) {
try{
Credential cred = new Credential("SecretId", "SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("trtc.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
TrtcClient client = new TrtcClient(cred, "ap-guangzhou", clientProfile);
StartMCUMixTranscodeRequest req = new StartMCUMixTranscodeRequest();
req.setSdkAppId(1400505488L);
req.setRoomId(661L);
OutputParams outputParams1 = new OutputParams();
outputParams1.setStreamId("crk661");
outputParams1.setPureAudioStream(0L);
outputParams1.setRecordId("crk");
outputParams1.setRecordAudioOnly(0L);
req.setOutputParams(outputParams1);
EncodeParams encodeParams1 = new EncodeParams();
encodeParams1.setVideoWidth(720L);
encodeParams1.setVideoHeight(1280L);
encodeParams1.setVideoBitrate(1500L);
encodeParams1.setVideoFramerate(20L);
encodeParams1.setVideoGop(3L);
encodeParams1.setBackgroundColor(3394560L);
encodeParams1.setAudioSampleRate(48000L);
encodeParams1.setAudioBitrate(64L);
encodeParams1.setAudioChannels(2L);
encodeParams1.setAudioCodec(0L);
req.setEncodeParams(encodeParams1);
LayoutParams layoutParams1 = new LayoutParams();
layoutParams1.setTemplate(1L);
layoutParams1.setMainVideoUserId("666");
layoutParams1.setMainVideoStreamType(0L);
SmallVideoLayoutParams smallVideoLayoutParams1 = new SmallVideoLayoutParams();
smallVideoLayoutParams1.setUserId("555");
smallVideoLayoutParams1.setStreamType(0L);
smallVideoLayoutParams1.setImageWidth(350L);
smallVideoLayoutParams1.setImageHeight(350L);
smallVideoLayoutParams1.setLocationX(370L);
smallVideoLayoutParams1.setLocationY(930L);
layoutParams1.setSmallVideoLayoutParams(smallVideoLayoutParams1);
layoutParams1.setMainVideoRightAlign(0L);
String[] mixVideoUids1 = {"111", "222", "333", "444"};
layoutParams1.setMixVideoUids(mixVideoUids1);
layoutParams1.setPureAudioHoldPlaceMode(0L);
req.setLayoutParams(layoutParams1);
PublishCdnParams publishCdnParams1 = new PublishCdnParams();
publishCdnParams1.setBizId(9926L);
String[] publishCdnUrls1 = {"http://cctv.com"};
publishCdnParams1.setPublishCdnUrls(publishCdnUrls1);
req.setPublishCdnParams(publishCdnParams1);
StartMCUMixTranscodeResponse resp = client.StartMCUMixTranscode(req);
System.out.println(StartMCUMixTranscodeResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
3、屏幕分享模板(LayoutParams.Template = 2)
适合视频会议和在线教育场景的布局。 屏幕分享(或者主讲的摄像头)始终占据屏幕左侧的大画面位置,其他用户依次垂直排列于右侧。 需要通过 LayoutParams.MainVideoUserId 和 LayoutParams.MainVideoStreamType 这两个参数来指定左侧主画面的内容。 最多两列,每列最多8个小画面。最多支持1个大画面和15个小画面。 如果用户只发送音频,仍然会占用画面位置。
代码如下:
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.trtc.v20190722.TrtcClient;
import com.tencentcloudapi.trtc.v20190722.models.*;;
public class StartMCUMixTranscode
{
public static void main(String [] args) {
try{
Credential cred = new Credential("SecretId", "SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("trtc.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
TrtcClient client = new TrtcClient(cred, "ap-guangzhou", clientProfile);
StartMCUMixTranscodeRequest req = new StartMCUMixTranscodeRequest();
req.setSdkAppId(1400505488L);
req.setRoomId(661L);
OutputParams outputParams1 = new OutputParams();
outputParams1.setStreamId("crk661");
outputParams1.setPureAudioStream(0L);
outputParams1.setRecordId("crk");
outputParams1.setRecordAudioOnly(0L);
req.setOutputParams(outputParams1);
EncodeParams encodeParams1 = new EncodeParams();
encodeParams1.setVideoWidth(720L);
encodeParams1.setVideoHeight(1280L);
encodeParams1.setVideoBitrate(1500L);
encodeParams1.setVideoFramerate(20L);
encodeParams1.setVideoGop(3L);
encodeParams1.setBackgroundColor(3394560L);
encodeParams1.setAudioSampleRate(48000L);
encodeParams1.setAudioBitrate(64L);
encodeParams1.setAudioChannels(2L);
encodeParams1.setAudioCodec(0L);
req.setEncodeParams(encodeParams1);
LayoutParams layoutParams1 = new LayoutParams();
layoutParams1.setTemplate(2L);
layoutParams1.setMainVideoUserId("666");
layoutParams1.setMainVideoStreamType(0L);
SmallVideoLayoutParams smallVideoLayoutParams1 = new SmallVideoLayoutParams();
smallVideoLayoutParams1.setUserId("555");
smallVideoLayoutParams1.setStreamType(0L);
smallVideoLayoutParams1.setImageWidth(350L);
smallVideoLayoutParams1.setImageHeight(350L);
smallVideoLayoutParams1.setLocationX(370L);
smallVideoLayoutParams1.setLocationY(930L);
layoutParams1.setSmallVideoLayoutParams(smallVideoLayoutParams1);
layoutParams1.setMainVideoRightAlign(0L);
String[] mixVideoUids1 = {"111", "222", "333", "444"};
layoutParams1.setMixVideoUids(mixVideoUids1);
layoutParams1.setPureAudioHoldPlaceMode(0L);
req.setLayoutParams(layoutParams1);
PublishCdnParams publishCdnParams1 = new PublishCdnParams();
publishCdnParams1.setBizId(9926L);
String[] publishCdnUrls1 = {"http://cctv.com"};
publishCdnParams1.setPublishCdnUrls(publishCdnUrls1);
req.setPublishCdnParams(publishCdnParams1);
StartMCUMixTranscodeResponse resp = client.StartMCUMixTranscode(req);
System.out.println(StartMCUMixTranscodeResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
4、画中画模板(LayoutParams.Template = 3):
该模板以“一大一小,一前一后”的模式混合房间中的两路画面,即将房间中一路画面铺满整个屏幕,再将一路画面作为小画面悬浮在大画面之上,小画面的位置可以通过参数指定。 您可以通过 LayoutParams 中的 MainVideoUserId 和 MainVideoStreamType 参数指定大画面这一路的用户 ID 和流类型。 您可以通过 LayoutParams 中的 SmallVideoLayoutParams 参数指定小画面这一路的用户 ID、流类型和布局位置等信息。 场景示例1:在线教育场景中,混合老师端摄像头(通常作为小画面)和老师端屏幕(通常作为大画面)两路画面,并混合课堂中学生的声音。 场景示例2:1v1 视频通话场景中,混合远端用户画面(通常作为大画面)和本地用户画面(通常作为小画面)。
代码如下:
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.trtc.v20190722.TrtcClient;
import com.tencentcloudapi.trtc.v20190722.models.*;;
public class StartMCUMixTranscode
{
public static void main(String [] args) {
try{
Credential cred = new Credential("SecretId", "SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("trtc.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
TrtcClient client = new TrtcClient(cred, "ap-guangzhou", clientProfile);
StartMCUMixTranscodeRequest req = new StartMCUMixTranscodeRequest();
req.setSdkAppId(1400505488L);
req.setRoomId(661L);
OutputParams outputParams1 = new OutputParams();
outputParams1.setStreamId("crk661");
outputParams1.setPureAudioStream(0L);
outputParams1.setRecordId("crk");
outputParams1.setRecordAudioOnly(0L);
req.setOutputParams(outputParams1);
EncodeParams encodeParams1 = new EncodeParams();
encodeParams1.setVideoWidth(720L);
encodeParams1.setVideoHeight(1280L);
encodeParams1.setVideoBitrate(1500L);
encodeParams1.setVideoFramerate(20L);
encodeParams1.setVideoGop(3L);
encodeParams1.setBackgroundColor(3394560L);
encodeParams1.setAudioSampleRate(48000L);
encodeParams1.setAudioBitrate(64L);
encodeParams1.setAudioChannels(2L);
encodeParams1.setAudioCodec(0L);
req.setEncodeParams(encodeParams1);
LayoutParams layoutParams1 = new LayoutParams();
layoutParams1.setTemplate(3L);
layoutParams1.setMainVideoUserId("666");
layoutParams1.setMainVideoStreamType(0L);
SmallVideoLayoutParams smallVideoLayoutParams1 = new SmallVideoLayoutParams();
smallVideoLayoutParams1.setUserId("555");
smallVideoLayoutParams1.setStreamType(0L);
smallVideoLayoutParams1.setImageWidth(350L);
smallVideoLayoutParams1.setImageHeight(350L);
smallVideoLayoutParams1.setLocationX(370L);
smallVideoLayoutParams1.setLocationY(930L);
layoutParams1.setSmallVideoLayoutParams(smallVideoLayoutParams1);
layoutParams1.setMainVideoRightAlign(0L);
String[] mixVideoUids1 = {"111", "222", "333", "444"};
layoutParams1.setMixVideoUids(mixVideoUids1);
layoutParams1.setPureAudioHoldPlaceMode(0L);
req.setLayoutParams(layoutParams1);
PublishCdnParams publishCdnParams1 = new PublishCdnParams();
publishCdnParams1.setBizId(9926L);
String[] publishCdnUrls1 = {"http://cctv.com"};
publishCdnParams1.setPublishCdnUrls(publishCdnUrls1);
req.setPublishCdnParams(publishCdnParams1);
StartMCUMixTranscodeResponse resp = client.StartMCUMixTranscode(req);
System.out.println(StartMCUMixTranscodeResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
5、自定义模板(LayoutParams.Template = 4):
适用于需要自定义排布各路画面位置的场景,您可以通过 LayoutParams 中的 PresetLayoutConfig 参数(这是一个数组),预先设置各路画面的位置。 您可以不指定 PresetLayoutConfig 参数中的 UserId 参数,排版引擎会根据进房的先后顺序,将进房的用户依次分配到 PresetLayoutConfig 数组中指定的各个位置上。 如果 PresetLayoutConfig 数组中的某一个被指定了 UserId 参数,则排版引擎会预先给指定的用户预留好他/她在画面中的位置。 如果用户只上行音频,不上行视频,该用户依然会占用画面位置。 当 PresetLayoutConfig 数组中预设的位置被用完后,排版引擎将不再混合其它用户的画面和声音。
注意: 云端混流服务最多支持同时混合16路音视频流,如果用户只有音频也会被算作一路。
代码如下:
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.trtc.v20190722.TrtcClient;
import com.tencentcloudapi.trtc.v20190722.models.*;;
public class StartMCUMixTranscode
{
public static void main(String [] args) {
try{
Credential cred = new Credential("SecretId", "SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("trtc.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
TrtcClient client = new TrtcClient(cred, "ap-guangzhou", clientProfile);
StartMCUMixTranscodeRequest req = new StartMCUMixTranscodeRequest();
req.setSdkAppId(1400505488L);
req.setRoomId(661L);
OutputParams outputParams1 = new OutputParams();
outputParams1.setStreamId("crk661");
outputParams1.setPureAudioStream(0L);
outputParams1.setRecordId("crk");
outputParams1.setRecordAudioOnly(0L);
req.setOutputParams(outputParams1);
EncodeParams encodeParams1 = new EncodeParams();
encodeParams1.setVideoWidth(720L);
encodeParams1.setVideoHeight(1280L);
encodeParams1.setVideoBitrate(1500L);
encodeParams1.setVideoFramerate(20L);
encodeParams1.setVideoGop(3L);
encodeParams1.setBackgroundColor(3394560L);
encodeParams1.setAudioSampleRate(48000L);
encodeParams1.setAudioBitrate(64L);
encodeParams1.setAudioChannels(2L);
encodeParams1.setAudioCodec(0L);
req.setEncodeParams(encodeParams1);
LayoutParams layoutParams1 = new LayoutParams();
layoutParams1.setTemplate(3L);
layoutParams1.setMainVideoUserId("666");
layoutParams1.setMainVideoStreamType(0L);
SmallVideoLayoutParams smallVideoLayoutParams1 = new SmallVideoLayoutParams();
smallVideoLayoutParams1.setUserId("555");
smallVideoLayoutParams1.setStreamType(0L);
smallVideoLayoutParams1.setImageWidth(350L);
smallVideoLayoutParams1.setImageHeight(350L);
smallVideoLayoutParams1.setLocationX(370L);
smallVideoLayoutParams1.setLocationY(930L);
layoutParams1.setSmallVideoLayoutParams(smallVideoLayoutParams1);
layoutParams1.setMainVideoRightAlign(0L);
String[] mixVideoUids1 = {"111", "222", "333", "444"};
layoutParams1.setMixVideoUids(mixVideoUids1);
PresetLayoutConfig[] presetLayoutConfigs1 = new PresetLayoutConfig[2];
PresetLayoutConfig presetLayoutConfig1 = new PresetLayoutConfig();
presetLayoutConfig1.setUserId("224");
presetLayoutConfig1.setStreamType(0L);
presetLayoutConfig1.setImageWidth(350L);
presetLayoutConfig1.setImageHeight(350L);
presetLayoutConfig1.setLocationX(370L);
presetLayoutConfig1.setLocationY(930L);
presetLayoutConfig1.setZOrder(0L);
presetLayoutConfig1.setRenderMode(0L);
presetLayoutConfig1.setMixInputType(0L);
presetLayoutConfigs1[0] = presetLayoutConfig1;
PresetLayoutConfig presetLayoutConfig2 = new PresetLayoutConfig();
presetLayoutConfig2.setUserId("225");
presetLayoutConfig2.setStreamType(0L);
presetLayoutConfig2.setImageWidth(350L);
presetLayoutConfig2.setImageHeight(350L);
presetLayoutConfig2.setLocationX(370L);
presetLayoutConfig2.setLocationY(580L);
presetLayoutConfig2.setZOrder(1L);
presetLayoutConfig2.setRenderMode(0L);
presetLayoutConfigs1[1] = presetLayoutConfig2;
layoutParams1.setPresetLayoutConfig(presetLayoutConfigs1);
layoutParams1.setPlaceHolderMode(0L);
layoutParams1.setPureAudioHoldPlaceMode(0L);
req.setLayoutParams(layoutParams1);
PublishCdnParams publishCdnParams1 = new PublishCdnParams();
publishCdnParams1.setBizId(9926L);
String[] publishCdnUrls1 = {"http://cctv.com"};
publishCdnParams1.setPublishCdnUrls(publishCdnUrls1);
req.setPublishCdnParams(publishCdnParams1);
StartMCUMixTranscodeResponse resp = client.StartMCUMixTranscode(req);
System.out.println(StartMCUMixTranscodeResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
二、混流参数详解:
1、首先先配置TRTC的SDKAppId和房间号RoomId
2、在调用REST API StartMCUMixTranscode时,先手要设置一下LayoutParams参数(混流输出布局参数)。
LayoutParams.Template的值分别是:0(悬浮模板)、1(九宫格模板)、2(屏幕分享模板)、3(画中画模板)、4(自定义模板)
3、混流编码参数混流编码参数:EncodeParams
4、混流输出控制参数:OutputParams
MCU混流的输出参数
5、第三方CDN转推参数:PublishCdnParams
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。