static void Main(string[] args) { ConfigWrapper config = new ConfigWrapper(); try{ IAzureMediaServicesClient client = CreateMediaServicesClient(config); // Set the polling interval for long running operations to 2 seconds. // The default value is 30 seconds for the .NET client SDK client.LongRunningOperationRetryTimeout = 2; // Creating a unique suffix so that we don't have name collisions if you run the sample // multiple times without cleaning up. string uniqueness = Guid.NewGuid().ToString().Substring(0, 13); string jobName = "job-" + uniqueness; string locatorName = "locator-" + uniqueness; string outputAssetName = "output-" + uniqueness; string inputAssetName = "input-" + uniqueness; // Ensure that you have the desired encoding Transform. This is really a one time setup operation. Transform transform = EnsureTransformExists(client, config.ResourceGroup, config.AccountName, AdaptiveStreamingTransformName); // Create a new input Asset and upload the specified local video file into it. CreateInputAsset(client, config.ResourceGroup, config.AccountName, inputAssetName, InputMP4FileName); // Use the name of the created input asset to create the job input. JobInput jobInput = new JobInputAsset(assetName: inputAssetName); // Output from the encoding Job must be written to an Asset, so let's create one Asset outputAsset = client.Assets.CreateOrUpdate(config.ResourceGroup, config.AccountName, outputAssetName, new Asset()); Job job = SubmitJob(client, config.ResourceGroup, config.AccountName, AdaptiveStreamingTransformName, jobName, jobInput, outputAssetName); // In this demo code, we will poll for Job status // Polling is not a recommended best practice for production applications because of the latency it introduces. // Overuse of this API may trigger throttling. Developers should instead use Event Grid. job = WaitForJobToFinish(client, config.ResourceGroup, config.AccountName, AdaptiveStreamingTransformName, jobName); if (job.State == JobState.Finished) { Console.WriteLine("Job finished."); if (!Directory.Exists(OutputFolder)) { Directory.CreateDirectory(OutputFolder); } DownloadResults(client, config.ResourceGroup, config.AccountName, outputAssetName, OutputFolder); StreamingLocator locator = CreateStreamingLocator(client, config.ResourceGroup, config.AccountName, outputAsset.Name, locatorName); IList <string> urls = GetStreamingURLs(client, config.ResourceGroup, config.AccountName, locator.Name); foreach (var url in urls) { Console.WriteLine(url); } } Console.WriteLine("Done. Copy and paste the Streaming URL into the Azure Media Player at http://ampdemo.azureedge.net/"); Console.WriteLine("Press Enter to Continue"); Console.ReadLine(); } catch (ApiErrorException ex) { Console.WriteLine("{0}", ex.Message); Console.WriteLine("ERROR:API call failed with error code: {0} and message: {1}", ex.Body.Error.Code, ex.Body.Error.Message); } }
// </GetCredentialsAsync> /// <summary> /// Creates the AzureMediaServicesClient object based on the credentials /// supplied in local configuration file. /// </summary> /// <param name="config">The parm is of type ConfigWrapper. This class reads values from local configuration file.</param> /// <returns></returns> // <CreateMediaServicesClient> private static async Task <IAzureMediaServicesClient> CreateMediaServicesClientAsync(ConfigWrapper config) { var credentials = await GetCredentialsAsync(config); return(new AzureMediaServicesClient(config.ArmEndpoint, credentials) { SubscriptionId = config.SubscriptionId, }); }
/// <summary> /// Run the sample async. /// </summary> /// <param name="config">The parm is of type ConfigWrapper. This class reads values from local configuration file.</param> /// <returns></returns> // <RunAsync> private static async Task RunAsync(ConfigWrapper config) { IAzureMediaServicesClient client = await CreateMediaServicesClientAsync(config); // Set the polling interval for long running operations to 2 seconds. // The default value is 30 seconds for the .NET client SDK client.LongRunningOperationRetryTimeout = 2; // Creating a unique suffix so that we don't have name collisions if you run the sample // multiple times without cleaning up. string uniqueness = Guid.NewGuid().ToString("N"); string jobName = $"job-{uniqueness}"; string locatorName = $"locator-{uniqueness}"; string outputAssetName = $"output-{uniqueness}"; string inputAssetName = $"input-{uniqueness}"; // Ensure that you have the desired encoding Transform. This is really a one time setup operation. _ = await GetOrCreateTransformAsync(client, config.ResourceGroup, config.AccountName, AdaptiveStreamingTransformName); // Create a new input Asset and upload the specified local video file into it. _ = await CreateInputAssetAsync(client, config.ResourceGroup, config.AccountName, inputAssetName, InputMP4FileName); // Use the name of the created input asset to create the job input. _ = new JobInputAsset(assetName: inputAssetName); // Output from the encoding Job must be written to an Asset, so let's create one Asset outputAsset = await CreateOutputAssetAsync(client, config.ResourceGroup, config.AccountName, outputAssetName); _ = await SubmitJobAsync(client, config.ResourceGroup, config.AccountName, AdaptiveStreamingTransformName, jobName, inputAssetName, outputAsset.Name); // In this demo code, we will poll for Job status // Polling is not a recommended best practice for production applications because of the latency it introduces. // Overuse of this API may trigger throttling. Developers should instead use Event Grid. Job job = await WaitForJobToFinishAsync(client, config.ResourceGroup, config.AccountName, AdaptiveStreamingTransformName, jobName); if (job.State == JobState.Finished) { Console.WriteLine("Job finished."); if (!Directory.Exists(OutputFolderName)) { Directory.CreateDirectory(OutputFolderName); } await DownloadOutputAssetAsync(client, config.ResourceGroup, config.AccountName, outputAsset.Name, OutputFolderName); StreamingLocator locator = await CreateStreamingLocatorAsync(client, config.ResourceGroup, config.AccountName, outputAsset.Name, locatorName); // Note that the URLs returned by this method include a /manifest path followed by a (format=) // parameter that controls the type of manifest that is returned. // The /manifest(format=m3u8-aapl) will provide Apple HLS v4 manifest using MPEG TS segments. // The /manifest(format=mpd-time-csf) will provide MPEG DASH manifest. // And using just /manifest alone will return Microsoft Smooth Streaming format. // There are additional formats available that are not returned in this call, please check the documentation // on the dynamic packager for additional formats - see https://docs.microsoft.com/azure/media-services/latest/dynamic-packaging-overview IList <string> urls = await GetStreamingUrlsAsync(client, config.ResourceGroup, config.AccountName, locator.Name); foreach (var url in urls) { Console.WriteLine(url); } } Console.WriteLine("Done. Copy and paste the Streaming URL ending in '/manifest' into the Azure Media Player at 'http://aka.ms/azuremediaplayer'."); Console.WriteLine("See the documentation on Dynamic Packaging for additional format support, including CMAF."); Console.WriteLine("https://docs.microsoft.com/azure/media-services/latest/dynamic-packaging-overview"); }