我正在寻求帮助,以将存储在 S3 存储桶中的多个视频自动转换为 GIF。具体来说,我的目标是生成长度恰好为 10 秒的 GIF,每个 GIF 都包含从原始视频的不同部分采样的随机帧。随机性应涵盖每个视频的开头、中间和结尾的帧,确保输出多样化且引人入胜的 GIF。
目前,我正在使用 Nodejs 和 AWS Lambda 实现此功能,并利用 ffmpeg 进行视频处理。然而,我在有效地实现预期结果方面面临着挑战。
如果有人对如何在 AWS Lambda 环境中有效完成此任务有经验或见解,特别是在 Nodejs 代码和 ffmpeg 使用方面,我将非常感谢您的指导和专业知识。
使用 AWS Lambda、Node.js 和 ffmpeg 将视频转换为具有随机帧的 GIF 涉及多个步骤。您需要设置 Lambda 函数,使用 ffmpeg 进行视频处理,然后上传生成的 GIF Amazon S3。
const fs = require('fs');
const { execSync } = require('child_process');
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
accessKeyId: 'YOUR_ACCESS_KEY_ID',
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY',
});
exports.handler = async (event) => {
const videoKey = event.videoKey;
const outputKey = event.outputKey; bucket
const videoFile = `/tmp/${videoKey}`;
const videoParams = {
Bucket: 'YOUR_BUCKET_NAME',
Key: videoKey,
};
const videoData = await s3.getObject(videoParams).promise();
fs.writeFileSync(videoFile, videoData.Body);
const gifFile = `/tmp/${outputKey}`;
const randomFrameIndexes = generateRandomFrameIndexes(); // Implement this function
const ffmpegCommand = `ffmpeg -i ${videoFile} -vf "select='eq(n\\,${randomFrameIndexes.join(',')})',scale=320:-1" -vsync vfr ${gifFile}`;
execSync(ffmpegCommand);
const gifData = fs.readFileSync(gifFile);
const uploadParams = {
Bucket: 'YOUR_BUCKET_NAME',
Key: outputKey,
Body: gifData,
};
await s3.upload(uploadParams).promise();
return { statusCode: 200, body: 'GIF conversion successful' };
};