AWS弹性转码器——Gif输出巨大



所以我正在玩Elastic转码器,将S3存储桶中上传的视频转换为GIF。

目前,当我上传到S3时,我有一个基本的lambda,它触发了一个管道来转换为gif。

现在发生的事情是,我上传了一个7mb的mp4,当它被转码时,输出的gif是80MB以上??

我看了一遍医生,找不到任何对我有帮助的东西。有人能告诉我吗。。。

以下是我在弹性转码中的预设

Codec -- gif
Codec Options:
LoopCount: 5
Bit Rate -- auto
Frame Rate -- auto
Video Max Frame Rate -- 10
Max Width -- auto
Max Height -- auto
Sizing Policy -- ShrinkToFit
Padding Policy -- NoPad
Display Aspect Ratio -- auto

我的任何一个跛脚都是这样的:

'use strict';
var AWS = require('aws-sdk'),
transcoder = new AWS.ElasticTranscoder({
apiVersion: '2012-09-25',
region: 'eu-west-1'
});
exports.handler = (event, context, callback) => {
let fileName = event.Records[0].s3.object.key;
var srcKey =  decodeURIComponent(event.Records[0].s3.object.key.replace(/+/g, " "));
var newKey = fileName.split('.')[0];
console.log('New video has been uploaded:', fileName);
transcoder.createJob({
PipelineId: process.env.PIPELINE_ID,
Input: {
Key: srcKey,
FrameRate: 'auto',
Resolution: 'auto',
AspectRatio: 'auto',
Interlaced: 'auto',
Container: 'auto'
},
Output: {
Key: getOutputName(fileName),
ThumbnailPattern: '',
PresetId: 'XXXXXXXXXXX',
Rotate: 'auto'
}
}, function(err, data){
if(err){
console.log('Something went wrong:',err)
}else{
console.log('Converting is done');
}
callback(err, data);
});
};
function getOutputName(srcKey){
let baseName = srcKey.replace('videos/','');
let withOutExtension = removeExtension(baseName);
return 'gifs/' + withOutExtension + '.gif';
}
function removeExtension(srcKey){
let lastDotPosition = srcKey.lastIndexOf(".");
if (lastDotPosition === -1) return srcKey;
else return srcKey.substr(0, lastDotPosition);
}

这里绝对没有错误,GIF是BIG。

分辨率为1024x768、颜色空间为3个字节(红、绿、蓝各1个(、每秒24帧的10秒mp4包含540MB的数据。

视频压缩是惊人的,它真的可以把它压缩成小的东西,但GIF在做同样的事情时效率是出了名的低。此外,它们的质量非常糟糕。有关这方面的更多信息,请查看这个惊人的答案:https://superuser.com/questions/53600/jpeg-vs-png-vs-bmp-vs-gif-vs-svg

对于问题的解决方案:使用WebP

它得到了普遍支持,效率更高,看起来也更好。

此外,要小心AWS的托管成本,因为只有数据输入是免费的,数据输出可能会非常昂贵!

最新更新