- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一个可以运行 ffmpeg
的 Cloudfunction在谷歌存储桶上传。我一直在玩基于 https://kpetrovi.ch/2017/11/02/transcoding-videos-with-ffmpeg-in-google-cloud-functions.html 的脚本
随着库的发展,原始脚本几乎不需要调整。我当前的版本在这里:
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const ffmpeg = require('fluent-ffmpeg');
const ffmpeg_static = require('ffmpeg-static');
console.log("Linking ffmpeg path to:", ffmpeg_static)
ffmpeg.setFfmpegPath(ffmpeg_static);
exports.transcodeVideo = (event, callback) => {
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;
}
// ensure that you only proceed if the file is newly createdxxs
if (event.metageneration !== '1') {
callback();
return;
}
// 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.');
callback();
})
.on('error', (err, stdout, stderr) => {
console.error('An error occured during encoding', err.message);
console.error('stdout:', stdout);
console.error('stderr:', stderr);
callback(err);
})
.pipe(remoteWriteStream, { end: true }); // end: true, emit end event when readable stream ends
};
2020-06-16 21:24:22.606 Function execution took 912 ms, finished with status: 'ok'
2020-06-16 21:24:52.902 Started ffmpeg with command: ffmpeg -i pipe:0 -c:v copy -c:a aac -b:a 160k -f mp4 -preset fast -movflags frag_keyframe+empty_moov pipe:1
最佳答案
来自 google cloud documentation该函数似乎应该接受三个参数:(data, context, callback)
你试过这个还是你知道context
是可选的吗?从文档看来,如果函数接受三个参数被视为后台函数,如果它只接受两个参数,则仅当它返回 Promise
时才被视为后台函数.
除此之外,还有一点:
1:这里没有 callback
函数被调用,如果在您的测试中您的函数以该日志行退出,则另一点表明将第二个参数作为回调函数调用是完成过程所需的步骤:
if (event.name.indexOf('uploads/') === -1) {
console.log("File " + event.name + " is not to be processed.")
return;
}
console.log
(或许多其他,如果您愿意)澄清流程:在您的问题中,您仅粘贴了 1 条日志行,说它是在系统日志行 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
});
关于javascript - 在 cloudfunction 中运行的 ffmpeg 静默失败/永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62417909/
我正在尝试通过云代码删除文件。但是这个脚本失败了: Parse.Cloud.define("deleteFile1", function(request, response) { Pars
自 0.2.0 版 cloud_functions 开始,Flutter 使用 .getHttpsCallable() 而不是 .call()。新方法定义为: /// @param functionN
我正在尝试向设备在 firebase 数据库中拥有的所有用户发送通知,但它在云函数的寄存器中显示:“ReferenceError:值未定义”。 应该做的是:每次在“通知”中进行更改时,您必须获取更改的
我需要一些帮助。 我的项目有 2 个集合,一个称为“产品”,另一个称为“用户”。 我将所选产品信息复制到用户的子集合中作为收藏夹,在本例中: 用户(集合)> 用户(文档)> 收藏夹(集合)> 产品(文
我需要一些帮助。 我的项目有 2 个集合,一个称为“产品”,另一个称为“用户”。 我将所选产品信息复制到用户的子集合中作为收藏夹,在本例中: 用户(集合)> 用户(文档)> 收藏夹(集合)> 产品(文
我正在使用云功能通过设备 token 发送通知。 const payload: admin.messaging.MessagingPayload = { notificatio
我有一个包含下一项的集合,其中一个属性是日期: id: xxxxxx name: xxxx date: August 21, 2018 at 1:00:00 AM UTC+8 (timestamp
我正在尝试实现一个可以运行 ffmpeg 的 Cloudfunction在谷歌存储桶上传。我一直在玩基于 https://kpetrovi.ch/2017/11/02/transcoding-vide
给定一些通用的 Python 代码,结构如下...... cloudbuild.yaml requirements.txt functions/ folder_a/ test/
我尝试调用云函数并传递一些数据。我的数据类型为 Map里面又嵌套了一些 Map .当试图用这个调用我的函数时: getHttpsCallable(function).call(data)... 我收到
我们有单独的 GCP 项目用于“构建”和“生产”环境。我想将 Cloud Build 用于“build”项目以在“prod”项目中部署 Cloud Function。跟随 documentation
我正在尝试从 Firebase 云功能访问我的存储 但我无法访问它 它给了我 类型错误:storage.ref 不是函数 这是我的代码 const functions = require('fireb
我在尝试使用以下方法部署谷歌云 HTTP 函数时刚开始遇到错误: gcloud functions deploy http_function --trigger-http 现在我收到这样的错误: ER
我有两个收藏。一个是 jobs,另一个是 users。 用户可以选择喜欢的类别名称。我存储在 User 集合中...在 job 中,我使用 categoryName 存储所有类别。 当向job 和这个
如何将 admin.firestore.FieldValue.serverTimestamp() 传递给 update() 方法? 我想将其插入到一个数组中,如下所示: import * as fun
我是一名优秀的程序员,十分优秀!