1

我正在尝试将.ogv文件转换为.mp4使用AWS Lambdaffmpeg上的层。


我按照Serverless Framework 人员的教程.mp4's 转换为GIF's,效果很好。使用相同的ffmpeg 静态构建(ffmpeg-git-amd64-static.tar.xz) 我开始将.ogv文件转换为.mp4文件。

到目前为止,我已经成功地将视频上传到 S3 存储桶,让 Lambda 检索该视频,使用ffmpeg二进制文件对视频执行某些操作,并将新文件复制到 S3。


问题:

创建的视频将不会播放。

数据点 1:函数生成的文件太小。

输入视频文件1.3MB,输出视频只有256.0KB

数据点 2: 未找到 moov atom。

将生成的视频从 S3 复制到我的本地计算机后,我尝试使用播放ffplay,但收到此错误:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd613093400] moov atom not found
frank.mp4: Invalid data found when processing input

据我所知,moov atom 应该包含有关.mp4文件的重要元数据。


执行:

我使用无服务器框架来设置 AWS 基础设施。

以下是ffmpeg我尝试过的一些不同的命令:

第一次尝试:

  // convert to mp4!
    spawnSync(
      "/opt/ffmpeg/ffmpeg",
      [
        "-i",
        `/tmp/${record.s3.object.key}`,
        "-vcodec",
        "libx264",
        "-acodec",
        "aac",
        `/tmp/${record.s3.object.key}.mp4`
      ],
      { stdio: "inherit" }
    );

第二次尝试:

 // convert to mp4!
    spawnSync(
      "/opt/ffmpeg/ffmpeg",
      [
        "-i",
        `/tmp/${record.s3.object.key}`,
        `/tmp/${record.s3.object.key}.mp4`
      ],
      { stdio: "inherit" }
    );

第三次尝试:

我在 Stack Overflow问题中发现了这种方法,发帖人说它对他有用。

// convert to mp4!
spawnSync(
  "/opt/ffmpeg/ffmpeg",
  [
    '-i',
    `/tmp/${record.s3.object.key}`,
    '-codec:v',
    'libx264',
    '-profile:v',
    'main',
    '-preset',
    'slow',
    '-b:v',
    '400k',
    '-maxrate',
    '400k',
    '-bufsize',
    '800k',
    '-threads',
    '0',
    '-b:a',
    '128k',
    `/tmp/${record.s3.object.key}.mp4`
  ],
  { stdio: "inherit" }
);

这些作品中的每一个都在我的本地机器上膨胀。

如果我使用的 ffmpeg 二进制文件不是一个流行的二进制文件(我在多个与 Lambda 上的转码有关的网站上看到它),我的猜测是它是层的问题......也许。

任何见解将不胜感激。谢谢你。

4

2 回答 2

1

这是一个涉及我的 Lambda 配置的简单且在我的情况下被忽略的修复。

错误

默认情况下,Lambda 有 6 秒的超时时间,之后它们会停止处理。

看来我的转码函数运行时间过长,并且 Lambda 在文件完成转码之前就被终止了。

修复

我将 Lambda 函数的超时设置为最长 15 分钟。完成此操作后,该过程按预期工作,视频被转码并能够播放。

于 2020-03-05T01:36:40.297 回答
0

对于小型视频文件,15 分钟的 lambda 超时看起来是一个不错的解决方案。

我尝试压缩一个 93 MB 的文件,而 lambda 函数超时超过 15 分钟。

解决方案是将分配给 lambda 函数的内存大小从 128MB 增加到 2048MB。

于 2020-06-12T00:17:31.943 回答