【问题标题】:Generating number of thumbnails depending on video size using AWS MediaConvert使用 AWS MediaConvert 根据视频大小生成缩略图数量
【发布时间】:2021-03-12 13:34:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ffmpeg aws-lambda amazon-cloudwatch aws-media-convert


    【解决方案1】:

    您可以从使用 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 负载更改输出 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

    【讨论】:

    • 谢谢,我正在更详细地查看这个,ffprobe 不会花费太多时间,但是,它是 ffmpeg。对于 ~ 150 MB mp4 视频,它会超时 15 秒。我以为它会寻找特定的帧并提取它,但事实并非如此,它只是读取整个视频(如果它的远程资源像 s3 存储桶,则下载它)。
    • By default the COMPLETE details section will include the output path to the last JPEG frame capture,感谢您的提示。这将帮助我避免列出 s3 存储桶
    • 关于 ffmpeg,我希望如此。因为二进制文件不支持文件流,所以你是正确的,文件必须被下载然后处理。这将您限制为 lambda 中的 2 个因素,时间和 lambda 中的本地空间。如果您采用 ffmpeg 流程路线,我建议您使用 ECS 构建容器工作流程并改用它。这样,您就不受大小或处理时间的限制。它增加了解决方案的复杂性,因为您必须构建一个排队系统,但您不会遇到 lambda 的限制。
    猜你喜欢
    • 2021-03-08
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多