0

阅读本文后,我感觉 AWS 媒体转换作业模板不能重复用于生成任意视频大小的缩略图。本文假设我们知道预先上传的视频的大小/持续时间,因此我们需要的缩略图数量。

我正在寻找的是根据视频大小生成随机数量的缩略图(例如,大视频的大量缩略图和小视频的少量缩略图)。我使用 lambda 触发器和 ffmpeg lambda 层接近了这个解决方案,但是对于大于 150MB 的视频,lambda 函数超时(最多 15 分钟)(因为从 s3 存储桶中读取视频需要时间)。

我有哪些选择来处理大量视频、生成可变数量的缩略图、合并这些缩略图以生成精灵?

我尝试使用 ffmpeg/ffprob 的 lambda 触发器来生成精灵,但这有超时问题。现在我已经设置了一个云监视事件规则来触发 mediaconvert 作业状态更改(已完成)的 lambda 函数并合并拇指以生成精灵,这看起来要轻得多,但我需要任意数量的拇指。

4

1 回答 1

3

您可以从使用 ffprobe 切换到 MediaInfo [1]。这可以获得输入文件的持续时间和文件大小。从那里您可以使用文章中的计算并使用 MediaConvert 创建您的精灵图像。作业完成后,您可以使用 COMPLETE CloudWatch Event 触发可以创建精灵清单的后处理工作流。默认情况下,COMPLETE 详细信息部分将包括从您的 MediaConvert 输出 [2] 到最后一个 JPEG 帧捕获的输出路径。

作为预处理步骤,您可以收集文件的持续时间以及大小。如果您只需要文件的大小,那么您可以使用 S3 SDK 获取文件的内容长度(调用 HEAD 到对象)并从那里计算。

s3 = boto3.client('s3')
response = s3.head_object(Bucket='bucket', Key='keyname')
size = response['ContentLength']
print(size)

您还可以在作业模板中使用参数覆盖。例如,您可以创建一个引用模板的作业,但您可以通过调用 CreateJob API 来指定覆盖这些设置的设置。

以下是预设,但同样的概念适用于作业模板。

使用以下 HLS 系统预设

System-Avc_16x9_720p_29_97fps_3500kbps    
System-Avc_16x9_360p_29_97fps_1200kbps
System-Avc_16x9_270p_14_99fps_400kbps

JSON Payload 更改了输出 2 (System-Avc_16x9_360p_29_97fps_1200kbps) 和输出 3 (System-Avc_16x9_270p_14_99fps_400kbps) 的音频选择器源名称

{
  "Queue": "arn:aws:mediaconvert:us-west-2:111122223333:queues/Default",
  "UserMetadata": {},
  "Role": "arn:aws:iam::111122223333:role/EMFRoleSPNames",
  "Settings": {
    "OutputGroups": [
      {
        "Name": "Apple HLS",
        "Outputs": [
          {
            "NameModifier": "_1",
            "Preset": "System-Avc_16x9_720p_29_97fps_3500kbps"    
          },
          {
            "NameModifier": "_2",
            "Preset": "System-Avc_16x9_360p_29_97fps_1200kbps",
             "AudioDescriptions": [
              {
                "AudioSourceName": "Audio Selector 2"
              }
            ]
          },
          {
            "NameModifier": "_3",
            "Preset": "System-Avc_16x9_270p_14_99fps_400kbps",
            "AudioDescriptions": [
              {
                "AudioSourceName": "Audio Selector 2"
              }
            ]
          }
        ],
        "OutputGroupSettings": {
          "Type": "HLS_GROUP_SETTINGS",
          "HlsGroupSettings": {
            "ManifestDurationFormat": "INTEGER",
            "SegmentLength": 10,
            "TimedMetadataId3Period": 10,
            "CaptionLanguageSetting": "OMIT",
            "Destination": "s3://myawsbucket/out/master",
            "TimedMetadataId3Frame": "PRIV",
            "CodecSpecification": "RFC_4281",
            "OutputSelection": "MANIFESTS_AND_SEGMENTS",
            "ProgramDateTimePeriod": 600,
            "MinSegmentLength": 0,
            "DirectoryStructure": "SINGLE_DIRECTORY",
            "ProgramDateTime": "EXCLUDE",
            "SegmentControl": "SEGMENTED_FILES",
            "ManifestCompression": "NONE",
            "ClientCache": "ENABLED",
            "StreamInfResolution": "INCLUDE"
          }
        }
      }
    ],
    "Inputs": [
      {
        "AudioSelectors": {
          "Audio Selector 1": {
            "Offset": 0,
            "DefaultSelection": "DEFAULT",
            "ProgramSelection": 1,
            "SelectorType": "TRACK",
            "Tracks": [
              1
            ]
          },
          "Audio Selector 2": {
            "Offset": 0,
            "DefaultSelection": "NOT_DEFAULT",
            "ProgramSelection": 1,
            "SelectorType": "TRACK",
            "Tracks": [
              2
            ]
          }
        },
        "VideoSelector": {
          "ColorSpace": "FOLLOW"
        },
        "FilterEnable": "AUTO",
        "PsiControl": "USE_PSI",
        "FilterStrength": 0,
        "DeblockFilter": "DISABLED",
        "DenoiseFilter": "DISABLED",
        "TimecodeSource": "EMBEDDED",
        "FileInput": "s3://myawsbucket/input/test.mp4"
      }
    ],
    "TimecodeConfig": {
      "Source": "EMBEDDED"
    }
  }
}

== 资源 ==

[1] https://aws.amazon.com/blogs/media/running-mediainfo-as-an-aws-lambda-function/
[2] https://docs.aws.amazon.com/mediaconvert/latest/ ug/file-group-with-frame-capture-output.html

于 2020-12-01T01:11:44.507 回答