2017-10-10 11 views
6

J'utilise la bibliothèque fluent-ffmpeg avec node.js pour transcoder des vidéos à l'origine dans un format de film flash au format mp3 avec plusieurs résolutions, 1080p, etc. Une fois le transcodage terminé, Je voudrais déplacer la vidéo transcodée vers un s3 s3.Télécharger la sortie FFmpeg directement sur Amazon S3

Je tire le fichier .flv d'origine d'un compartiment source s3 et passe le flux à la fonction constructeur ffmpeg. Le problème se situe après la fin du transcodage, comment puis-je obtenir le flux des données mp4 à envoyer à s3.

Voici le code que j'ai jusqu'à présent:

 var params = { 
      Bucket: process.env.SOURCE_BUCKET, 
      Key: fileName 
     }; 
     s3.getObject(params, function(err, data) { 
      if (err) console.log(err, err.stack); // an error occurred 

      var format = ffmpeg(data) 
      .size('854x480') 
      .videoCodec('libx264') 
      .format('flv') 
      .toFormat('mp4'); 
      .on('end', function() { 
       //Ideally, I would like to do the uploading here 

       var params = { 
        Body: //{This is my confusion, how do I get the stream to add here?}, 
        Bucket: process.env.TRANSCODED_BUCKET, 
        Key: fileName 
       }; 
       s3.putObject(params, function (err, data) { 

       }); 
      }) 
      .on('error', function (err) { 
       console.log('an error happened: ' + err.message); 
      }); 

     }); 

Pour le code ci-dessus, où puis-je obtenir le flux transcodé pour ajouter à la propriété « Body » de l'objet params?

Mise à jour:

Voici une révision de ce que je suis en train de faire:

var outputStream: MemoryStream = new MemoryStream(); 

     var proc = ffmpeg(currentStream) 
      .size('1920x1080') 
      .videoCodec('libx264') 
      .format('avi') 
      .toFormat('mp4') 
      .output(outputStream) 
      // setup event handlers 
      .on('end', function() { 
       uploadFile(outputStream, "").then(function(){ 
        resolve(); 
       }) 
      }) 
      .on('error', function (err) { 
       console.log('an error happened: ' + err.message); 
      }); 

Je voudrais éviter de copier le fichier sur le système de fichiers local à partir s3, plutôt je préférerais traiter le fichier en mémoire et le télécharger sur s3 lorsque vous avez terminé. Est-ce que fluent-ffmpeg permettrait ce scénario?

Répondre

2

Vous ne semblez enregistrer la sortie du transcodage nulle part.

  1. Enregistrer la sortie du transcodage (votre nouveau fichier .flv) à l'aide output à votre système de fichiers local.
  2. Fournissez le contenu de votre nouveau fichier à putObject. Selon the putObject documentation, le paramètre Body accepte:

    Body - (Buffer, Typed Array, Blob, String, ReadableStream) Les données de l'objet.

Voici quelques exemples de code révisé:

// Generate a filename for the `.flv` version 
var flvFileName = fileName.substring(0, fileName.length - path.extname(fileName).length) + '.flv'; 

// Perform transcoding, save new video to new file name 
var format = ffmpeg(data) 
    .size('854x480') 
    .videoCodec('libx264') 
    .format('flv') 
    .toFormat('mp4'); 
    .output(flvFileName) 
    .on('end', function() { 
     // Provide `ReadableStream` of new video as `Body` for `pubObject` 
     var params = { 
      Body: fs.createReadStream(flvFileName) 
      Bucket: process.env.TRANSCODED_BUCKET, 
      Key: flvFileName 
     }; 

     s3.putObject(params, function (err, data) { 

     }); 
    }) 

Note: Vous pouvez être en mesure de créer un flux de sortie de fluent-ffmpeg et télécharger ce flux à AWS S3, si vous préférez, mais cela compliquer la logique et le traitement des erreurs.

+0

Existe-t-il un moyen d'écrire temporairement dans un tampon mémoire, puis d'envoyer le tampon dans le paramètre Body? – user1790300

+0

Y at-il un moyen d'éviter d'avoir à écrire temporairement le fichier sur le système de fichiers? – user1790300