如何使音频轨道为谷歌代码转换器API可选



问题

我想做的只是简单地使用@google-cloud/video-transcoder(TranscoderServiceClient v1(转换和压缩node.js中存储桶中的视频文件。单个输入文件和单个输出。输入文件可以具有音轨,也可以不具有音轨。当文件包含音轨时,一切都能正常工作,但如果没有,我会得到一个错误代码3:

atom atom0 does not have any inputs (input0) with an audio track

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

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

但是,我宁愿不读两次文件:一次用于确定可用曲目,然后用于转码。而且我不想做两次这项工作。我在文档中没有发现任何关于如何只包含音频轨道(如果它存在((或者用空音频轨道替换它(如果它不存在((的信息。

当前配置

config: {
elementaryStreams: [
{
key: 'video-stream0',
videoStream: {...},
},
{
key: 'audio-stream0',
audioStream: {...},
},
],
muxStreams: [
{
key: 'hd',
container: 'mp4',
elementaryStreams: ['video-stream0', 'audio-stream0'],
},
],
}

使用的文档

  1. 设置-代码转换器API Node.js客户端参考(我的实现与googleapis git中的特别示例几乎相同(
  2. 配置-作业配置
  3. 呼叫选项-呼叫选项

更新

@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);

我将发布这篇文章来回顾我对您的案例的发现。并根据意见交流提出行动建议。

配置提示:

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

在您的配置中,您正在参考"视频流1">

muxStreams: [
{
key: 'hd',
container: 'mp4',
elementaryStreams: ['video-stream1', 'audio-stream0'],
},
],

elementaryStreams 中不存在的

elementaryStreams: [
{
key: 'video-stream0',
videoStream: {...},
},
{
key: 'audio-stream0',
audioStream: {...},
},
],

重试提示:

  • Node.js客户端我还没有看到代码转换服务客户端上描述的这种实现
  • 对于Python客户端,有一个选项可以在创建作业时设置重试操作,您可以使用该作业在客户端上传递重试[google.api.retry]

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()

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

重试有用的链接:

  • Google Api Core重试
  • 配置重试
  • 例外情况列表

总结:

  • 您可以使用客户端重试并通过google重试来执行重试操作,但需要处理异常

最新更新