/// <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; try { // Ensure that you have customized transforms for the VideoAnalyzer. This is really a one time setup operation. Transform videoAnalyzerTransform = EnsureTransformExists(client, config.ResourceGroup, config.AccountName, VideoAnalyzerTransformName, new VideoAnalyzerPreset()); // 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 inputAssetName = "input-" + uniqueness; string outputAssetName = "output-" + uniqueness; CreateInputAsset(client, config.ResourceGroup, config.AccountName, inputAssetName, inputMP4FileName).Wait(); JobInput input = new JobInputAsset(assetName: inputAssetName); Asset outputAsset = CreateOutputAsset(client, config.ResourceGroup, config.AccountName, outputAssetName); // Note that you can now pass custom correlation data Dictionary into the job to use via EventGrid or other Job polling listeners. // this is handy for passing tenant ID, or custom workflow data as part of your job. var correlationData = new Dictionary <string, string>(); correlationData.Add("customData1", "some custom data to pass through the job"); correlationData.Add("custom ID", "some GUID here"); Job job = SubmitJob(client, config.ResourceGroup, config.AccountName, VideoAnalyzerTransformName, jobName, input, outputAsset.Name, correlationData); DateTime startedTime = DateTime.Now; job = WaitForJobToFinish(client, config.ResourceGroup, config.AccountName, VideoAnalyzerTransformName, jobName); TimeSpan elapsed = DateTime.Now - startedTime; if (job.State == JobState.Finished) { Console.WriteLine("Job finished."); if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } DownloadResults(client, config.ResourceGroup, config.AccountName, outputAsset.Name, outputFolder).Wait(); } else if (job.State == JobState.Error) { Console.WriteLine($"ERROR: Job finished with error message: {job.Outputs[0].Error.Message}"); Console.WriteLine($"ERROR: error details: {job.Outputs[0].Error.Details[0].Message}"); } } catch (ApiErrorException ex) { string code = ex.Body.Error.Code; string message = ex.Body.Error.Message; Console.WriteLine("ERROR:API call failed with error code: {0} and message: {1}", code, message); } }
static void Main(string[] args) { ConfigWrapper config = new ConfigWrapper(); 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; try { // Ensure that you have customized encoding Transform. This is really a one time setup operation. Transform adaptiveEncodeTransform = EnsureTransformExists(client, config.Region, transformName, preset: new BuiltInStandardEncoderPreset(EncoderNamedPreset.AdaptiveStreaming)); // 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 inputAssetName = "input-" + uniqueness; string outputAssetName = "output-" + uniqueness; Asset asset = client.Assets.CreateOrUpdate(resourceGroupName, accountName, inputAssetName, new Asset()); var input = new JobInputHttp( baseUri: "https://nimbuscdn-nimbuspm.streaming.mediaservices.windows.net/2b533311-b215-4409-80af-529c3e853622/", files: new List <String> { "Ignite-short.mp4" }, label: "input1" ); CreateOutputAsset(client, outputAssetName); Job job = SubmitJob(client, transformName, jobName, input, outputAssetName); DateTime startedTime = DateTime.Now; job = WaitForJobToFinish(client, transformName, jobName); TimeSpan elapsed = DateTime.Now - startedTime; if (job.State == JobState.Finished) { Console.WriteLine("Job finished."); if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } DownloadResults(client, outputAssetName, outputFolder).Wait(); } else if (job.State == JobState.Error) { Console.WriteLine($"ERROR: Job finished with error message: {job.Outputs[0].Error.Message}"); Console.WriteLine($"ERROR: error details: {job.Outputs[0].Error.Details[0].Message}"); } } catch (ApiErrorException ex) { string code = ex.Body.Error.Code; string message = ex.Body.Error.Message; Console.WriteLine("ERROR:API call failed with error code: {0} and message: {1}", code, 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, }); }
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 outputAssetName = "output-" + uniqueness; string inputAssetName = "input-" + uniqueness; // Ensure that you have the desired encoding Transform. This is really a one time setup operation. Transform videoAnalyzerTransform = EnsureTransformExists(client, config.ResourceGroup, config.AccountName, VideoAnalyzerTransformName, new VideoAnalyzerPreset("en-US")); // 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, VideoAnalyzerTransformName, 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, VideoAnalyzerTransformName, 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); } Console.WriteLine("Done."); 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); } }