Javascript 使用NodeJS和FFMpeg-Fluent-Api的视频字幕

Javascript 使用NodeJS和FFMpeg-Fluent-Api的视频字幕,javascript,node.js,ffmpeg,Javascript,Node.js,Ffmpeg,我尝试在na vídeo流中使用节点JS和FFMpeg包含字幕(srt)。。。我想尝试一下: var command = ffmpeg(file.createReadStream()) .input("C:\\code.srt").videoCodec('copy') .videoCodec('libvpx').audioCodec('libvorbis').format('webm') .audioBitrate(128) .videoBitrate(1024)

我尝试在na vídeo流中使用节点JS和FFMpeg包含字幕(srt)。。。我想尝试一下:

 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
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!
使用FFMpeg文档的--vf subititles=也尝试一下,我发现了以下错误:

[Error: ffmpeg exited with code 1: Encoder (codec none) not found for output stream #0:2
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!
有人知道在Node.JS中使用FFMpeg Fluent Api在vídeo中嵌入字幕的方法


对不起,我的英语,我是巴西人!非常感谢

我通过将任务分为两部分来解决这个问题

  • 添加字幕并在本地保存视频 代码:

  • 发送带字幕的视频

    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);
    

    我通过将任务分为两部分来解决这个问题

  • 添加字幕并在本地保存视频 代码:

  • 发送带字幕的视频

    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);
    
    “FFMpeg Fluent Api”是软件包。按照文档获取
    stdout
    消息以了解更多详细信息。“FFMpeg-Fluent-Api”是软件包。有关详细信息,请按照文档获取
    stdout
    消息。