共用方式為


教學課程:透過媒體服務使用 Node.js 和 TypeScript 進行即時串流

媒體服務標誌 v3


警告

Azure 媒體服務將於 2024 年 6 月 30 日淘汰。 如需詳細資訊,請參閱 AMS淘汰指南

在 Azure 媒體服務中,即時事件會負責處理即時串流內容。 即時事件會提供輸入端點 (內嵌 URL),接著您再提供給即時編碼器。 即時事件會從即時編碼器接收輸入資料流,再透過一或多個串流端點進行串流處理。 即時事件也會提供預覽端點 (預覽 URL),您可在進一步處理和傳遞之前先用來預覽及驗證您的資料流。

本教學課程示範如何使用 Node.js 和 TypeScript 來建立即時活動的傳遞類型,並使用 OBS Studio 對其廣播即時串流。

在本教學課程中,您將:

注意

雖然教學課程使用 Node.js 範例,但是 REST APICLI 或其他受支援 SDK 的一般步驟都相同。

先決條件

您需要下列項目才能完成教學課程:

您需要這些額外的項目才能使用即時串流軟體:

  • 用來廣播事件的相機或裝置 (例如筆記型電腦)。

  • 將相機串流編碼,並透過即時訊息處理通訊協定 (RTMP) 將其傳送至媒體服務即時串流服務的內部部署軟體編碼器。 如需詳細資訊,請參閱建議的內部部署即時編碼器。 資料流的格式必須是 RTMP 或 Smooth Streaming。

    此範例假設您將使用 Open Broadcaster Software (OBS) Studio 將 RTMP 廣播至內嵌端點。 安裝 OBS Studio

    在 OBS Studio 中使用下列編碼設定:

    • 編碼器:NVIDIA NVENC (如果有) 或 x264
    • 速率控制:CBR
    • 位元速率:2,500 Kbps (或適合您電腦的速率)
    • 主要畫面格間隔:2 秒或 1 秒,目的在於低延遲
    • 預設:低延遲品質或效能 (NVENC),或使用 x264 的「veryfast」
    • 設定檔:高
    • GPU:0 (自動)
    • B 畫面上限:2

秘訣

請先檢閱使用媒體服務 v3 進行即時串流,再繼續操作。

下載並設定範例

使用下列命令,將包含即時串流 Node.js 範例的 GitHub 存放庫複製到您的機器:

git clone https://github.com/Azure-Samples/media-services-v3-node-tutorials.git

即時串流範例位於 Live 資料夾中。

root folder 資料夾中,將名為 sample.env 的檔案複製到名為 .env 的新檔案,以儲存您在使用 Azure CLI 存取 Azure 媒體服務 API 一文中所收集的環境變數設定。 請確定檔名在 「env」 前面包含點 (.) ,使其可以正確使用程式代碼範例。

.env 檔案包含 Azure Active Directory (Azure AD) 應用程式金鑰和祕密。 其中也包含驗證媒體服務帳戶 SDK 存取所需的帳戶名稱和訂用帳戶資訊。 .gitignore 檔案已設定為防止將此檔案發佈至分支存放庫。 請避免這些認證外洩,因為這是您帳戶的重要祕密。

重要事項

此範例會對每個資源使用唯一尾碼。 如果您取消偵錯,或在應用程式執行完成之前加以終止,您的帳戶將會出現多個即時事件。

請務必停止執行中的即時事件。 否則將會產生相關費用! 完整執行程式以自動清除資源。 如果程式停止,或您意外停止偵錯工具並中斷程式執行,您應該再次檢查入口網站,以確認您尚未離開執行中或待命狀態的任何即時事件,以避免產生不必要的帳單費用。

檢查 TypeScript 程式碼以進行即時串流

此區段會針對 Live/Standard_Passthrough_Live_Event 專案檢查 index.ts 檔案中定義的函式。

此範例會為每個資源建立唯一的尾碼,因此,即使您執行此範例多次而未進行清除,也不會發生名稱衝突。

開始使用適用於 Node.js 的媒體服務 SDK 搭配 TypeScript

若要開始使用媒體服務 API 搭配 Node.js,您必須先使用 npm 套件管理員新增 @azure/arm-mediaservices SDK 模組:

npm install @azure/arm-mediaservices

package.json 檔案中,這已為您進行設定。 您只需要執行 npm install 以載入模組和相依性:

  1. 安裝 packages.json 檔案中使用的套件:

    npm install
    
  2. 從根資料夾開啟 Visual Studio Code。 (這必須從 .vscode 資料夾和 tsconfig.json 檔案所在的資料夾開始。)

    code .
    

開啟 Live/Standard_Passthrough_Live_Event 的資料夾,然後在 Visual Studio Code 編輯器中開啟 index.ts 檔案。

當您在 index.ts 檔案中時,請選取 F5 鍵以開啟偵錯工具。

設定 longRunningOperationUpdateIntervalMs

若要加速從預設值 30 秒到幾秒鐘的長時間執行作業輪詢,您需要設定 longRunningOperationUpdateIntervalMs,並在使用 liveEvents 時,將此值傳遞至 createAndWait () 作業上 options 參數的 updateIntervaleInMs 屬性。 這可在整個範例中看到。 此範例會使用 2000 毫秒的值 (2 秒)。 這項變更可減少輪詢 Azure Resource Manager 端點上長時間執行作業狀態所需的時間。 這會縮短完成主要作業的時間,例如建立即時活動、啟動和停止,也就是所有非同步呼叫。 針對大部分對時間敏感的案例,我們建議的值為 2 秒。


// Long running operation polling interval in milliseconds
const longRunningOperationUpdateIntervalMs = 2000;

建立即時事件

本節說明如何建立標準傳遞類型的即時事件 (LiveEventEncodingType 設定為 PassthroughStandard)。 如需可用類型的相關資訊,請參閱即時事件類型。 除了基本或標準傳遞以外,您還可以使用 720p 或 1080p 即時編碼事件進行自適性位元速率雲端編碼。 範例存放庫的 Live 資料夾中提供每種事件類型的範例。 此外,也包含示範如何透過事件中樞接聽事件方格事件的範例。

建立即時事件時,您可能會想要指定下列項目:

  • 即時事件的內嵌通訊協定。 目前支援 RTMP、RTMPS 和 Smooth Streaming 通訊協定。 當即時活動或其相關即時輸出正在執行時,您無法變更通訊協定選項。 如果您需要不同的通訊協定,則應為每個串流通訊協定建立個別的即時事件。

  • 內嵌和預覽的 IP 限制。 您可以定義獲允許可將視訊內嵌到此即時活動的 IP 位址。 允許的 IP 位址可以指定為下列其中一個選項:

    • 單一 IP 位址 (例如 10.0.0.1)
    • 使用 IP 位址和無類別網域間路由選擇 (CIDR) 子網路遮罩的 IP 範圍 (例如 10.0.0.1/22)
    • 使用 IP 位址和小數點十進位子網路遮罩的 IP 範圍 (例如 10.0.0.1(255.255.252.0))

    如果未指定 IP 位址而且也未定義規則,則任何 IP 位址都不允許。 若要允許任何 IP 位址,請建立規則,並設定 0.0.0.0/0。 IP 位址必須採用下列其中一種格式:具有四個數位或 CIDR 位址範圍的 IPv4 或 IPv6 位址。 如需使用 IPv4 或 IPv6 的詳細資訊,請參閱 使用 IP 允許清單限制DRM授權和 AES 金鑰傳遞的存取

  • 當您建立事件時自動在其上啟動。 自動啟動設為 true 時,即時事件將會在建立後隨即啟動。 這意味著即時事件只要開始執行,就會立即開始計費。 您必須在即時事件資源上明確呼叫 Stop,才能終止進一步計費。 如需詳細資訊,請參閱即時活動狀態和計費

    待命模式可讓您以較低成本的「配置」狀態啟動即時事件,使其更快進入執行中狀態。 這在某些情況下將有其效用,例如,經常性存取集區需要快速向串流處理器送出通道時。

  • 靜態主機名稱和唯一 GUID。 若要讓內嵌 URL 具有預測性,且更容易在硬體型即時編碼器中維護,請將 useStaticHostname 屬性設定為 true。 針對 accessToken,請使用自訂的唯一 GUID。 如需詳細資訊,請參閱即時事件內嵌 URL


// Creating the LiveEvent - the primary object for live streaming in AMS. 
// See the overview - https://docs.microsoft.com/azure/media-services/latest/live-streaming-overview

// Create the LiveEvent

// Understand the concepts of what a live event and a live output is in AMS first!
// Read the following - https://docs.microsoft.com/azure/media-services/latest/live-events-outputs-concept
// 1) Understand the billing implications for the various states
// 2) Understand the different live event types, pass-through and encoding
// 3) Understand how to use long-running async operations 
// 4) Understand the available Standby mode and how it differs from the Running Mode. 
// 5) Understand the differences between a LiveOutput and the Asset that it records to.  They are two different concepts.
//    A live output can be considered as the "tape recorder" and the Asset is the tape that is inserted into it for recording.
// 6) Understand the advanced options such as low latency, and live transcription/captioning support. 
//    Live Transcription - https://docs.microsoft.com/en-us/azure/media-services/latest/live-transcription
//    Low Latency - https://docs.microsoft.com/en-us/azure/media-services/latest/live-event-latency

// When broadcasting to a live event, please use one of the verified on-premises live streaming encoders.
// While operating this tutorial, it is recommended to start out using OBS Studio before moving to another encoder. 

// Note: When creating a LiveEvent, you can specify allowed IP addresses in one of the following formats:                 
//      To allow all IPv4 addresses and block all IPv6 addresses, set the IP allow list to [ "0.0.0.0/0" ]
//      IpV4 address with 4 numbers
//      CIDR address range

let allowAllIPv4InputRange: IPRange = {
    name: "Allow all IPv4 addresses",
    address: "0.0.0.0",
    subnetPrefixLength: 0
};

// IpV6 addresses or ranges
//  For this example, the following request from the following addresses will be accepted:
//      •	IPv6 addresses between 2001:1234:1234:0000:0000:0000:0000:4567 and 2001:1234:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF,
//      •	IPv6 address 2001:1235:0000:0000:0000:0000:0000:0000
//  Additional examples:
//      •	To allow requests from any IP address, set the “defaultAction” of the “accessControl” block to “Allow” (and do not specify an “ipAllowList)
//      •	To allow all IPv6 addresses and block all IPv6 addresses, set the IP allow list to [ "::/0" ]

let allowAllIPv6InputRange: IPRange = {
    name: "Allow all IPv6 addresses",
    address: "::",
    subnetPrefixLength: 0
};

// Create the LiveEvent input IP access control object
// this will control the IP that the encoder is running on and restrict access to only that encoder IP range.
let liveEventInputAccess: LiveEventInputAccessControl = {
    ip: {
        allow: [
            // re-use the same range here for the sample, but in production you can lock this
            // down to the ip range for your on-premises live encoder, laptop, or device that is sending
            // the live stream
            allowAllIPv4InputRange,
            allowAllIPv6InputRange
        ]
    }
};

// Create the LiveEvent Preview IP access control object. 
// This will restrict which clients can view the preview endpoint
let liveEventPreview: LiveEventPreview = {
    accessControl: {
        ip: {
            allow: [
                // re-use the same range here for the sample, but in production you can lock this to the IPs of your 
                // devices that would be monitoring the live preview. 
                allowAllIPv4InputRange,
                allowAllIPv6InputRange
            ]
        }
    }
}

// To get the same ingest URL for the same LiveEvent name every single time...
// 1. Set useStaticHostname  to true so you have ingest like: 
//        rtmps://liveevent-hevc12-eventgridmediaservice-usw22.channel.media.azure.net:2935/live/522f9b27dd2d4b26aeb9ef8ab96c5c77           
// 2. Set accessToken to a desired GUID string (with or without hyphen)

// See REST API documentation for details on each setting value
// https://docs.microsoft.com/rest/api/media/liveevents/create 

let liveEventCreate: LiveEvent = {
    location: mediaAccount.location,
    description: "Sample Live Event from Node.js SDK sample",
    // Set useStaticHostname to true to make the ingest and preview URL host name the same. 
    // This can slow things down a bit. 
    useStaticHostname: true,
    //hostnamePrefix: "somethingstatic", /// When using Static host name true, you can control the host prefix name here if desired 
    // 1) Set up the input settings for the Live event...
    input: {
        streamingProtocol: KnownLiveEventInputProtocol.Rtmp, // options are RTMP or Smooth Streaming ingest format.
        accessControl: liveEventInputAccess,  // controls the IP restriction for the source encoder. 
        // keyFrameIntervalDuration: "PT2S",  // Set this to match the ingest encoder's settings. This should not be used for encoding live events  
        accessToken: "9eb1f703b149417c8448771867f48501" // Use this value when you want to make sure the ingest URL is static and always the same. If omitted, the service will generate a random GUID value.
    },

    // 2) Set the live event to use pass-through or cloud encoding modes...
    encoding: {
        // Set this to Basic pass-through, Standard pass-through, Standard or Premium1080P to use the cloud live encoder.
        // See https://go.microsoft.com/fwlink/?linkid=2095101 for more information
        // Otherwise, leave as "None" to use pass-through mode
        encodingType: KnownLiveEventEncodingType.PassthroughStandard,
        // OPTIONS for encoding type you can use:
        // encodingType: KnownLiveEventEncodingType.PassthroughBasic, // Basic pass-through mode - the cheapest option!
        // encodingType: KnownLiveEventEncodingType.PassthroughStandard, // also known as standard pass-through mode (formerly "none")
        // encodingType: KnownLiveEventEncodingType.Premium1080p,// live transcoding up to 1080P 30fps with adaptive bitrate set
        // encodingType: KnownLiveEventEncodingType.Standard,// use live transcoding in the cloud for 720P 30fps with adaptive bitrate set
        //
        // OPTIONS using live cloud encoding type:
        // keyFrameInterval: "PT2S", //If this value is not set for an encoding live event, the fragment duration defaults to 2 seconds. The value cannot be set for pass-through live events.
        // presetName: null, // only used for custom defined presets. 
        //stretchMode: KnownStretchMode.None // can be used to determine stretch on encoder mode
    },
    // 3) Set up the Preview endpoint for monitoring based on the settings above we already set. 
    preview: liveEventPreview,

    // 4) Set up more advanced options on the live event. Low Latency is the most common one. 
    streamOptions: [
        "LowLatency"
    ],

    // 5) Optionally enable live transcriptions if desired. 
    // WARNING : This is extra cost ($$$), so please check pricing before enabling. Transcriptions are not supported on PassthroughBasic.
    //           switch this sample to use encodingType: "PassthroughStandard" first before un-commenting the transcriptions object below. 

    /* transcriptions : [
        {
            inputTrackSelection: [], // chose which track to transcribe on the source input.
            // The value should be in BCP-47 format (e.g: 'en-US'). See https://go.microsoft.com/fwlink/?linkid=2133742
            language: "en-us", 
            outputTranscriptionTrack: {
                trackName : "English" // set the name you want to appear in the output manifest
            }
        }
    ]
    */
}



console.log("Creating the LiveEvent, please be patient as this can take time to complete async.")
console.log("Live Event creation is an async operation in Azure and timing can depend on resources available.")
console.log();

let timeStart = process.hrtime();
// When autostart is set to true, the Live Event will be started after creation. 
// That means, the billing starts as soon as the Live Event starts running. 
// You must explicitly call Stop on the Live Event resource to halt further billing.
// The following operation can sometimes take awhile. Be patient.
// On optional workflow is to first call allocate() instead of create. 
// https://docs.microsoft.com/en-us/rest/api/media/liveevents/allocate 
// This allows you to allocate the resources and place the live event into a "Standby" mode until 
// you are ready to transition to "Running". This is useful when you want to pool resources in a warm "Standby" state at a reduced cost.
// The transition from Standby to "Running" is much faster than cold creation to "Running" using the autostart property.
// Returns a long running operation polling object that can be used to poll until completion.
await mediaServicesClient.liveEvents.beginCreateAndWait(
    resourceGroup,
    accountName,
    liveEventName,
    liveEventCreate,
    // When autostart is set to true, you should "await" this method operation to complete. 
    // The Live Event will be started after creation. 
    // You may choose not to do this, but create the object, and then start it using the standby state to 
    // keep the resources "warm" and billing at a lower cost until you are ready to go live. 
    // That increases the speed of startup when you are ready to go live. 
    {
        autoStart: false,
        updateIntervalInMs: longRunningOperationUpdateIntervalMs // This sets the polling interval for the long running ARM operation (LRO)
    }
).then((liveEvent) => {
    let timeEnd = process.hrtime(timeStart);
    console.info(`Live Event Created - long running operation complete! Name: ${liveEvent.name}`)
    console.info(`Execution time for create LiveEvent: %ds %dms`, timeEnd[0], timeEnd[1] / 1000000);
    console.log();
}).catch((reason) => {
    if (reason.error && reason.error.message) {
        console.info(`Live Event creation failed: ${reason.message}`);
    }
})

建立資產以記錄和封存即時活動

在下列程式碼區塊中,您會建立空的資產,以用作「磁帶」來記錄即時活動封存。

當您學習這些概念時,將資產物件視為您過去插入錄影機中的磁帶,會很有幫助。 即時輸出是錄影機。 即時事件則是進入機器背面的視訊訊號。

請記住,資產或「磁帶」可以隨時建立。 您會將空的資產交付給即時輸出物件,即此例中的「錄影機」。


// Create an Asset for the LiveOutput to use. Think of this as the "tape" that will be recorded to. 
// The asset entity points to a folder/container in your Azure Storage account. 
console.log(`Creating an asset named: ${assetName}`);
console.log();
let asset = await mediaServicesClient.assets.createOrUpdate(resourceGroup, accountName, assetName, {});

// Create the Live Output - think of this as the "tape recorder for the live event". 
// Live outputs are optional, but are required if you want to archive the event to storage,
// use the asset for on-demand playback later, or if you want to enable cloud DVR time-shifting.
// We will use the asset created above for the "tape" to record to. 
let manifestName: string = "output";
console.log(`Creating a live output named: ${liveOutputName}`);
console.log();

// See the REST API for details on each of the settings on Live Output
// https://docs.microsoft.com/rest/api/media/liveoutputs/create

建立即時輸出

在本節中,您會建立使用資產名稱作為輸入的即時輸出,以告知要記錄即時活動的位置。 此外,您可以設定錄製中使用的時間移位 (DVR) 視窗。

此範例程式碼示範如何設定 1 小時的時間移位時間範圍。 此時間範圍可讓用戶端在事件的最後一小時中播放任何項目。 此外,只有即時活動的最後 1 小時會保留在封存中。 如有需要,您可以將此時間範圍延長為最多 25 小時。 另請注意,您可以控制輸出資訊清單,讓 HTTP 即時串流 (HLS) 和透過 HTTP 的動態自適型串流 (DASH) 資訊清單在發佈時用於 URL 路徑。

您也可以隨時建立模擬中的即時輸出或「錄影機」。 您可以在啟動訊號流之前或之後建立即時輸出。 如需加快速度,在啟動訊號流程之前建立輸出可能會有所幫助。

即時輸出會在建立後隨即啟動,並在刪除後隨即停止。 當您刪除即時輸出時,並不會刪除基礎資產或資產中的內容。 請將其視為退出「磁帶」。具有錄製內容的資產可隨您的意願長久保存。 經退出後 (也就是即時輸出遭刪除時),將立即可供隨選檢視。

let liveOutputCreate: LiveOutput;
if (asset.name) {
    liveOutputCreate = {
        description: "Optional description when using more than one live output",
        assetName: asset.name,
        manifestName: manifestName, // The HLS and DASH manifest file name. This is recommended to set if you want a deterministic manifest path up front.
        archiveWindowLength: "PT30M", // sets the asset archive window to 30 minutes. Uses ISO 8601 format string.
        rewindWindowLength: "PT30M", // sets the time-shit(DVR) window to 30 minutes. Uses ISO 8601 format string.
        hls: {
            fragmentsPerTsSegment: 1 // Advanced setting when using HLS TS output only.
        },
    }

    // Create and await the live output
    await mediaServicesClient.liveOutputs.beginCreateAndWait(
        resourceGroup,
        accountName,
        liveEventName,
        liveOutputName,
        liveOutputCreate,
        {
            updateIntervalInMs: longRunningOperationUpdateIntervalMs // Setting this adjusts the polling interval of the long running operation. 
        })
        .then((liveOutput) => {
            console.log(`Live Output Created: ${liveOutput.name}`);
            let timeEnd = process.hrtime(timeStart);
            console.info(`Execution time for create Live Output: %ds %dms`, timeEnd[0], timeEnd[1] / 1000000);
            console.log();
        })
        .catch((reason) => {
            if (reason.error && reason.error.message) {
                console.info(`Live Output creation failed: ${reason.message}`);
            }
        });


}

取得內嵌 URL

建立即時事件之後,您即可取得將提供給即時編碼器的內嵌 URL。 編碼器會透過使用 RTMP 通訊協定,以使用這些 URL 來輸入即時串流。


// Get the RTMP ingest URL to configure in OBS Studio. 
// The endpoints is a collection of RTMP primary and secondary, and RTMPS primary and secondary URLs. 
// to get the primary secure RTMPS, it is usually going to be index 3, but you could add a  loop here to confirm...
if (liveEvent.input?.endpoints) {
    let ingestUrl = liveEvent.input.endpoints[0].url;
    console.log(`The RTMP ingest URL to enter into OBS Studio is:`);
    console.log(`RTMP ingest : ${ingestUrl}`);
    console.log(`Make sure to enter a Stream Key into the OBS studio settings. It can be any value or you can repeat the accessToken used in the ingest URL path.`);
    console.log();
}

取得預覽 URL

使用 previewEndpoint 來預覽及確認正在接收來自編碼器的輸入。

重要事項

請先確定影片流向預覽 URL,再繼續操作。

if (liveEvent.preview?.endpoints) {
    // Use the previewEndpoint to preview and verify
    // that the input from the encoder is actually being received
    // The preview endpoint URL also support the addition of various format strings for HLS (format=m3u8-cmaf) and DASH (format=mpd-time-cmaf) for example.
    // The default manifest is Smooth. 
    let previewEndpoint = liveEvent.preview.endpoints[0].url;
    console.log("The preview url is:");
    console.log(previewEndpoint);
    console.log();
    console.log("Open the live preview in your browser and use any DASH or HLS player to monitor the preview playback:");
    console.log(`https://ampdemo.azureedge.net/?url=${previewEndpoint}(format=mpd-time-cmaf)&heuristicprofile=lowlatency`);
    console.log("You will need to refresh the player page SEVERAL times until enough data has arrived to allow for manifest creation.");
    console.log("In a production player, the player can inspect the manifest to see if it contains enough content for the player to load and auto reload.");
    console.log();
}

console.log("Start the live stream now, sending the input to the ingest url and verify that it is arriving with the preview url.");
console.log("IMPORTANT TIP!: Make CERTAIN that the video is flowing to the Preview URL before continuing!");

建立及管理即時事件與即時輸出

讓串流進入即時活動之後,您可以發佈串流定位器供用戶端播放器使用,以開始串流活動。 這將透過串流端點將其提供給檢視器。

您必須先建立即時事件來建立訊號。 在您啟動該即時事件並將編碼器連線至輸入之前,訊號將不會流動。

若要停止「錄影機」,請對 LiveOutput 呼叫 delete。 此動作不會刪除「磁帶」(資產) 上封存的內容。 這只會刪除「錄影機」並停止封存。 資產一律會保留封存的視訊內容,直到您對資產本身明確呼叫 delete 為止。 一旦您刪除 LiveOutput,資產的錄製內容仍可透過任何已發佈的串流定位器 URL 來播放。

如果您想要移除用戶端播放封存內容的能力,則必須先從資產中移除所有定位器。 如果您使用 CDN 進行傳遞,您也會在 URL 路徑上排清內容傳遞網路 (CDN) 快取。 否則,內容會以 CDN 上的標準存留時間設定存在於 CDN 的快取中 (可能最多為 72 小時)。

建立串流定位器以發佈 HLS 和 DASH 資訊清單

注意

建立媒體服務帳戶時,預設串流端點會新增至處於停止狀態的帳戶。 若要開始串流內容並利用動態封裝和動態加密功能,您想要串流內容的串流端點必須處於執行中狀態。

當您使用串流定位器發佈資產時,即時事件 (最長為 DVR 時段長度) 將繼續可供檢視,直到串流定位器到期或遭到刪除為止 (視何者先發生)。 這是您讓虛擬「磁帶」錄製內容提供給檢視對象即時或隨選查看的方式。 當錄製完成時 (即時輸出遭刪除時),可使用相同的 URL 來查看即時事件、DVR 視窗或隨選資產。

async function createStreamingLocator(assetName: string, locatorName: string) {
    let streamingLocator = {
        assetName: assetName,
        streamingPolicyName: "Predefined_ClearStreamingOnly"  // no DRM or AES128 encryption protection on this asset. Clear means un-encrypted.
    };

    let locator = await mediaServicesClient.streamingLocators.create(
        resourceGroup,
        accountName,
        locatorName,
        streamingLocator);

    return locator;
}

建置 HLS 和 DASH 資訊清單的路徑

範例 BuildManifestPaths 中的方法示範如何確定性地建立串流路徑,以用於 HLS 或 DASH 並傳遞至各種用戶端和播放器架構。


// This method builds the manifest URL from the static values used during creation of the Live Output.
// This allows you to have a deterministic manifest path. <streaming endpoint hostname>/<streaming locator ID>/manifestName.ism/manifest(<format string>)
async function buildManifestPaths(scheme: string, hostname: string | undefined, streamingLocatorId: string | undefined, manifestName: string) {
    const hlsFormat: string = "format=m3u8-cmaf";
    const dashFormat: string = "format=mpd-time-cmaf";

    let manifestBase = `${scheme}://${hostname}/${streamingLocatorId}/${manifestName}.ism/manifest`
    let hlsManifest = `${manifestBase}(${hlsFormat})`;
    console.log(`The HLS (MP4) manifest URL is : ${hlsManifest}`);
    console.log("Open the following URL to playback the live stream in an HLS compliant player (HLS.js, Shaka, ExoPlayer) or directly in an iOS device");
    console.log(`${hlsManifest}`);
    console.log();

    let dashManifest = `${manifestBase}(${dashFormat})`;
    console.log(`The DASH manifest URL is : ${dashManifest}`);
    console.log("Open the following URL to playback the live stream from the LiveOutput in the Azure Media Player");
    console.log(`https://ampdemo.azureedge.net/?url=${dashManifest}&heuristicprofile=lowlatency`);
    console.log();
}

監看事件

若要監看事件,請複製您在執行程式碼以建立串流定位器時所取得的串流 URL。 您可以使用您選擇的媒體播放器。 Azure 媒體播放器可用來在媒體播放器示範網站上測試您的串流。

即時事件會在停止時將事件自動轉換為隨選內容。 只要您未刪除資產,即使在停止並刪除事件之後,使用者還是可以視需求將您封存的內容以影片的形式進行串流。 由事件使用中的資產無法刪除;必須先刪除事件。

清除媒體服務帳戶中的資源

如果您完整執行應用程式,其會自動清除 cleanUpResources 函式中使用的所有資源。 請確定應用程式或偵錯工具會完整執行,否則您可能會流失資源,甚至是在您帳戶中執行的即時活動。 再次簽入Azure 入口網站,以確認媒體服務帳戶中已清除所有資源。

在範例程式碼中,請參閱 cleanUpResources 方法以取得詳細資料。

重要事項

讓即時事件處於執行狀態將會產生費用。 請注意,如果專案或計畫因故停止回應或關閉,即時事件可能會繼續在計費狀態中執行。

提出問題、提供意見反應、取得更新

請參閱 Azure 媒體服務社群文章,以了解詢問問題、提供意見反應及取得媒體服務相關更新的不同方式。

Azure 上 Node.js 的更多開發人員文件

取得說明及支援

您可以連絡媒體服務並詢問問題,或依照下列其中一種方法追蹤我們的更新: