Node JS请求大量图片

时间:2019-01-05 21:07:34

标签: node.js ffmpeg request request-promise fluent-ffmpeg

我正在尝试在节点js上请求大量图像(n> 3000) 然后将它们保存到文件夹中。 我尝试使用请求库和请求承诺。 问题在于,如果图片数量太大,某些图片将无法完成下载,从而留下不完整的数据或出现错误(.jpeg文件为空)。有没有下载大量图片的更好方法? 我还需要图片全部下载时请求功能compile() 将它们制作成视频我为此使用ffmpeg。

以下是我尝试执行此操作的2种方法。

const req = require('request');
const request = require('request-promise');
const fs = require('fs');
const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
const ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegPath);

function downloadImgs(imgUrls) {
  let promises = [];
  let prom;
  for (let i = 0; i < imgUrls.length; i++) {
    imgPath = `assets/pics/st_${pad(i + 1, 3)}.jpg`

    prom = request(imgUrls[i]);
    prom.on('error', () => console.log('err'));
    prom.pipe(fs.createWriteStream(imgPath));
    promises.push(prom);
  }

  Promise.all(promises).then(() => {
    console.log('I Run');
    compilee();
  });

  //SECOND TRY-----------------------------------------
  for (let i = 0; i < imgUrls.lengh; i++) {
    imgUrl = imgUrls[i];
    req(imgUrl)
      .on('error', () => console.log("img error", imgUrl))
      .pipe(fs.createWriteStream(`assets/pics/st_${pad(i + 1, 3)}.jpg`)).on('close', () => {
        console.log('downloaded', x)
      })
  }
  compilee();

//---------------------------------------------------------

  function compilee() {
    command
      .on('end', onEnd)
      // .on('progress', onProgress)
      .on('error', onError)
      .input('assets/pics/st_%03d.jpg')
      .inputFPS(5)
      .output('assets/output/pepe.mp4')
      .outputFps(30)
      .run();
  }

我遇到的第一错误:UnhandledPromiseRejectionWarning:RequestError:错误:套接字挂起

:     错误:套接字挂断     在createHangUpError(_http_client.js:330:15)     在TLSSocket.socketOnEnd(_http_client.js:433:23)     在TLSSocket.emit(events.js:187:15)     在endReadableNT(_stream_visible.js:1098:12)     在process.internalTickCallback     (internal / process / next_tick.js:72:19)代码:“ ECONNRESET”}

此外,如果我想立即将视频发送到客户端,我应该在服务器上还是在客户端上下载图片。

1 个答案:

答案 0 :(得分:0)

我建议您使用异步库。 might可能是一个很好的解决方案

var q = async.queue(function({url,index}, callback) {
    // Do ur job here
}, 5);

// assign a callback
q.drain = function() {
    console.log('All images downloaded');
};

// add items to the queue
for (let i = 0; i < imgUrls.length; i++) {
    q.push({url : imgUrls[i], index : i});
}

Ofc并不是所有代码块都可以正常工作,而只是给您一个想法。希望对您有帮助