Tutorial: Encode a remote file based on URL and stream the video - Azure CLI
Warning
Azure Media Services will be retired June 30th, 2024. For more information, see the AMS Retirement Guide.
This tutorial shows how to easily encode and stream videos on a variety of browsers and devices by using Azure Media Services and the Azure CLI. You can specify input content by using HTTPS or SAS URLs or paths to files in Azure Blob storage.
The example in this article encodes content that you make accessible via an HTTPS URL. Media Services v3 doesn't currently support chunked transfer encoding over HTTPS URLs.
By the end of this tutorial, you'll be able to stream a video.
Create a Media Services account
Before you can encrypt, encode, analyze, manage, and stream media content in Azure, you need to create a Media Services account. That account must be associated with one or more storage accounts.
Your Media Services account and all associated storage accounts must be in the same Azure subscription. We recommend that you use storage accounts that are in the same place as the Media Services account to limit latency and data egress costs.
Create a resource group
az group create -n amsResourceGroup -l westus2
Create an Azure storage account
In this example, we create a General-Purpose v2 Standard LRS account.
If you want to experiment with storage accounts, use --sku Standard_LRS
. When you're picking a SKU for production, consider using --sku Standard_RAGRS
, which provides geographic replication for business continuity. For more information, see storage accounts.
az storage account create -n amsstorageaccount --kind StorageV2 --sku Standard_LRS -l westus2 -g amsResourceGroup
Create an Azure Media Services account
az ams account create --n amsaccount -g amsResourceGroup --storage-account amsstorageaccount -l westus2
You get a response like this:
{
"id": "/subscriptions/<id>/resourceGroups/amsResourceGroup/providers/Microsoft.Media/mediaservices/amsaccount",
"location": "West US 2",
"mediaServiceId": "8b569c2e-d648-4fcb-9035-c7fcc3aa7ddf",
"name": "amsaccount",
"resourceGroup": "amsResourceGroupTest",
"storageAccounts": [
{
"id": "/subscriptions/<id>/resourceGroups/amsResourceGroup/providers/Microsoft.Storage/storageAccounts/amsstorageaccount",
"resourceGroup": "amsResourceGroupTest",
"type": "Primary"
}
],
"tags": null,
"type": "Microsoft.Media/mediaservices"
}
Start the streaming endpoint
The following Azure CLI command starts the default Streaming Endpoint.
az ams streaming-endpoint start -n default -a amsaccount -g amsResourceGroup
You get a response like this:
{
"accessControl": null,
"availabilitySetName": null,
"cdnEnabled": true,
"cdnProfile": "AzureMediaStreamingPlatformCdnProfile-StandardVerizon",
"cdnProvider": "StandardVerizon",
"created": "2019-02-06T21:58:03.604954+00:00",
"crossSiteAccessPolicies": null,
"customHostNames": [],
"description": "",
"freeTrialEndTime": "2019-02-21T22:05:31.277936+00:00",
"hostName": "amsaccount-usw22.streaming.media.azure.net",
"id": "/subscriptions/<id>/resourceGroups/amsResourceGroup/providers/Microsoft.Media/mediaservices/amsaccount/streamingendpoints/default",
"lastModified": "2019-02-06T21:58:03.604954+00:00",
"location": "West US 2",
"maxCacheAge": null,
"name": "default",
"provisioningState": "Succeeded",
"resourceGroup": "amsResourceGroup",
"resourceState": "Running",
"scaleUnits": 0,
"tags": {},
"type": "Microsoft.Media/mediaservices/streamingEndpoints"
}
If the streaming endpoint is already running, you get this message:
(InvalidOperation) The server cannot execute the operation in its current state.
Create a transform for adaptive bitrate encoding
Create a Transform to configure common tasks for encoding or analyzing videos. In this example, we do adaptive bitrate encoding. We then submit a job under the transform that we created. The job is the request to Media Services to apply the transform to the given video or audio content input.
az ams transform create --name testEncodingTransform --preset AdaptiveStreaming --description 'a simple Transform for Adaptive Bitrate Encoding' -g amsResourceGroup -a amsaccount
You get a response like this:
{
"created": "2019-02-15T00:11:18.506019+00:00",
"description": "a simple Transform for Adaptive Bitrate Encoding",
"id": "/subscriptions/<id>/resourceGroups/amsResourceGroup/providers/Microsoft.Media/mediaservices/amsaccount/transforms/testEncodingTransform",
"lastModified": "2019-02-15T00:11:18.506019+00:00",
"name": "testEncodingTransform",
"outputs": [
{
"onError": "StopProcessingJob",
"preset": {
"odatatype": "#Microsoft.Media.BuiltInStandardEncoderPreset",
"presetName": "AdaptiveStreaming"
},
"relativePriority": "Normal"
}
],
"resourceGroup": "amsResourceGroup",
"type": "Microsoft.Media/mediaservices/transforms"
}
Create an output asset
Create an output Asset to use as the encoding job's output.
az ams asset create -n testOutputAssetName -a amsaccount -g amsResourceGroup
You get a response like this:
{
"alternateId": null,
"assetId": "96427438-bbce-4a74-ba91-e38179b72f36",
"container": null,
"created": "2019-02-14T23:58:19.127000+00:00",
"description": null,
"id": "/subscriptions/<id>/resourceGroups/amsResourceGroup/providers/Microsoft.Media/mediaservices/amsaccount/assets/testOutputAssetName",
"lastModified": "2019-02-14T23:58:19.127000+00:00",
"name": "testOutputAssetName",
"resourceGroup": "amsResourceGroup",
"storageAccountName": "amsstorageaccount",
"storageEncryptionFormat": "None",
"type": "Microsoft.Media/mediaservices/assets"
}
Start a job by using HTTPS input
When you submit jobs to process videos, you have to tell Media Services where to find the input video. One option is to specify an HTTPS URL as the job input, as shown in this example.
When you run az ams job start
, you can set a label on the job's output. You can then use the label to identify what the output asset is for.
If you assign a value to the label, set '--output-assets' to "assetname=label".
If you don't assign a value to the label, set '--output-assets' to "assetname=".
Notice that we add "=" to the
output-assets
.
az ams job start --name testJob001 --transform-name testEncodingTransform --base-uri 'https://nimbuscdn-nimbuspm.streaming.mediaservices.windows.net/2b533311-b215-4409-80af-529c3e853622/' --files 'Ignite-short.mp4' --output-assets testOutputAssetName= -a amsaccount -g amsResourceGroup
You get a response like this:
{
"correlationData": {},
"created": "2019-02-15T05:08:26.266104+00:00",
"description": null,
"id": "/subscriptions/<id>/resourceGroups/amsResourceGroup/providers/Microsoft.Media/mediaservices/amsaccount/transforms/testEncodingTransform/jobs/testJob001",
"input": {
"baseUri": "https://nimbuscdn-nimbuspm.streaming.mediaservices.windows.net/2b533311-b215-4409-80af-529c3e853622/",
"files": [
"Ignite-short.mp4"
],
"label": null,
"odatatype": "#Microsoft.Media.JobInputHttp"
},
"lastModified": "2019-02-15T05:08:26.266104+00:00",
"name": "testJob001",
"outputs": [
{
"assetName": "testOutputAssetName",
"error": null,
"label": "",
"odatatype": "#Microsoft.Media.JobOutputAsset",
"progress": 0,
"state": "Queued"
}
],
"priority": "Normal",
"resourceGroup": "amsResourceGroup",
"state": "Queued",
"type": "Microsoft.Media/mediaservices/transforms/jobs"
}
Check status
In five minutes, check the status of the job. It should be "Finished." It's not finished, check again in a few minutes. When it's finished, go to the next step and create a Streaming Locator.
az ams job show -a amsaccount -g amsResourceGroup -t testEncodingTransform -n testJob001
Create a streaming locator and get a path
After the encoding is complete, the next step is to make the video in the output asset available to clients for playback. To do this, first create a Streaming Locator. Then, build streaming URLs that clients can use.
Create a streaming locator
az ams streaming-locator create -n testStreamingLocator --asset-name testOutputAssetName --streaming-policy-name Predefined_ClearStreamingOnly -g amsResourceGroup -a amsaccount
You get a response like this:
{
"alternativeMediaId": null,
"assetName": "output-3b6d7b1dffe9419fa104b952f7f6ab76",
"contentKeys": [],
"created": "2019-02-15T04:35:46.270750+00:00",
"defaultContentKeyPolicyName": null,
"endTime": "9999-12-31T23:59:59.999999+00:00",
"id": "/subscriptions/<id>/resourceGroups/amsResourceGroup/providers/Microsoft.Media/mediaservices/amsaccount/streamingLocators/testStreamingLocator",
"name": "testStreamingLocator",
"resourceGroup": "amsResourceGroup",
"startTime": null,
"streamingLocatorId": "e01b2be1-5ea4-42ca-ae5d-7fe704a5962f",
"streamingPolicyName": "Predefined_ClearStreamingOnly",
"type": "Microsoft.Media/mediaservices/streamingLocators"
}
Get streaming locator paths
az ams streaming-locator get-paths -a amsaccount -g amsResourceGroup -n testStreamingLocator
You get a response like this:
{
"downloadPaths": [],
"streamingPaths": [
{
"encryptionScheme": "NoEncryption",
"paths": [
"/e01b2be1-5ea4-42ca-ae5d-7fe704a5962f/ignite.ism/manifest(format=m3u8-aapl)"
],
"streamingProtocol": "Hls"
},
{
"encryptionScheme": "NoEncryption",
"paths": [
"/e01b2be1-5ea4-42ca-ae5d-7fe704a5962f/ignite.ism/manifest(format=mpd-time-csf)"
],
"streamingProtocol": "Dash"
},
{
"encryptionScheme": "NoEncryption",
"paths": [
"/e01b2be1-5ea4-42ca-ae5d-7fe704a5962f/ignite.ism/manifest"
],
"streamingProtocol": "SmoothStreaming"
}
]
}
Copy the HTTP live streaming (HLS) path. In this case, it's /e01b2be1-5ea4-42ca-ae5d-7fe704a5962f/ignite.ism/manifest(format=m3u8-aapl)
.
Build the URL
Get the streaming endpoint host name
az ams streaming-endpoint list -a amsaccount -g amsResourceGroup -n default
Copy the hostName
value. In this case, it's amsaccount-usw22.streaming.media.azure.net
.
Assemble the URL
"https:// " + <hostName value> + <Hls path value>
Here's an example:
https://amsaccount-usw22.streaming.media.azure.net/7f19e783-927b-4e0a-a1c0-8a140c49856c/ignite.ism/manifest(format=m3u8-aapl)
Test playback by using Azure Media Player
Note
If a player is hosted on an HTTPS site, make sure to start the URL with "https".
- Open a web browser and go to https://aka.ms/azuremediaplayer/.
- In the URL box, paste the URL that you built in the previous section. You can paste the URL in HLS, Dash, or Smooth format. Azure Media Player will automatically use an appropriate streaming protocol for playback on your device.
- Select Update Player.
Note
Azure Media Player can be used for testing but should not be used in a production environment.
Clean up resources
If you no longer need any of the resources in your resource group, including the Media Services and storage accounts that you created for this tutorial, delete the resource group.
Run this Azure CLI command:
az group delete --name amsResourceGroup
Get help and support
You can contact Media Services with questions or follow our updates by one of the following methods:
- Q & A
- Stack Overflow. Tag questions with
azure-media-services
. - @MSFTAzureMedia or use @AzureSupport to request support.
- Open a support ticket through the Azure portal.