Вывести шаблон задания AWS MediaConvert в тот же каталог.

Я пытаюсь настроить работу в сервисе Amazon MediaConvert, который будет брать любое видео, которое я загружаю в корзину S3, и конвертировать его в формат, удобный для потоковой передачи. По большей части, похоже, это работает - мое приложение вызывает API для выполнения задания каждый раз, когда я загружаю видео.

Однако для удобства (чтобы упростить поиск выходных данных для конкретного файла) я хотел бы поместить выходные файлы в тот же каталог, в котором был найден входной файл.

Есть ли способ установить вывод шаблона задания на путь относительно ввода? В качестве альтернативы, можно ли переопределить выходной каталог без необходимости определять все задание с нуля в коде Java?

Вот как я устанавливаю входной каталог в Java API:

CreateJobRequest request = CreateJobRequest.builder()
    .role(roleName)
    .jobTemplate("Process uploaded videos") // Matches a custom template I made in AWS
    .settings(JobSettings.builder()
        .inputs(Input.builder()
            .fileInput("s3://" + mConfig.bucket + "/" + mFolder + filename)
            .build())
        .build())
    .build();

Обновленная версия с указанным выходным путем:

CreateJobRequest request = CreateJobRequest.builder()
    .role(MEDIACONVERT_ROLE)
    .jobTemplate("Process uploaded videos") // Matches a custom template I made in AWS
    .settings(JobSettings.builder()
        .inputs(Input.builder()
            .fileInput("s3://" + mConfig.bucket + "/" + mFolder + filename)
            .build())
        .outputGroups(OutputGroup.builder()
            .name("Streaming video") // Matches the name of the output group in the template
            .outputGroupSettings(OutputGroupSettings.builder()
                .type(OutputGroupType.FILE_GROUP_SETTINGS)
                .fileGroupSettings(FileGroupSettings.builder()
                    .destination("s3://" + mConfig.bucket + "/" + mFolder) // Put output in the same folder as the input
                    .build())
                .build())
            .build())
        .build())
    .build();

person John Brink    schedule 21.01.2021    source источник


Ответы (1)


В AWS Elemental MediaConvert нет собственного метода для установки относительного пути для вывода на основе местоположения ввода, однако вы правы в том, что вы можете переопределить параметры из шаблона без необходимости определять всю работу с нуля.

Например, вот пример JSON AWS ​​CLI (boto3) отправки задания с использованием шаблона, который не ссылается на предустановки.

Примечания: этот шаблон содержит объект входного массива (обратите внимание, что нет параметра FileURI, вы добавите его при создании задания)

{
  "Queue": "arn:aws:mediaconvert:us-west-2:111122223333:queues/Default",
  "Name": "Test_MP4", 
  "Description":"Test MP4"
  "Settings": {
    "OutputGroups": [
      {
        "Name": "File Group",
        "Outputs": [
          {
            "ContainerSettings": {
              "Container": "MP4",
              "Mp4Settings": {
                "CslgAtom": "EXCLUDE",
                "FreeSpaceBox": "EXCLUDE",
                "MoovPlacement": "NORMAL"
              }
            },
            "VideoDescription": {
              "Width": 3840,
              "ScalingBehavior": "DEFAULT",
              "Height": 2160,
              "VideoPreprocessors": {
                "Deinterlacer": {
                  "Algorithm": "INTERPOLATE",
                  "Mode": "DEINTERLACE",
                  "Control": "NORMAL"
                }
              },
              "TimecodeInsertion": "DISABLED",
              "AntiAlias": "ENABLED",
              "Sharpness": 50,
              "CodecSettings": {
                "Codec": "H_265",
                "H265Settings": {
                  "InterlaceMode": "PROGRESSIVE",
                  "ParNumerator": 1,
                  "NumberReferenceFrames": 3,
                  "FramerateDenominator": 1001,
                  "GopClosedCadence": 1,
                  "AlternateTransferFunctionSei": "DISABLED",
                  "HrdBufferInitialFillPercentage": 90,
                  "GopSize": 48,
                  "Slices": 4,
                  "GopBReference": "ENABLED",
                  "HrdBufferSize": 20000000,
                  "SlowPal": "DISABLED",
                  "ParDenominator": 1,
                  "SpatialAdaptiveQuantization": "ENABLED",
                  "TemporalAdaptiveQuantization": "ENABLED",
                  "FlickerAdaptiveQuantization": "DISABLED",
                  "Bitrate": 10000000,
                  "FramerateControl": "SPECIFIED",
                  "RateControlMode": "CBR",
                  "CodecProfile": "MAIN_MAIN",
                  "Tiles": "ENABLED",
                  "Telecine": "NONE",
                  "FramerateNumerator": 24000,
                  "MinIInterval": 0,
                  "AdaptiveQuantization": "HIGH",
                  "CodecLevel": "LEVEL_5",
                  "SceneChangeDetect": "ENABLED",
                  "QualityTuningLevel": "MULTI_PASS_HQ",
                  "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                  "UnregisteredSeiTimecode": "DISABLED",
                  "GopSizeUnits": "FRAMES",
                  "ParControl": "SPECIFIED",
                  "NumberBFramesBetweenReferenceFrames": 3,
                  "TemporalIds": "DISABLED",
                  "SampleAdaptiveOffsetFilterMode": "ADAPTIVE"
                }
              },
              "AfdSignaling": "NONE",
              "DropFrameTimecode": "ENABLED",
              "RespondToAfd": "NONE",
              "ColorMetadata": "INSERT"
            },
            "AudioDescriptions": [
              {
                "AudioTypeControl": "FOLLOW_INPUT",
                "CodecSettings": {
                  "Codec": "AAC",
                  "AacSettings": {
                    "AudioDescriptionBroadcasterMix": "NORMAL",
                    "Bitrate": 160000,
                    "RateControlMode": "CBR",
                    "CodecProfile": "LC",
                    "CodingMode": "CODING_MODE
{
  "Settings": {
    "OutputGroups": [
      {
        "Name": "File Group",
        "Outputs": [
          {
          "CaptionDescriptions": [
              {
                "DestinationSettings": {
                  "DestinationType": "EMBEDDED"
                },
                "CaptionSelectorName": "Captions Selector 1",
                "LanguageCode": "ENG"
              }
            ]
          }
        ],
        "OutputGroupSettings": {
          "Type": "FILE_GROUP_SETTINGS",
          "FileGroupSettings": {
            "Destination": "s3://myawsbucket/newfolder/out/"
          }
        }
      }
    ],
    "AdAvailOffset": 0,
    "Inputs": [
      {
        "AudioSelectors": {
          "Audio Selector 1": {
            "Offset": 0,
            "DefaultSelection": "DEFAULT",
            "ProgramSelection": 1
          }
        },
        "VideoSelector": {
          "ColorSpace": "FOLLOW"
        },
        "FilterEnable": "AUTO",
        "PsiControl": "USE_PSI",
        "FilterStrength": 0,
        "DeblockFilter": "DISABLED",
        "DenoiseFilter": "DISABLED",
        "TimecodeSource": "EMBEDDED",
        "FileInput": "s3://myawsbucket/input/test.mp4",
        "CaptionSelectors": {
          "Captions Selector 1": {
            "SourceSettings": {
              "SourceType": "SCC",
              "FileSourceSettings": {
                "SourceFile": "s3://myawsbucket/input/Captions/SCC/test.scc"
              }
            }
          }
        }
      }
    ]
  },
  "JobTemplate": "Test_MP4",
  "Role": "arn:aws:iam::111122223333:role/MediaConvertRole"
}
0", "RawFormat": "NONE", "SampleRate": 48000, "Specification": "MPEG4" } }, "LanguageCodeControl": "FOLLOW_INPUT", "AudioType": 0 } ], "NameModifier": "_1" } ], "OutputGroupSettings": { "Type": "FILE_GROUP_SETTINGS", "FileGroupSettings": { "Destination": "s3://myawsbucket/out/" } } } ], "AdAvailOffset": 0, "Inputs": [ { "AudioSelectors": { "Audio Selector 1": { "Offset": 0, "DefaultSelection": "DEFAULT", "ProgramSelection": 1 } }, "VideoSelector": { "ColorSpace": "FOLLOW" }, "FilterEnable": "AUTO", "PsiControl": "USE_PSI", "FilterStrength": 0, "DeblockFilter": "DISABLED", "DenoiseFilter": "DISABLED", "TimecodeSource": "EMBEDDED" } ] } }

Следующая полезная нагрузка JSON добавляет входные данные и селектор заголовков на входе, а также дорожку подписей к выходным данным и изменяет целевое расположение для выходного файла.

Примечание. Вам необходимо обязательно указать имя шаблона задания, а также роль, которую должна принимать служба (т.е. то, что вы установили в разделе «Настройка с использованием IAM»).

{
  "Settings": {
    "OutputGroups": [
      {
        "Name": "File Group",
        "Outputs": [
          {
          "CaptionDescriptions": [
              {
                "DestinationSettings": {
                  "DestinationType": "EMBEDDED"
                },
                "CaptionSelectorName": "Captions Selector 1",
                "LanguageCode": "ENG"
              }
            ]
          }
        ],
        "OutputGroupSettings": {
          "Type": "FILE_GROUP_SETTINGS",
          "FileGroupSettings": {
            "Destination": "s3://myawsbucket/newfolder/out/"
          }
        }
      }
    ],
    "AdAvailOffset": 0,
    "Inputs": [
      {
        "AudioSelectors": {
          "Audio Selector 1": {
            "Offset": 0,
            "DefaultSelection": "DEFAULT",
            "ProgramSelection": 1
          }
        },
        "VideoSelector": {
          "ColorSpace": "FOLLOW"
        },
        "FilterEnable": "AUTO",
        "PsiControl": "USE_PSI",
        "FilterStrength": 0,
        "DeblockFilter": "DISABLED",
        "DenoiseFilter": "DISABLED",
        "TimecodeSource": "EMBEDDED",
        "FileInput": "s3://myawsbucket/input/test.mp4",
        "CaptionSelectors": {
          "Captions Selector 1": {
            "SourceSettings": {
              "SourceType": "SCC",
              "FileSourceSettings": {
                "SourceFile": "s3://myawsbucket/input/Captions/SCC/test.scc"
              }
            }
          }
        }
      }
    ]
  },
  "JobTemplate": "Test_MP4",
  "Role": "arn:aws:iam::111122223333:role/MediaConvertRole"
}

Чтобы изменить только пункт назначения, вы должны использовать этот JSON:

{
  "Settings": {
    "OutputGroups": [
      {
        "OutputGroupSettings": {
          "Type": "FILE_GROUP_SETTINGS",
          "FileGroupSettings": {
            "Destination": "s3://myawsbucket/newfolder/out/"
          }
        }
      }
    ],
    "Inputs": [
      {
        "FileInput": "s3://myawsbucket/input/test.mp4"
      }
    ]
  },
  "JobTemplate": "Test_MP4",
  "Role": "arn:aws:iam::111122223333:role/MediaConvertRole"
}
person JeffH-AWS    schedule 26.01.2021
comment
Отлично. Итак, если я правильно понимаю, совпадающее имя File Group приведет к тому, что запрос объединит JSON для каждого задания в определение шаблона? - person John Brink; 27.01.2021
comment
Это значение JobTemplate, которое должно соответствовать заданию создания JSON с уже существующим шаблоном. Затем другие параметры объединяются и переопределяют настройки в шаблоне. - person JeffH-AWS; 27.01.2021
comment
Я попытался скопировать блок OutputGroups - ›OutputGroupSettings из вашего примера, и теперь я получаю сообщение об ошибке / outputGroups / 0 / outputGroupSettings: должно иметь не более 2 свойств. Не похоже, что какие-либо другие части вашего образца JSON необходимы для добавления в мой код - я что-то упускаю или виноват что-то еще? - person John Brink; 27.01.2021
comment
Вы могли бы использовать что-то вроде этого: { "Settings": { "OutputGroups": [ { "OutputGroupSettings": { "Type": "FILE_GROUP_SETTINGS", "FileGroupSettings": { "Destination": "s3://myawsbucket/newfolder/out/" } } } ], "Inputs": [ { "FileInput": "s3://myawsbucket/input/test.mp4", } ] }, "JobTemplate": "Test_MP4", "Role": "arn:aws:iam::111122223333:role/MediaConvertRole" } Хорошо, это выглядит ужасно - добавляю этот бит к ответу. - person JeffH-AWS; 28.01.2021
comment
Если у вас все еще возникают проблемы после попытки использования обновленного примера формата JSON, не могли бы вы выйти из системы createJobRequest, чтобы я мог просмотреть отправляемый вами JSON? Я просто проверил его на своем конце, чтобы убедиться, что я не оставил никаких опечаток. Кроме запятой, которую я случайно оставил в своем предыдущем комментарии в конце этой строки: "FileInput": "s3://myawsbucket/input/test.mp4", - person JeffH-AWS; 28.01.2021
comment
К сожалению, из-за особенностей работы AWS API 2.0 для Java я не могу создать задание или вывести его содержимое в формате JSON. Лучшее, что я могу сделать, это .toString(): CreateJobRequest(JobTemplate=Process uploaded videos, Role=arn:aws:iam::ID:role/service-role/MediaConvert_Default_Role, Settings=JobSettings(Inputs=[Input(FileInput=s3://BUCKET_NAME/PATH/file_example_MP4_1280_10MG.mp4)], OutputGroups=[OutputGroup(Name=Streaming video, OutputGroupSettings=OutputGroupSettings(FileGroupSettings=FileGroupSettings(Destination=s3://BUCKET_NAME/PATH/), Type=FILE_GROUP_SETTINGS))])) - person John Brink; 28.01.2021
comment
Обновленный исходный код, который я использовал для создания вышеуказанного, был добавлен к моему первоначальному вопросу выше. - person John Brink; 28.01.2021
comment
Что ж, я все еще борюсь с этой проблемой, но ваш ответ кажется правильным, насколько я могу судить, поэтому я отмечу его. - person John Brink; 01.02.2021
comment
Я наконец выяснил причину проблемы - я проверил JSON для своего шаблона, и у него был OutputGroupSettings.Type = CMAF_GROUP_SETTINGS. Я изменил свой запрос на соответствующий, и работа была успешно запущена. Спасибо за вашу помощь. - person John Brink; 03.02.2021
comment
Привет, Джон, извини, что оставил тебя там висеть. У меня возникли некоторые личные вещи, которые ненадолго задержали меня. Я так рад, что вам удалось это запустить! - person JeffH-AWS; 04.02.2021