2017-02-11 12:27:03 +00:00
|
|
|
const bluebird = require('bluebird');
|
|
|
|
const fs = require('fs');
|
|
|
|
const mime = require('mime-types');
|
|
|
|
const strongDataUri = require('strong-data-uri');
|
|
|
|
|
2019-01-28 01:25:31 +00:00
|
|
|
const { formatDuration, getOutPath, transferTimestampsWithOffset } = require('./util');
|
2017-08-14 12:25:27 +00:00
|
|
|
|
2017-02-11 12:27:03 +00:00
|
|
|
bluebird.promisifyAll(fs);
|
|
|
|
|
2017-08-14 12:37:57 +00:00
|
|
|
function getFrameFromVideo(video, format) {
|
2017-02-11 12:27:03 +00:00
|
|
|
const canvas = document.createElement('canvas');
|
|
|
|
canvas.width = video.videoWidth;
|
|
|
|
canvas.height = video.videoHeight;
|
|
|
|
|
|
|
|
canvas.getContext('2d').drawImage(video, 0, 0);
|
|
|
|
|
|
|
|
const dataUri = canvas.toDataURL(`image/${format}`);
|
|
|
|
|
|
|
|
return strongDataUri.decode(dataUri);
|
|
|
|
}
|
|
|
|
|
2017-09-14 17:15:03 +00:00
|
|
|
async function captureFrame(customOutDir, filePath, video, currentTime, captureFormat) {
|
2017-08-14 12:37:57 +00:00
|
|
|
const buf = getFrameFromVideo(video, captureFormat);
|
2017-08-14 12:25:27 +00:00
|
|
|
|
2017-02-11 12:27:03 +00:00
|
|
|
const ext = mime.extension(buf.mimetype);
|
2019-01-28 01:25:31 +00:00
|
|
|
const time = formatDuration(currentTime, true);
|
2017-08-14 12:25:27 +00:00
|
|
|
|
2019-01-28 01:25:31 +00:00
|
|
|
const outPath = getOutPath(customOutDir, filePath, `${time}.${ext}`);
|
2017-09-14 17:15:03 +00:00
|
|
|
await fs.writeFileAsync(outPath, buf);
|
2018-02-11 13:09:01 +00:00
|
|
|
const offset = -video.duration + currentTime;
|
2019-01-28 01:25:31 +00:00
|
|
|
return transferTimestampsWithOffset(filePath, outPath, offset);
|
2017-02-11 12:27:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = captureFrame;
|