Я использую AWS Lambda со слоем FFmpeg, чтобы попытаться создать 15-секундный файл MP4 (beach.mp4) - из 3-х изображений c, которые отображаются в течение 3, 5 и 7 секунд подряд. Эти 3 изображения находятся в моем zam-файле развертывания Lambda для загрузки на S3 вместе с файлом sequence.txt, необходимым для функции.
SEQUENCE.TXT
файл beach1.jpg outpoint 3 file beach2.jpg файл outpoint 8 beach3.jpg outpoint 15
FFMPEG COMMAND
ffmpeg -f concat -i sequence.txt -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest beach.mp4
Я записываю файл в S3, но он пустой, всего 15 байт. Поэтому не содержит файл MP4, созданный FFmpeg. Я думаю, что это как-то связано с syn c или потоковой передачей видеофайла, так что можно читать как текст, так и MP4, но не уверен.
Как я могу прочитать. Содержимое txt, а затем запишите команду ffmpeg в файл в / tmp /?
. Вы можете скачать или просмотреть файлы по адресу https://lifeisabeach.netlify.app/ (По какой-то странной причине длина MP4 при локальном построении). 19 секунд, когда должно быть 15!)
const util = require('util');
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const { readFileSync, writeFileSync, unlinkSync, writeFile, readdir } = require('fs');
//const fs = require('fs');
const path = require('path');
const { spawnSync } = require('child_process');
exports.handler = async (event, context, callback) => {
const outputBucket = 'mys3bucket';
const sequenceTXT = "sequence.txt";
// FFmpeg creates the file, using the contents of sequence.txt to create timed image slides
const mp4create = await spawnSync(
'/opt/bin/ffmpeg',
[
'-f',
'concat',
'-i',
sequenceTXT,
'-c:v',
'libx264',
'-tune',
'stillimage',
'-c:a',
'aac',
'-b:a',
'192k',
'-pix_fmt',
'yuv420p',
'-shortest',
'beach.mp4'
]
);
// Write ffmpeg output to a file in /tmp/
const writeMP4File = util.promisify(writeFile);
await writeMP4File('/tmp/beach.mp4', mp4create, 'binary');
console.log('MP4 content written to /tmp/');
// Copy MP4 data to a variable to enable write to S3 Bucket
let result = mp4create;
console.log('MP4 Result contents ', result);
const vidFile = readFileSync('/tmp/beach.mp4');
// Set S3 bucket details and put MP4 file into S3 bucket from /tmp/
const s3 = new AWS.S3();
const params = {
Bucket: outputBucket,
Key: 'beach.mp4',
ACL: 'private',
Body: vidFile
};
// Put MP4 file from AWS Lambda function /tmp/ to an S3 bucket
const s3Response = await s3.putObject(params).promise();
callback(null, s3Response);
};