导播台典型的布局样式包括:单画面、画中画以及四画面布局等,为满足用户场景的多样性,阿里云导播服务支持用户根据场景需要自定义布局样式,按如下步骤自定义布局:
  1. 确定布局画面数量、所引用的视频源及位置ID、画面层次关系。
  2. 确定每个画面的坐标系位置、坐标、宽度或高度缩放比例。
  3. 确定布局中音频混合数量、所引用的音频源及位置ID、音频混合顺序。
  4. 确定每个音频的音量倍数、输入声道。

自定义画中画布局参数样例

参数名 参数值 参数说明
Action AddCasterLayout 操作接口名称
CasterId xxxx 导播台ID
BlendList.1 RV01 下层视频源位置LocationId
BlendList.2 RV02 上层视频源位置LocationId
MixList.1 RV01 视频源位置locationId
VideoLayer.1.HeightNormalized 1.0 视频元素高度归一化值,设置高度后宽度会按照等比例缩放
VideoLayer.1.PositionNormalized.1 1.0 视频元素归一化水平坐标X值
VideoLayer.1.PositionNormalized.2 1.0 视频元素归一化垂直坐标Y值
VideoLayer.1.PositionRefer topLeft 视频元素参考坐标系,以播放窗口左上角为原点
VideoLayer.2.HeightNormalized 0.3 视频元素高度归一化值,设置高度后宽度会按照等比例缩放
VideoLayer.2.PositionNormalized.1 0.2 视频元素归一化水平坐标X值
VideoLayer.2.PositionNormalized.2 0.2 视频元素归一化垂直坐标Y值
VideoLayer.2.PositionRefer topLeft 视频元素参考坐标系,以播放窗口左上角为原点
AudioLayer.1.ValidChannel leftChannel 使用左声道作为音量输入
AudioLayer.1.VolumeRate 1.0 音频音量大小倍数,1.0为原始音量
说明 A.n 即A列表的第n个参数,A.n.B 即A列表中第n个结构体元素的B参数。

代码示例

public AddCasterLayoutResponse addCasterLayoutSample() {
		/*设置BlendList*/
		ArrayList<String> blendList = new ArrayList<String>();
		blendList.add("RV01");
		blendList.add("RV02");
		/*设置VideoLayers*/
		ArrayList<VideoLayer> videoLayers = new ArrayList<VideoLayer>();
		VideoLayer videoLayerRv01 = new VideoLayer();
		ArrayList<Float> positionNormalizedRv01 = new ArrayList<Float>();
		positionNormalizedRv01.add(0f);
		positionNormalizedRv01.add(0f);
		videoLayerRv01.setHeightNormalized(1f);  // 设置视频归一化高度比例
		videoLayerRv01.setPositionNormalizeds(positionNormalizedRv01); // 设置视频归一化坐标
		videoLayerRv01.setPositionRefer("topLeft"); // 设置视频坐标原点参考系
		videoLayers.add(videoLayerRv01);
		VideoLayer videoLayerRv02 = new VideoLayer();
		ArrayList<Float> positionNormalizedRv02 = new ArrayList<Float>();
		positionNormalizedRv02.add(0.2f);
		positionNormalizedRv02.add(0.2f);
		videoLayerRv01.setHeightNormalized(0.3f);  // 设置视频归一化高度比例
		videoLayerRv01.setPositionNormalizeds(positionNormalizedRv02); // 设置视频归一化坐标
		videoLayerRv01.setPositionRefer("topLeft"); // 设置视频坐标原点参考系
		videoLayers.add(videoLayerRv02);
		/*设置MixList*/
		ArrayList<String> mixList = new ArrayList<String>();
		mixList.add("RV01");
		/*设置AudioLayers*/
		ArrayList<AudioLayer> audioLayers = new ArrayList<AudioLayer>();
		AudioLayer audioLayer = new AudioLayer();
		audioLayer.setVolumeRate(1f); // 设置音频音量倍数
		audioLayer.setValidChannel("leftChannel"); // 设置音频输入声道
		audioLayers.add(audioLayer);

		AddCasterLayoutRequest addCasterLayoutRequest = new AddCasterLayoutRequest();
		addCasterLayoutRequest.setCasterId("XXXXXX"); // 设置导播台ID
		addCasterLayoutRequest.setBlendLists(blendList); // 设置BlendList
		addCasterLayoutRequest.setMixLists(mixList);  // 设置MixList
		addCasterLayoutRequest.setVideoLayers(videoLayers); // 设置VideoLayers
		addCasterLayoutRequest.setAudioLayers(audioLayers); // 设置AudioLayers
		AddCasterLayoutResponse addCasterLayoutResponse = null;
		try {
			addCasterLayoutResponse = LiveCli-ent.getClient().getAcsResponse(addCasterLayoutRequest);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return addCasterLayoutResponse;
	}