azure-media-servicesazure-media-player

Azure media player How to get the source url for the player


I have an azure media services account with some uploaded videos, but these videos only play on the browser with some additional parameters like these (?sv=2017-04-17&sr=c&sig=QMSr...) something like authentication keys. I want a generic permanent progressive video URL that can be played anytime, I tried to use the azure media player with my video URLs with .ism/manifest and .mp4 but both couldn't be played exp:

https://<MY_BLOBSTORAGE_ACCOUNT>.blob.core.windows.net/<Asset-ID>/Video_FILE_NAME>.ism/manifest

https://<MY_BLOBSTORAGE_ACCOUNT>.blob.core.windows.net/<Asset-ID>/<Video_FILE_NAME>_1280x720_AACAudio.mp4

I have tried the player from this official microsoft documentation: http://amp.azure.net/libs/amp/latest/docs/index.html#full-setup-of-azure-media-player

Also note that the Azure Media Services V3 documentation & the community of the ams itself is very poor and weak in terms of explaining the steps for programmatically getting the video urls for the player.


Solution

  • I found the solution with help of a friend, after creating the streaming locator, I have to make sure that the streaming endpoint is running and then get build URLs by looping over paths which I need to get using StreamingLocators.ListPathsAsync, below is the code snippet.

            private async Task<StreamingLocator> CreateStreamingLocatorAsync(
                IAzureMediaServicesClient client,
                string resourceGroup,
                string accountName,
                string assetName,
                string locatorName)
            {
                StreamingLocator locator = await client.StreamingLocators.CreateAsync(
                    resourceGroup,
                    accountName,
                    locatorName,
                    new StreamingLocator
                    {
                        AssetName = assetName,
                        StreamingPolicyName = PredefinedStreamingPolicy.ClearStreamingOnly
                    });
    
                return locator;
            }
    
            private async Task<IList<string>> GetStreamingUrlsAsync(
                IAzureMediaServicesClient client,
                string resourceGroupName,
                string accountName,
                String locatorName)
            {
                const string DefaultStreamingEndpointName = "default";
    
                IList<string> streamingUrls = new List<string>();
    
                StreamingEndpoint streamingEndpoint = await client.StreamingEndpoints.GetAsync(resourceGroupName, accountName, DefaultStreamingEndpointName);
    
                if (streamingEndpoint != null)
                {
                    if (streamingEndpoint.ResourceState != StreamingEndpointResourceState.Running)
                    {
                        await client.StreamingEndpoints.StartAsync(resourceGroupName, accountName, DefaultStreamingEndpointName);
                    }
                }
    
                ListPathsResponse paths = await client.StreamingLocators.ListPathsAsync(resourceGroupName, accountName, locatorName);
    
                foreach (StreamingPath path in paths.StreamingPaths)
                {
                    UriBuilder uriBuilder = new UriBuilder();
                    uriBuilder.Scheme = "https";
                    uriBuilder.Host = streamingEndpoint.HostName;
    
                    uriBuilder.Path = path.Paths[0];
                    streamingUrls.Add(uriBuilder.ToString());
                }
    
                return streamingUrls;
            }
    

    and in my service method I do the below:

    StreamingLocator locator = await CreateStreamingLocatorAsync(client,
    config.ResourceGroup, config.AccountName, outputAsset.Name, locatorName);
    
    IList<string> streamingUrls = await GetStreamingUrlsAsync(client, config.ResourceGroup, config.AccountName, locator.Name);
    foreach (var url in streamingUrls)
       {
           urls.Add(url);
           Console.WriteLine(url);
       }
    myModel.StreamingUrls = urls;