导播台提供了单画面、画中画以及四画面布局等典型布局样式,为满足用户场景的多样性,阿里云导播服务支持用户根据场景需要自定义布局样式。
自定义布局步骤
- 确定布局画面数量、所引用的视频源及位置ID、画面层次关系。
- 确定每个画面的坐标系位置、坐标、宽度或高度缩放比例。
- 确定布局中音频混合数量、所引用的音频源及位置ID、音频混合顺序。
- 确定每个音频的音量倍数、输入声道。
自定义画中画布局参数样例
布局参数取值说明请参见添加导播台布局。
名称 | 示例值 | 描述 |
---|---|---|
Action | AddCasterLayout | 操作接口名称。 |
CasterId | LIVEPRODUCER_POST-cn-v0h1557**** | 导播台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);
videoLayerRv02.setHeightNormalized(0.3f); // 设置视频归一化高度比例
videoLayerRv02.setPositionNormalizeds(positionNormalizedRv02); // 设置视频归一化坐标
videoLayerRv02.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("LIVEPRODUCER_POST-cn-v0h1557****"); // 设置导播台ID
addCasterLayoutRequest.setBlendLists(blendList); // 设置BlendList
addCasterLayoutRequest.setMixLists(mixList); // 设置MixList
addCasterLayoutRequest.setVideoLayers(videoLayers); // 设置VideoLayers
addCasterLayoutRequest.setAudioLayers(audioLayers); // 设置AudioLayers
AddCasterLayoutResponse addCasterLayoutResponse = null;
try {
addCasterLayoutResponse = LiveClient.getClient().getAcsResponse(addCasterLayoutRequest);
} catch (Exception e) {
e.printStackTrace();
}
return addCasterLayoutResponse;
}