2016-02-25 4 views
0

Я пытаюсь включить субтитры (SRT) в Видеопоток па с Node JS и FFMpeg ... Я стараюсь это далеко:Субтитры в видео с NodeJS и FFMpeg Fluent Апи

var command = ffmpeg(file.createReadStream()) 
    .input("C:\\code.srt").videoCodec('copy') 
    .videoCodec('libvpx').audioCodec('libvorbis').format('webm') 
    .audioBitrate(128) 
    .videoBitrate(1024) 
    .inputFPS(75) 
    .outputOptions([ 
    '-deadline realtime', 
    '-error-resilient 1' 
    ]) 

И я получил это ошибка:

[Error: ffmpeg exited with code 1: Encoder (codec none) not found for output stream #0:2 

Попробуйте это тоже с --vf subititles = документации по FFMpeg и я получил эту ошибку:

var command = ffmpeg(file.createReadStream()) 
     .videoCodec('libvpx').audioCodec('libvorbis').format('webm') 
     .audioBitrate(128) 
     .videoBitrate(1024) 
     .inputFPS(75) 
     .outputOptions([ 
     '-deadline realtime', 
     '-vf subtitles=C:\\code.srt', 
     '-error-resilient 1' 
     ]) 

Error: ffmpeg exited with code 1: Error opening filters! 

Кто-то K дает возможность вставлять субтитры в vídeo с FFMpeg Fluent Api в Node.JS

Извините, мой английский, я бразилец! Спасибо так много

+0

"FFMpeg Свободный Апи" является пакет [узел-свободно-FFmpeg] (https://github.com/fluent-ffmpeg/node-fluent-ffmpeg). Следуйте документации [для обработки ошибок] (https://github.com/fluent-ffmpeg/node-fluent-ffmpeg#error-transcoding-error), чтобы получить сообщение 'stdout' для получения более подробной информации. –

ответ

1

Я решил эту проблему, разделив задачу на две части

  1. Добавить субтитры и сохранить видео локально кода:

    var addSubtitles = function(key, callback) { 
        console.log("inside addSubtitles"); 
        ffmpeg('./' + key + '.mp4') 
         .videoCodec('libx264') 
         .audioCodec('libmp3lame') 
         .outputOptions(
          '-vf subtitles=./jellies.srt' 
         ) 
         .on('error', function(err) { 
          callback(true, err) 
         }) 
         .save('./moviewithsubtitle.mp4') 
         .on('end', function() { 
          callback(false, "done"); 
         }) 
    } 
    
  2. Отправить видео с подзаголовком

    var streaming = function(req, res, newpath) { 
        var path = './' + newpath + '.mp4'; 
        var stat = fs.statSync(path); 
        var total = stat.size; 
        if (req.headers['range']) { 
         var range = req.headers.range; 
         var parts = range.replace(/bytes=/, "").split("-"); 
         var partialstart = parts[0]; 
         var partialend = parts[1]; 
    
         var start = parseInt(partialstart, 10); 
         var end = partialend ? parseInt(partialend, 10) : total - 1; 
         var chunksize = (end - start) + 1; 
         console.log('RANGE: ' + start + ' - ' + end + ' = ' + chunksize); 
    
         var file = fs.createReadStream(path, { 
          start: start, 
          end: end 
         }); 
         res.writeHead(206, { 
          'Content-Range': 'bytes ' + start + '-' + end + '/' + total, 
          'Accept-Ranges': 'bytes', 
          'Content-Length': chunksize, 
          'Content-Type': 'video/mp4' 
         }); 
         file.pipe(res); 
        } else { 
         console.log('ALL: ' + total); 
         res.writeHead(200, { 
          'Content-Length': total, 
          'Content-Type': 'video/mp4' 
         }); 
         fs.createReadStream(path).pipe(res); 
        } 
    } 
    

Так что теперь вся моя программа становится

var ffmpeg = require('fluent-ffmpeg'); 
    var fs = require('fs'); 
    var express = require('express'); 
    var app = express(); 
    var uuid = require('node-uuid'); 
    var port = 8000; 


    var addSubtitles = function(key, callback) { 
     console.log("inside addSubtitles"); 
     ffmpeg('./' + key + '.mp4') 
      .videoCodec('libx264') 
      .audioCodec('libmp3lame') 
      .outputOptions(
       '-vf subtitles=./jellies.srt' 
      ) 
      .on('error', function(err) { 
       callback(true, err) 
      }) 
      .save('./moviewithsubtitle.mp4') 
      .on('end', function() { 
       callback(false, "done"); 
      }) 
    } 

    var streaming = function(req, res, newpath) { 
     var path = './' + newpath + '.mp4'; 
     var stat = fs.statSync(path); 
     var total = stat.size; 
     if (req.headers['range']) { 
      var range = req.headers.range; 
      var parts = range.replace(/bytes=/, "").split("-"); 
      var partialstart = parts[0]; 
      var partialend = parts[1]; 

      var start = parseInt(partialstart, 10); 
      var end = partialend ? parseInt(partialend, 10) : total - 1; 
      var chunksize = (end - start) + 1; 
      console.log('RANGE: ' + start + ' - ' + end + ' = ' + chunksize); 

      var file = fs.createReadStream(path, { 
       start: start, 
       end: end 
      }); 
      res.writeHead(206, { 
       'Content-Range': 'bytes ' + start + '-' + end + '/' + total, 
       'Accept-Ranges': 'bytes', 
       'Content-Length': chunksize, 
       'Content-Type': 'video/mp4' 
      }); 
      file.pipe(res); 
     } else { 
      console.log('ALL: ' + total); 
      res.writeHead(200, { 
       'Content-Length': total, 
       'Content-Type': 'video/mp4' 
      }); 
      fs.createReadStream(path).pipe(res); 
     } 
    } 



    app.get('/subs', function(req, res) { 
     addSubtitles("movie", function(error, newpath) { 
      if (error) { 
       res.send("error : " + error) 
      } else { 
       console.log("done"); 
       res.end(); 
      } 
     }) 
    }) 


    app.get('/', function(req, res) { 
     streaming(req, res, "moviewithsubtitle"); 
    }) 

    app.listen(port); 
    console.log("the server is running at port :", port); 
Смежные вопросы