Update: After more digging I found an open GitHub issue where others appear to be encountering the same behavior.
I have a Google Cloud Function (2nd gen) in which I am trying to use ffprobe to get metadata from a video file stored in a Google Cloud Storage bucket. It is my understanding that I can generate a signed url and, by passing that directly to ffprobe, avoid loading the entire video file into memory. I generate a signed url and pass it to ffprobe, and then parse the output like so:
import ffmpeg from 'fluent-ffmpeg'
import ffprobeStatic from 'ffprobe-static'
async function getVideoData(srcFile: File) {
const [signedUrl] = await srcFile.getSignedUrl({
action: 'read',
expires: (new Date()).getMilliseconds() + 60_000,
})
const videoData: ffmpeg.FfprobeData = await new Promise((resolve, reject) => {
ffmpeg.setFfprobePath(ffprobeStatic.path)
ffmpeg.ffprobe(signedUrl, (err, data) => {
if (err) {
reject(err)
}
else {
resolve(data)
}
})
})
return videoData
}
This code works (with the same signed URL) locally on my macOS machine, but does not when deployed in a 2nd generation Google Cloud Function. In the latter case, data is undefined and err is {}.
My main question is how to properly use ffprobe in 2nd gen Google Cloud Functions. I have tried to research this but documentation on ffmpeg/ffprobe on GCP is sparse. I'm also trying to figure out exactly why the error object err is empty...it's not very helpful
Additional info:
- Environment: Google Cloud Functions 2nd Gen
- Runtime: Node 20
- "ffprobe-static": "3.1.0",
- "fluent-ffmpeg": "2.1.2"
Thanks in advance.