【发布时间】:2022-11-29 02:16:07
【问题描述】:
我正在尝试实现 FFmpeg 视频流功能,例如 Instagram 倒计时功能。在这段代码中,首先,我从 s3 存储桶中获取记录(URL),然后根据需要拆分它们,然后创建命令并使用属于 childe_process 的 exec() 执行它。在此,我试图将 out 存储在 lambda 函数中的某个特定文件夹中,但它从未存储过。我认为 lambda 确实允许在本地写入文件,所以我尝试使用 exec() 回调的 stdout 参数在 s3 存储桶上直接上传。伙计们,请帮助做到这一点。我有一个问题 lambda 是否允许在其本地文件夹中写入内容?或者如果不允许那么做那件事的方法是什么?我只是分享我的代码,请指导我。
// dependencies
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
var { exec } = require('child_process');
var path = require('path')
var AWS_ACCESS_KEY = 'AKIAUIBLAC2U4XQGXPVC';
var AWS_SECRET_ACCESS_KEY = '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';
var fs = require('fs')
s3 = new AWS.S3({
accessKeyId: AWS_ACCESS_KEY,
secretAccessKey: AWS_SECRET_ACCESS_KEY
});
exports.handler = async function (event, context) {
var bucket_name = "sycu-game";
var bucketName = "sycu-test";
//CREATE OVERLAY AND BG_VALUE PATH TO GET VALUE FROM S3
const bgValue = (event.Records[0].bg_value).split('/');
const overlayImage = (event.Records[0].overlay_image_url).split('/');
var s3_bg_value = bgValue[3] + "/" + bgValue[4];
var s3_overlay_image = overlayImage[4] + "/" + overlayImage[5] + "/" + overlayImage[6];
const signedUrlExpireSeconds = 60 * 5;
//RETREIVE BG_VALUE FROM S3 AND CREATE URL FOR FFMPEG INPUT VALUE
var bg_value_url = s3.getSignedUrl('getObject', {
Bucket: bucket_name,
Key: s3_bg_value,
Expires: signedUrlExpireSeconds
});
bg_value_url = bg_value_url.split("?");
bg_value_url = bg_value_url[0];
//RETREIVE OVERLAY IMAGE FROM S3 AND CREATE URL FOR FFMPEG INPUT VALUE
var overlay_image_url = s3.getSignedUrl('getObject', {
Bucket: bucket_name,
Key: s3_overlay_image,
Expires: signedUrlExpireSeconds
});
overlay_image_url = overlay_image_url.split("?");
overlay_image_url = overlay_image_url[0];
//MANUAL ASSIGN VARIABLE FOR FFMPEG COMMAND
var command,
ExtraTimerSec = event.Records[0].timer_seconds + 5,
TimerSec = event.Records[0].timer_seconds + 1,
BackgroundWidth = 1080,
BackgroundHeight = 1920,
videoPath = (__dirname + '/tmp/' + event.Records[0].name);
console.log("path", videoPath)
//TEMP DIRECTORY
var videoPath = '/media/volume-d/generatedCountdownS3/tmp/' + event.Records[0].name
var tmpFile = fs.createWriteStream(videoPath)
//FFMPEG COMMAND
if (event.Records[0].bg_type == 2) {
if (event.Records[0].is_rotate) {
command = ' -stream_loop -1 -t ' + ExtraTimerSec + ' -i ' + bg_value_url + ' -i ' + overlay_image_url + ' -filter_complex "color=color=0x000000@0.0:s= ' + event.Records[0].resized_box_width + 'x' + event.Records[0].resized_box_height + ',drawtext=fontcolor=' + event.Records[0].time_text_color + ':fontsize=' + event.Records[0].time_text_size + ':x=' + event.Records[0].minute_x + ':y=' + event.Records[0].minute_y + ':text=\'%{eif\\:trunc(mod(((' + TimerSec + '-if(between(t, 0, 1),1,if(gte(t,' + TimerSec + '),' + TimerSec + ',t)))/60),60))\\:d\\:2}\',drawtext=fontcolor=' + event.Records[0].time_text_color + ':fontsize=' + event.Records[0].time_text_size + ':x=' + event.Records[0].second_x + ':y=' + event.Records[0].second_y + ':text=\'%{eif\\:trunc(mod(' + TimerSec + '-if(between(t, 0, 1),1,if(gte(t,' + TimerSec + '),' + TimerSec + ',t))\,60))\\:d\\:2}\'[txt]; [txt] rotate=' + event.Records[0].box_angle + '*PI/180:fillcolor=#00000000 [rotated];[0] scale=w=' + BackgroundWidth + ':h=' + BackgroundHeight + '[t];[1] scale=w=' + BackgroundWidth + ':h=' + BackgroundHeight + '[ot];[t][ot] overlay = :x=0 :y=0 [m1];[m1][rotated]overlay = :x=' + event.Records[0].flat_box_coordinate_x + ' :y=' + event.Records[0].flat_box_coordinate_x + ' [m2]" -map "[m2]" -pix_fmt yuv420p -t ' +
ExtraTimerSec + ' -r 24 -c:a copy ' + videoPath + "";
}
else {
command = ' -stream_loop -1 -t ' + ExtraTimerSec + ' -i ' + bg_value_url + ' -i ' + overlay_image_url + ' -filter_complex "color=color=0x000000@0.0:s= ' + event.Records[0].resized_box_width + 'x' + event.Records[0].resized_box_height + ',drawtext=fontcolor=' + event.Records[0].time_text_color + ':fontsize=' + event.Records[0].time_text_size + ':x=' + event.Records[0].minute_x + ':y=' + event.Records[0].minute_y + ':text=\'%{eif\\:trunc(mod(((' + TimerSec + '-if(between(t, 0, 1),1,if(gte(t,' + TimerSec + '),' + TimerSec + ',t)))/60),60))\\:d\\:2}\',drawtext=fontcolor=' + event.Records[0].time_text_color + ':fontsize=' + event.Records[0].time_text_size + ':x=' + event.Records[0].second_x + ':y=' + event.Records[0].second_y + ':text=\'%{eif\\:trunc(mod(' + TimerSec + '-if(between(t, 0, 1),1,if(gte(t,' + TimerSec + '),' + TimerSec + ',t))\,60))\\:d\\:2}\'[txt]; [txt] rotate=' + event.Records[0].box_angle + '*PI/180:fillcolor=#00000000 [rotated];[0] scale=w=' + BackgroundWidth + ':h=' + BackgroundHeight + '[t];[1] scale=w=' + BackgroundWidth + ':h=' + BackgroundHeight + '[ot];[t][ot] overlay = :x=0 :y=0 [m1];[m1][rotated]overlay = :x=' + event.Records[0].flat_box_coordinate_x + ' :y=' + event.Records[0].flat_box_coordinate_x + ' [m2]" -map "[m2]" -pix_fmt yuv420p -t ' +
ExtraTimerSec + ' -r 24 -c:a copy ' + videoPath + "";
}
}
var final_command = '/usr/bin/ffmpeg' + command;
//COMMAND EXECUTE HERE
await exec(final_command, function (err, stdout, stderr) {
console.log("data is here")
console.log('err:', err);
console.log('stdout:', stdout);
console.log('stderr:', stderr);
const params = {
Bucket: bucketName,
Key: "countdown/output.mp4",
Body: stdout,
}
s3.upload(params).promise().then(data => {
console.log("data is here -->", data)
});
});
var tmpFile = fs.createReadStream(videoPath)
console.log('temp file data:', tmpFile.toString())
};
【问题讨论】:
标签: linux ubuntu command-line bash ffmpeg