Запись видео слайд-шоу в формате MP4 на S3 с использованием Lambda FFmpeg Layer - PullRequest
0 голосов
/ 16 апреля 2020

Я использую 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);

};
...