Невозможно объединить видео с Express с помощью ffmpeg: невозможно использовать оператор «in» для поиска «читаемого» в неопределенном

#node.js #express #fluent-ffmpeg

#node.js #экспресс #свободно-ffmpeg

Вопрос:

Цель состоит в том, чтобы сохранить видеофайлы в api / videos / result, а затем объединить все видео в этой папке в одно видео.

Модуль npm fluent-ffmpeg выдает ошибку:

 TypeError: Cannot use 'in' operator to search for 'readable' in undefined
    at FfmpegCommand.proto.mergeAdd.proto.addInput.proto.input (C:UsersvmadminDesktopM152-Frontendnode_modulesfluent-ffmpegliboptionsinputs.js:33:24)
    at C:UsersvmadminDesktopM152-Frontendserver.js:36:35
    at Array.forEach (<anonymous>)
    at C:UsersvmadminDesktopM152-Frontendserver.js:30:12
    at Layer.handle [as handle_request] (C:UsersvmadminDesktopM152-Frontendnode_modulesexpresslibrouterlayer.js:95:5)
    at next (C:UsersvmadminDesktopM152-Frontendnode_modulesexpresslibrouterroute.js:137:13)
    at Array.<anonymous> (C:UsersvmadminDesktopM152-Frontendnode_modulesmulterlibmake-middleware.js:53:37)
    at listener (C:UsersvmadminDesktopM152-Frontendnode_moduleson-finishedindex.js:169:15)
    at onFinish (C:UsersvmadminDesktopM152-Frontendnode_moduleson-finishedindex.js:100:5)
    at callback (C:UsersvmadminDesktopM152-Frontendnode_modulesee-firstindex.js:55:10)
  

Я не уверен, что делать с этой ошибкой. У меня нет ни ‘in’, ни ‘readable’ где-либо в моем коде, поэтому мне не нужно было пробовать что-то конкретное.

 var mergedVideo = ffmpeg();
var upload = multer({storage: storage});
var single = upload.single('MyVideo');
var fs = require('fs');

});
// POST Request. Video is being uploaded here
app.post('/api/videos', single, function (req, res) {
    // Declares variable, that saves an array from all elements in result folder
    var source = fs.readdirSync('./api/videos/result/');
    // Loop, which iterates through each element in result folder
    source.forEach(function (element) {
        // Merge 'api', 'videos' and 'result' to one path
        var pathJoin = path.join('api', 'videos', 'result');
        // Save complete path with file in one variable
        var finalPath = console.log(__dirname   '\'   pathJoin   '\'   element);
        // Adds each file into the input for merging
        mergedVideo = mergedVideo.addInput(finalPath);
    });
    // Merge files and save them as merged.mp4
    mergedVideo.mergeToFile('./api/videos/merged.mp4', '/api/videos/tempDir/')
        .on('error', function (err) {
        console.log('Error '   err.message);
    })
        .on('end', function () {
        console.log('Finished!');
    });
    res.send(console.log('Hallo!'));
});
  

Ожидался файл с именем merged.mp4 в папке api / videos.

Ответ №1:

Я обнаружил ошибку в коде. Проблема здесь в том, что

var finalPath = console.log(__dirname '\' pathJoin '\' element);

возвращает пустоту. (Потому что это просто вывод на консоль). На самом деле это должно быть

var finalPath = __dirname '\' pathJoin '\' element;

Ответ №2:

Попробуйте сделать это, как указано ниже

 var fs = require('fs');
var source = fs.readdirSync('./api/videos/result/');
  

Я надеюсь, что это поможет вам в этом вопросе.

Комментарии:

1. На самом деле, fs уже требовался, но я забыл его ввести. Исправлено сейчас. Кроме того, я тем временем нашел решение.