将流从 Fluent-ffmpeg 传递到 Google 云存储
Passing streams from Fluent-ffmpeg to Google Cloud Storage
有没有办法将流从 Fluent-mmpeg 传递到 Google 云存储?我正在尝试允许用户上传任何类型的媒体(音频或视频),我想在将其上传到 GCS 之前将其转换为 flac。
我在路由中使用了一些中间件,例如:
routes.post(
'/upload',
multer.single('audio'),
ConvertController.convert,
UploadController.upload,
FileController.save,
(req, res, next) => res.send('ok')
);
我能够在 ConvertController 上使用此代码从 Multer 流式传输到 Fluent-mmpeg 并保存到文件中:
async convert(req, res, next) {
ffmpeg(streamifier.createReadStream(req.file.buffer))
.format('flac')
.output('outputfile.flac')
.audioChannels(1)
.on('progress', function(progress) {
console.log(progress);
})
.run();
}
但我想使用 .pipe() 将其传递给 UploadController,然后我会在那里上传到 GCS:
class UploadController {
async upload(req, res, next) {
const gcsHelpers = require('../helpers/google-cloud-storage');
const { storage } = gcsHelpers;
const DEFAULT_BUCKET_NAME = 'my-bucket-name';
const bucketName = DEFAULT_BUCKET_NAME;
const bucket = storage.bucket(bucketName);
const fileName = `test.flac`;
const newFile = bucket.file(fileName);
newFile.createWriteStream({
metadata: {
contentType: file.mimetype
}
})
file.on('error', err => {
throw err;
});
file.on('finish', () => console.log('finished'));
}
问题是我找不到任何地方解释如何将流传递到下一个中间件。
可能吗?
将您的 ffmpeg 流附加到 req
对象,然后您可以使用 next()
将您的 ffmpeg 流传递到下一个中间件。然后您可以将流通过管道传输到您的 GCS 文件。
像这样:
// ConvertController
req.ffpmegStream = ffmpeg(streamifier.createReadStream(req.file.buffer))
.on('finish', next)
// UploadController
req.ffmpegStream.pipe(newFile.createWriteStream())
参考:
- Passing variables to the next middleware using next() in Express.js
- File#createWriteStream
有没有办法将流从 Fluent-mmpeg 传递到 Google 云存储?我正在尝试允许用户上传任何类型的媒体(音频或视频),我想在将其上传到 GCS 之前将其转换为 flac。
我在路由中使用了一些中间件,例如:
routes.post(
'/upload',
multer.single('audio'),
ConvertController.convert,
UploadController.upload,
FileController.save,
(req, res, next) => res.send('ok')
);
我能够在 ConvertController 上使用此代码从 Multer 流式传输到 Fluent-mmpeg 并保存到文件中:
async convert(req, res, next) {
ffmpeg(streamifier.createReadStream(req.file.buffer))
.format('flac')
.output('outputfile.flac')
.audioChannels(1)
.on('progress', function(progress) {
console.log(progress);
})
.run();
}
但我想使用 .pipe() 将其传递给 UploadController,然后我会在那里上传到 GCS:
class UploadController {
async upload(req, res, next) {
const gcsHelpers = require('../helpers/google-cloud-storage');
const { storage } = gcsHelpers;
const DEFAULT_BUCKET_NAME = 'my-bucket-name';
const bucketName = DEFAULT_BUCKET_NAME;
const bucket = storage.bucket(bucketName);
const fileName = `test.flac`;
const newFile = bucket.file(fileName);
newFile.createWriteStream({
metadata: {
contentType: file.mimetype
}
})
file.on('error', err => {
throw err;
});
file.on('finish', () => console.log('finished'));
}
问题是我找不到任何地方解释如何将流传递到下一个中间件。
可能吗?
将您的 ffmpeg 流附加到 req
对象,然后您可以使用 next()
将您的 ffmpeg 流传递到下一个中间件。然后您可以将流通过管道传输到您的 GCS 文件。
像这样:
// ConvertController
req.ffpmegStream = ffmpeg(streamifier.createReadStream(req.file.buffer))
.on('finish', next)
// UploadController
req.ffmpegStream.pipe(newFile.createWriteStream())
参考:
- Passing variables to the next middleware using next() in Express.js
- File#createWriteStream