public static async Task <FFmpegProcess> RunAsync(params string[] args) { var ffmpegProcess = new FFmpegProcess(args); await ffmpegProcess.RunAsync(); return(ffmpegProcess); }
public async Task ExecuteAsync(WorkerJobHelper <TransformJob> job) { S3Locator inputFile; if (!job.JobInput.TryGet <S3Locator>(nameof(inputFile), out inputFile)) { throw new Exception("Invalid or missing input file."); } S3Locator outputLocation; if (!job.JobInput.TryGet <S3Locator>(nameof(outputLocation), out outputLocation)) { throw new Exception("Invalid or missing output location."); } if (string.IsNullOrWhiteSpace(inputFile.AwsS3Bucket) || string.IsNullOrWhiteSpace(inputFile.AwsS3Key)) { throw new Exception("Not able to obtain input file"); } var data = await inputFile.GetAsync(); var localFileName = "/tmp/" + Guid.NewGuid(); await data.WriteResponseStreamToFileAsync(localFileName, true, CancellationToken.None); var tempFileName = "/tmp/" + Guid.NewGuid() + ".mp4"; var ffmpegParams = new[] { "-y", "-i", localFileName, "-preset", "ultrafast", "-vf", "scale=-1:360", "-c:v", "libx264", "-pix_fmt", "yuv420p", tempFileName }; var ffmpegProcess = await FFmpegProcess.RunAsync(ffmpegParams); File.Delete(localFileName); var s3Params = new PutObjectRequest { BucketName = outputLocation.AwsS3Bucket, Key = (outputLocation.AwsS3KeyPrefix ?? string.Empty) + Guid.NewGuid().ToString() + ".mp4", FilePath = tempFileName, ContentType = "video/mp4" }; var outputS3 = await outputLocation.GetClientAsync(); var putResp = await outputS3.PutObjectAsync(s3Params); job.JobOutput["outputFile"] = new S3Locator { AwsS3Bucket = s3Params.BucketName, AwsS3Key = s3Params.Key }; await job.CompleteAsync(); }
internal static async Task ProcessJobAssignmentAsync(TransformServiceWorkerRequest @event) { var resourceManager = @event.Request.GetAwsV4ResourceManager(); var table = new DynamoDbTable(@event.Request.StageVariables["TableName"]); var jobAssignmentId = @event.JobAssignmentId; try { // 1. Setting job assignment status to RUNNING await UpdateJobAssignmentStatusAsync(resourceManager, table, jobAssignmentId, "RUNNING", null); // 2. Retrieving WorkflowJob var transformJob = await RetrieveTransformJobAsync(resourceManager, table, jobAssignmentId); // 3. Retrieve JobProfile var jobProfile = await RetrieveJobProfileAsync(resourceManager, transformJob); // 4. Retrieve job inputParameters var jobInput = transformJob.JobInput; // 5. Check if we support jobProfile and if we have required parameters in jobInput ValidateJobProfile(jobProfile, jobInput); switch (jobProfile.Name) { case JOB_PROFILE_CREATE_PROXY_LAMBDA: S3Locator inputFile; if (!jobInput.TryGet <S3Locator>(nameof(inputFile), out inputFile)) { throw new Exception("Invalid or missing input file."); } S3Locator outputLocation; if (!jobInput.TryGet <S3Locator>(nameof(outputLocation), out outputLocation)) { throw new Exception("Invalid or missing output location."); } if (string.IsNullOrWhiteSpace(inputFile.AwsS3Bucket) || string.IsNullOrWhiteSpace(inputFile.AwsS3Key)) { throw new Exception("Not able to obtain input file"); } var data = await inputFile.GetAsync(); var localFileName = "/tmp/" + Guid.NewGuid(); await data.WriteResponseStreamToFileAsync(localFileName, true, CancellationToken.None); var tempFileName = "/tmp/" + Guid.NewGuid() + ".mp4"; var ffmpegParams = new[] { "-y", "-i", localFileName, "-preset", "ultrafast", "-vf", "scale=-1:360", "-c:v", "libx264", "-pix_fmt", "yuv420p", tempFileName }; var ffmpegProcess = await FFmpegProcess.RunAsync(ffmpegParams); File.Delete(localFileName); var s3Params = new PutObjectRequest { BucketName = outputLocation.AwsS3Bucket, Key = (outputLocation.AwsS3KeyPrefix ?? string.Empty) + Guid.NewGuid().ToString() + ".mp4", FilePath = tempFileName, ContentType = "video/mp4" }; var outputS3 = await outputLocation.GetClientAsync(); var putResp = await outputS3.PutObjectAsync(s3Params); var jobOutput = new JobParameterBag(); jobOutput["outputFile"] = new S3Locator { AwsS3Bucket = s3Params.BucketName, AwsS3Key = s3Params.Key }; await UpdateJobAssignmentWithOutputAsync(table, jobAssignmentId, jobOutput); await UpdateJobAssignmentStatusAsync(resourceManager, table, jobAssignmentId, "COMPLETED"); break; case JOB_PROFILE_CREATE_PROXY_EC2: var ec2hostname = @event.Request.StageVariables["HostnameInstanceEC2"]; var ec2Url = "http://" + ec2hostname + "/new-transform-job"; var message = new { input = jobInput, notificationEndpoint = new NotificationEndpoint { HttpEndpoint = jobAssignmentId + "/notifications" } }; Logger.Debug("Sending to", ec2Url, "message", message); var mcmaHttp = new McmaHttpClient(); await mcmaHttp.PostAsJsonAsync(ec2Url, message); Logger.Debug("Done"); break; } } catch (Exception ex) { Logger.Exception(ex); try { await UpdateJobAssignmentStatusAsync(resourceManager, table, jobAssignmentId, "FAILED", ex.ToString()); } catch (Exception innerEx) { Logger.Exception(innerEx); } } finally { Logger.Debug("Exiting TransformServiceWorker.ProcessJobAssignmentAsync"); } }