Из документации Google Cloud кажется, что функция должна принимать три аргумента: (data, context, callback)
пробовали ли вы это или знаете, что context
является необязательным? Из документации кажется, что, если функция принимает три аргумента, рассматривается как фоновая функция, если она принимает только два аргумента, рассматривается как фоновая функция, только если она возвращает Promise
.
Больше, чем это другой момент:
1: здесь не вызывается функция callback
, если в ваших тестах ваша функция завершилась с этой строкой журнала, это еще один момент, предполагающий, что вызов второго аргумента в качестве функции обратного вызова является обязательным шаг для завершения процесса sh:
if (event.name.indexOf('uploads/') === -1) {
console.log("File " + event.name + " is not to be processed.")
return;
}
Я бы посоветовал добавить еще console.log
(или многие другие, если хотите), чтобы прояснить поток: в свой вопрос вы вставили только 1 строку журнала, это не так уж и полезно, чтобы сказать это регистрируется после строки системного журнала
ссылке, которую вы использовали в качестве учебного пособия, почти три года, возможно, облако Google тем временем изменило свой интерфейс.
Однажды было сказано, что если acceptint три аргумента, а не только два, не решает вашу проблему, вы можете попробовать изменить свою функцию в Promise
:
exports.transcodeVideo = (event, callback) => new Promise((resolve, reject) => {
const bucket = storage.bucket(event.bucket);
console.log(event);
if (event.name.indexOf('uploads/') === -1) {
console.log("File " + event.name + " is not to be processed.")
return resolve(); // or reject if this is an error case
}
// ensure that you only proceed if the file is newly createdxxs
if (event.metageneration !== '1') {
return resolve(); // or reject if this is an error case
}
// Open write stream to new bucket, modify the filename as needed.
const targetName = event.name.replace("uploads/", "").replace(/[.][a-z0-9]+$/, "");
console.log("Target name will be: " + targetName);
const remoteWriteStream = bucket.file("processed/" + targetName + ".mp4")
.createWriteStream({
metadata: {
//metadata: event.metadata, // You may not need this, my uploads have associated metadata
contentType: 'video/mp4', // This could be whatever else you are transcoding to
},
});
// Open read stream to our uploaded file
const remoteReadStream = bucket.file(event.name).createReadStream();
// Transcode
ffmpeg()
.input(remoteReadStream)
.outputOptions('-c:v copy') // Change these options to whatever suits your needs
.outputOptions('-c:a aac')
.outputOptions('-b:a 160k')
.outputOptions('-f mp4')
.outputOptions('-preset fast')
.outputOptions('-movflags frag_keyframe+empty_moov')
// https://github.com/fluent-ffmpeg/node-fluent-ffmpeg/issues/346#issuecomment-67299526
.on('start', (cmdLine) => {
console.log('Started ffmpeg with command:', cmdLine);
})
.on('end', () => {
console.log('Successfully re-encoded video.');
resolve();
})
.on('error', (err, stdout, stderr) => {
console.error('An error occured during encoding', err.message);
console.error('stdout:', stdout);
console.error('stderr:', stderr);
reject(err);
})
.pipe(remoteWriteStream, { end: true }); // end: true, emit end event when readable stream ends
});
Надеюсь на это помогает.