Video 尝试在Lambda上使用FFMpeg层对视频进行转码 我正在尝试使用AWS Lambda上的ffmpeg层将.ogv文件转换为.mp4。

Video 尝试在Lambda上使用FFMpeg层对视频进行转码 我正在尝试使用AWS Lambda上的ffmpeg层将.ogv文件转换为.mp4。,video,ffmpeg,aws-lambda,transcoding,aws-lambda-layers,Video,Ffmpeg,Aws Lambda,Transcoding,Aws Lambda Layers,我随后将.mp4转换为GIF,效果非常好。使用相同的(ffmpeg-git-amd64-static.tar.xz),我开始将.ogv文件转换为.mp4文件 到目前为止,我已经成功地将视频上传到S3存储桶中,让Lambda检索该视频,使用ffmpeg二进制文件对视频进行处理,并将新文件复制到S3 问题是: 创建的视频将不会播放 数据点1:函数生成的文件太小 输入视频文件为1.3MB,输出视频仅为256.0KB 数据点2:未找到moov原子 将结果视频从S3复制到本地机器后,我尝试使用ffpla

我随后将
.mp4
转换为
GIF
,效果非常好。使用相同的(ffmpeg-git-amd64-static.tar.xz),我开始将
.ogv
文件转换为
.mp4
文件

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


问题是: 创建的视频将不会播放

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

输入视频文件为1.3MB,输出视频仅为256.0KB

数据点2:未找到moov原子

将结果视频从S3复制到本地机器后,我尝试使用
ffplay
播放,但收到以下错误:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd613093400] moov atom not found
frank.mp4: Invalid data found when processing input
据我所知,moovatom应该包含关于
.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" }
    );
第三次尝试:

 // convert to mp4!
    spawnSync(
      "/opt/ffmpeg/ffmpeg",
      [
        "-i",
        `/tmp/${record.s3.object.key}`,
        `/tmp/${record.s3.object.key}.mp4`
      ],
      { stdio: "inherit" }
    );
我在堆栈溢出中发现了这种方法,海报上说它对他有效

// 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上的转码相关),我猜这是一个层的问题。。。也许吧


如有任何见解,将不胜感激。谢谢。

这是一个涉及Lambda配置的简单且被忽略的修复

错误

默认情况下,lambda有一个6秒的超时,在此之后它们停止处理

似乎我的转码函数运行得太长,并且Lambda在文件完成转码之前被终止

修复程序


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

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

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


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

IIRC ffmpeg有时使用文件扩展名来了解要转换为/从哪个文件格式。有没有可能输入文件中缺少文件扩展名,导致ffmpeg错误识别文件类型?嗯,我不这么认为。S3中的输入文件具有正确的扩展名,
.ogv
。就您的观点而言,我认为上面尝试2的第6行应该是
/tmp/${record.s3.object.key}.ogv
,但如果我的理解是正确的,这将导致类似“file_name.ogv.ogv”的结果。