问题
我想做的只是简单地使用@google-cloud/video-transcoder
(TranscoderServiceClient v1
(转换和压缩node.js中存储桶中的视频文件。单个输入文件和单个输出。输入文件可以具有音轨,也可以不具有音轨。当文件包含音轨时,一切都能正常工作,但如果没有,我会得到一个错误代码3:
atom atom0 does not have any inputs (input0) with an audio track
我目前唯一能想到的选择是:
- 使用
pubsub
来侦听作业错误,并再次运行失败的作业,但没有音频流(使其工作( - 在开始作业之前使用类似
ffprobe
的方法来确定文件中是否有音轨
但是,我宁愿不读两次文件:一次用于确定可用曲目,然后用于转码。而且我不想做两次这项工作。我在文档中没有发现任何关于如何只包含音频轨道(如果它存在((或者用空音频轨道替换它(如果它不存在((的信息。
当前配置:
config: {
elementaryStreams: [
{
key: 'video-stream0',
videoStream: {...},
},
{
key: 'audio-stream0',
audioStream: {...},
},
],
muxStreams: [
{
key: 'hd',
container: 'mp4',
elementaryStreams: ['video-stream0', 'audio-stream0'],
},
],
}
使用的文档:
- 设置-代码转换器API Node.js客户端参考(我的实现与googleapis git中的特别示例几乎相同(
- 配置-作业配置
- 呼叫选项-呼叫选项
更新
@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重试来执行重试操作,但需要处理异常