javascript - 转换为 mp3 完成后如何解决此 promise ( Fluent-ffmpeg )

标签 javascript node.js promise

我有一个简单的nodejs脚本来下载youtube视频并转换为mp3。我在 promise 模式方面遇到一些问题,需要一些帮助。基本上,只有一个 resolve();,但脚本永远不会到达该部分。如果我将 resolve(); 移动到 console.log('完成下载!开始转换为 mp3');

它开始工作,所以问题与回调函数旁边的 resolve(); 有关。

完整代码:https://github.com/kenpeter/test_youtube_dl

代码片段:

// input
var input = [
  "https://www.youtube.com/watch?v=YWZ7KtRSoAo",
  "https://www.youtube.com/watch?v=0kdbu8RZNaY"
];

// lib
var youtubedl = require('youtube-dl');

// fs
var fs = require('fs');

// ffmpeg
var ffmpeg = require('fluent-ffmpeg');

// Promise
var Promise = require("bluebird");


// https://www.promisejs.org/
function youtubedl_get_info() {
  return new Promise(function (resolve, reject){
    youtubedl.getInfo(input, function(err, info) {
      if (err) {
        reject(err);
      }  
      else
      {
        //console.log(info);
        resolve(info); 
      }  
    });    
  });
}

youtubedl_get_info().then(function(infos) {

  // info is array
  // http://bluebirdjs.com/docs/api/promise.each.html
  Promise.each(infos, function(info) {

    // return new promise
    return new Promise(function(resolve, reject) {

      // output
      var video_output = info._filename.replace(/[&\/\\#,+()$~%'":*?<>{}\ ]/g, "_");

      var audio_title = info.title;
      audio_title = audio_title.replace(/[&\/\\#,+()$~%'":*?<>{}\ ]/g, "_");

      // dl zero
      var downloaded = 0;

      // fs file exist sync
      if (fs.existsSync(video_output)) {
        downloaded = fs.statSync(video_output).size;
      }


      var video = youtubedl(
        info.webpage_url,
        ['--format=18'],
        { start: downloaded, cwd: __dirname + "/video" }
      );

      video.on('info', function(info) {
        console.log('Download started');
        console.log('filename: ' + video_output);

        var total = info.size + downloaded;
        console.log('size: ' + total);

        if (downloaded > 0) {
          console.log('resuming from: ' + downloaded);
          console.log('remaining bytes: ' + info.size);
        }
      });

      video.pipe(fs.createWriteStream("./video/" + video_output, { flags: 'a' }));

      video.on('complete', function complete(info) {
        'use strict';
        console.log('filename: ' + video_output + ' already downloaded.');
      });


      video.on('end', function() {
        console.log('Finished downloading! start to convert to mp3');

        // It seems I cannot do more async here.
        // https://codedump.io/share/KVSJfXwwlRSI/1/nodejs--how-to-pipe---youtube-to-mp4-to-mp3
        var proc = new ffmpeg({source: "./video/" + video_output});

        proc.setFfmpegPath('/usr/bin/ffmpeg');
        proc.saveToFile("./audio/" + audio_title + ".mp3", function(stdout, stderr) {
          console.log("----- done -----");

          // Why I never come here??????????????????????????????????
          resolve();
        });

      });


    });

  });

});

最佳答案

发生这种情况是因为 .saveToFile 不接受回调。 尝试像这样运行它:

proc.setFfmpegPath('./ffmpeg');
proc.output("./audio/" + audio_title + ".mp3");
proc.on('error', function (err) {
	console.log(err);
});
proc.on('end', function () {
	resolve();
});
proc.run();

这里是the docs关于这个话题。

顺便说一句,这首歌很好听:)

关于javascript - 转换为 mp3 完成后如何解决此 promise ( Fluent-ffmpeg ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382561/

相关文章:

node.js - 使用 supertest、mocha 和模型进行环回测试

node.js - Alexa 在数据返回之前做出响应

javascript - Promise.all 不等待所有 Promise 完成 firestore 数据读取

javascript - 背景图像的淡入淡出过渡在所有文本中产生奇怪的白色效果

javascript - 如何将数据提取到 JavaScript 中的对象中?

node.js - NPM package.json 文件的主要用途是什么?

javascript - 在 promise 链中使用$ resource(修复延迟的反模式)

javascript - 在数组上推送相同的函数时调用异步函数

javascript - 添加带有属性的新选择选项

javascript - 获取 i18next 未定义