导播台提供了单画面、画中画以及四画面布局等典型布局样式,为满足用户场景的多样性,阿里云导播服务支持用户根据场景需要自定义布局样式。

自定义布局步骤

  1. 确定布局画面数量、所引用的视频源及位置ID、画面层次关系。
  2. 确定每个画面的坐标系位置、坐标、宽度或高度缩放比例。
  3. 确定布局中音频混合数量、所引用的音频源及位置ID、音频混合顺序。
  4. 确定每个音频的音量倍数、输入声道。

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

布局参数取值说明请参见添加导播台布局

名称 示例值 描述
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;
    }