你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:媒体组合输入、布局和输出简介

重要

本部分所述的功能目前为个人预览版。 个人预览版包括对测试用 SDK 和文档的访问权限,这些资源尚未公开提供。 通过填写相关表单获取 Azure 通信服务的预览访问权限,申请成为早期采用者。

Azure 通信服务媒组合成由三个部分组成:输入、布局和输出。 请跟随本文档详细了解可用选项以及如何定义每个部分。

先决条件

输入

若要检索在布局组合中使用的媒体源,需要定义输入。 输入可以是多源也可以是单源。

多源输入

Teams 会议、ACS 呼叫和 ACS 会议室通常由多个个人组成。 我们将他们定义为多源输入。 可以在布局中将他们用作单个输入,或者将其解构来引用单个参与者。

ACS 小组呼叫 json:

{
  "inputs": {
    "groupCallInput": {
      "kind": "groupCall",
      "id": "5a22165a-f952-4a56-8009-6d39b8868971"
    }
  }
}

Teams 会议输入 json:

{
  "inputs": {
    "teamsMeetingInput": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    }
  }
}

ACS 会议室输入 json:

{
  "inputs": {
    "roomCallInput": {
      "kind": "room",
      "id": "050298"
    }
  }
}

单源输入

与多源输入不同,单源输入引用单个媒体源。 如果单个源输入来自多源输入(例如 ACS 小组呼叫或 Teams 会议),它将在 call 属性中引入多源输入 ID。 下面是单源输入的示例:

参与者 json:

{
  "inputs": {
    "teamsMeetingInput": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    },
    "participantInput": {
      "kind": "participant",
      "call": "teamsMeetingInput",
      "id": {
        "microsoftTeamsUser": {
          "id": "f3ba9014-6dca-4456-8ec0-fa03cfa2b7b7"
        }
      }
    }
  }
}

活跃演示者 json:

{
  "inputs": {
    "teamsMeetingInput": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    },
    "activePresenterInput": {
      "kind": "activePresenter",
      "call": "teamsMeetingInput"
    }
  }
}

主导发言人 json:

{
  "inputs": {
    "teamsMeetingInput": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    },
    "dominantSpeakerInput": {
      "kind": "dominantSpeaker",
      "call": "teamsMeetingInput"
    }
  }
}

布局

媒体组合支持多个布局。 其中包括网格、自动网格、演示、演示者和自定义。

网格

网格布局会将指定的媒体源组合到包含一定数量单元格的网格中。 可以自定义网格中的行数和列数,并指定应在网格的每个单元格中放置的媒体源。

示例网格布局 json:

{
  "layout": {
    "kind": "grid",
    "rows": 2,
    "columns": 2,
    "inputIds": [
      ["active", "jill"],
      ["jon", "janet"]
    ]
  },
  "inputs": {
    "meeting": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    },
    "active": {
      "kind": "dominantSpeaker",
      "call": "meeting"
    },
    "jill": {
      "kind": "participant",
      "call": "meeting",
      "placeholderImageUri": "https://imageendpoint",
      "id": {
        "microsoftTeamsUser": {
          "id": "f3ba9014-6dca-4456-8ec0-fa03cfa2b7f4"
        }
      }
    },
    "jon": {
      "kind": "participant",
      "call": "meeting",
      "placeholderImageUri": "https://imageendpoint",
      "id": {
        "microsoftTeamsUser": {
          "id": "36f49257-c7de-4d64-97f5-e507bdb3323e"
        }
      }
    },
    "janet": {
      "kind": "participant",
      "call": "meeting",
      "placeholderImageUri": "https://imageendpoint",
      "id": {
        "microsoftTeamsUser": {
          "id": "e94d0030-ac38-4111-a87f-07884b565b14"
        }
      }
    }
  },
  "outputs": {
    "meeting": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    }
  }
}

示例网格布局 json 呈现主导发言人,并将其放在第一个单元格。 然后 jilljonjanet 填充接下来的三个单元格:图表显示网格布局示例。

如果输入中只定义三个参与者,则第四个单元格将留空。

自动网格

自动网格布局非常适合要在场景中显示所有源的多源方案。 此布局应是默认的多源场景,并根据源数进行调整。

示例自动网格布局 json:

{
  "layout": {
    "kind": "autoGrid",
    "inputIds": ["meeting"],
    "highlightDominantSpeaker": true
  },
  "inputs": {
    "meeting": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    }
  },
  "outputs": {
    "meeting": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    }
  }
}

示例自动网格布局包括 meeting 输入中的所有媒体源,并将其组合到优化的网格:图表显示自动网格布局的示例。

呈现

演示布局呈现演示者,该演示者占了大部分场景。 其他源是观众成员,并排列在剩余空间中的行或列中。 观众的位置可以是 topbottomleftright 之一。

示例演示布局 json:

{
  "layout": {
    "kind": "presentation",
    "presenterId": "presenter",
    "audienceIds": ["meeting:not('presenter')"],
    "audiencePosition": "top"
  },
  "inputs": {
    "meeting": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    },
    "presenter": {
      "kind": "participant",
      "call": "meeting",
      "placeholderImageUri": "https://imageendpoint",
      "id": {
        "microsoftTeamsUser": {
          "id": "f3ba9014-6dca-4456-8ec0-fa03cfa2b7f4"
        }
      }
    }
  },
  "outputs": {
    "meeting": {
      "teamsMeeting": {
        "teamsJoinUrl": "https://teamsjoinurl"
      }
    }
  }
}

示例演示布局呈现 presenter 并将其余观众成员放在场景上部:图表显示演示布局示例。

演示者

演示者布局是由两个输入组成的画中画布局。 一个源是场景的背景。 它表示正在呈现的内容或主演示者。 辅助源提供支持,裁剪并放置在场景的一角。 支持位置可以是 bottomLeftbottomRighttopLefttopRight 之一。

示例演示者布局 json:

{
  "layout": {
    "kind": "presenter",
    "presenterId": "presenter",
    "supportId": "support",
    "supportPosition": "topLeft",
    "supportAspectRatio": 3/2
  },
  "inputs": {
    "meeting": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    },
    "presenter": {
      "kind": "participant",
      "call": "meeting",
      "placeholderImageUri": "https://imageendpoint",
      "id": {
        "microsoftTeamsUser": {
          "id": "f3ba9014-6dca-4456-8ec0-fa03cfa2b7f4"
        }
      }
    },
    "support": {
      "kind": "participant",
      "call": "meeting",
      "placeholderImageUri": "https://imageendpoint",
      "id": {
        "microsoftTeamsUser": {
          "id": "36f49257-c7de-4d64-97f5-e507bdb3323e"
        }
      }
    }
  },
  "outputs": {
    "meeting": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl"
    }
  }
}

示例演示者布局呈现 presenter 媒体源,它占了大部分场景。 根据 supportAspectRatio 来裁剪支持媒体源,并将其放在指定位置 topLeft图表显示演示者布局的示例。

自定义

如果任何预定义布局都无法满足需求,可以使用自定义布局来适应确切的方案。 借助自定义布局,可以使用不同大小来定义源,并将其放置在场景的任何位置。

{
  "layout": {
    "kind": "custom",
    "inputGroups": {
      "main": {
        "position": {
          "x": 0,
          "y": 0
        },
        "width": "100%",
        "height": "100%",
        "rows": 2,
        "columns": 2,
        "inputIds": [ [ "meeting:not('active')" ] ]
        },
      "overlay": {
        "position": {
            "x": 480,
            "y": 270
          },
          "width": "50%",
          "height": "50%",
          "layer": "overlay",
          "inputIds": [[ "active" ]]
          }
    },
    "layers": {
      "overlay": {
        "zIndex": 2,
        "visibility": "visible"
      }
    }
  },
  "inputs": {
    "active": {
      "kind": "dominantSpeaker",
      "call": "meeting"
    },
    "meeting": {
      "teamsMeeting": {
        "teamsJoinUrl": "https://teamsjoinurl"
        }
    }
  },
  "outputs": {
    "meeting": {
      "teamsMeeting": {
        "teamsJoinUrl": "https://teamsjoinurl"
      }
    }
  }
}

以上自定义布局示例导致以下组合:图表显示自定义布局示例。

输出

根据布局组合媒体后,可以通过各种方式将其输出给观众。 目前,可以将组合流发送给调用或 RTMP 服务器。

ACS 小组呼叫 json:

{
  "outputs": {
    "groupCallOutput": {
      "kind": "groupCall",
      "id": "CALL_ID"
    }
  }
}

Teams 会议输入 json:

{
  "outputs": {
    "teamsMeetingOutput": {
      "kind": "teamsMeeting",
      "teamsJoinUrl": "https://teamsjoinurl",
    }
  }
}

ACS 会议室输入 json:

{
  "inputs": {
    "roomCallInput": {
      "kind": "room",
      "id": "ROOM_ID"
    }
  }
}

RTMP 输出 json

{
  "outputs": {
    "rtmpOutput": {
      "kind": "rtmp",
      "streamUrl": "rtmp://rtmpendpoint",
      "streamKey": "STREAM_KEY",
      "resolution": {
        "width": 1920,
        "height": 1080
      },
      "mode": "push"
    }
  }
}

后续步骤

在本部分,你已了解如何执行以下操作:

  • 创建多源或单源输入
  • 创建各种预定义和自定义布局
  • 创建输出

你可能还想要: