Empty error object produced by ffprobe in Google Cloud Function

174 Views Asked by At

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.

0

There are 0 best solutions below