.ogv
层将.mp4
文件转换为ffmpeg
。我跟随a tutorial from the people at Serverless Framework将.mp4
转换为GIF
,效果很好。使用相同的ffmpeg static build,(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
据我所知,moov原子应该包含有关.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 question中发现了这种方法,并且发帖者说这对他有用。
// 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配置。
The Bug
默认情况下,Lambda具有6秒钟的超时时间,之后它们将停止处理。
似乎我的转码功能运行时间过长,并且Lambda在文件可以完成转码之前被终止。
修复
我将Lambda函数的超时设置为最大15分钟。完成此操作后,过程将按预期工作,并且视频已转码并可以播放。