如何使音轨成为 Google Transcoder API 的可选选项

Eri*_*oob 8 node.js google-cloud-transcoder

问题

我想做的只是使用@google-cloud/video-transcoderTranscoderServiceClient v1)从node.js 的存储桶中转换和压缩视频文件。单个输入文件和单个输出。输入文件可能有也可能没有音轨。当文件包含音轨时,一切都会按预期工作,但如果不包含音轨,我会收到代码 3 的错误:

\atom atom0 does not have any inputs (input0) with an audio track
Run Code Online (Sandbox Code Playgroud)

目前我能想到的唯一选择是:

  1. 用于pubsub侦听作业错误并再次运行失败的作业,但没有音频流(使其正常工作)。
  2. 在开始作业之前使用类似的方法ffprobe来确定文件中是否有音轨。

但是,我不希望读取该文件两次:一次用于确定可用轨道,然后进行转码。我不想将这项工作运行两次。我在文档中没有找到有关如何仅包含音轨(如果存在)的内容(或者如果音轨不存在则将其替换为空音轨)。

当前配置

config: {
    elementaryStreams: [
        {
            key: 'video-stream0',
            videoStream: {...},
        },
        {
            key: 'audio-stream0',
            audioStream: {...},
        },
    ],
    muxStreams: [
        {
            key: 'hd',
            container: 'mp4',
            elementaryStreams: ['video-stream0', 'audio-stream0'],
        },
    ],
}
Run Code Online (Sandbox Code Playgroud)

使用的文档

  1. 设置 - Transcoder API Node.js 客户端参考(我的实现与 googleapis git 中的临时示例几乎相同)
  2. 配置-JobConfig
  3. 看涨期权 - CallOptions

更新

@Betjens 建议在CallOptions没有 的情况下重试该作业pubsub,但我无法让它在 node.js 中工作。无论有没有 backOffSettings,作业都不会重试。pubsub 重试的官方示例是另一个使用 CallOptions 的 API 的示例,但它似乎不适用于我的情况。

const callOptions = {
    retry: {
        retryCodes: [3],  // 'INVALID_ARGUMENT', error code if audio missing
        backoffSettings: {...}
    },
    retryRequestOptions: {
        request: requestWithoutAudio // request without audio streams to retry
    }
}

// Run request
const [response] = await transcoderServiceClient.createJob(request, callOptions);
Run Code Online (Sandbox Code Playgroud)

Bet*_*ens 2

我将发布此内容以回顾一下我对您的案例的发现。并根据评论交流提出行动建议。

配置提示:

  • 确保您的配置elementaryStreams键与muxStreamselementaryStreams匹配,否则您可能会遇到转码器服务问题。

在您的配置中,您正在引用“video-stream1”

muxStreams: [
        {
            key: 'hd',
            container: 'mp4',
            elementaryStreams: ['video-stream1', 'audio-stream0'],
        },
    ],
Run Code Online (Sandbox Code Playgroud)

您的elementaryStreams中不存在这些

elementaryStreams: [
        {
            key: 'video-stream0',
            videoStream: {...},
        },
        {
            key: 'audio-stream0',
            audioStream: {...},
        },
    ],
Run Code Online (Sandbox Code Playgroud)

重试提示:

Python 示例(来自Google API 重试

@retry.Retry(predicate=if_exception_type(exceptions.NotFound))
def check_if_exists():
    return client.does_thing_exist()

is_available = check_if_exists()
Run Code Online (Sandbox Code Playgroud)

** 05/09 更新:我用最新的更新刷新了我的答案。

重试有用的链接:

总结:

  • 您可以使用客户端重试并传递一个google重试来执行您要处理的异常的重试操作。