Eri*_*oob 8 node.js google-cloud-transcoder
问题
我想做的只是使用@google-cloud/video-transcoder (TranscoderServiceClient v1)从node.js 的存储桶中转换和压缩视频文件。单个输入文件和单个输出。输入文件可能有也可能没有音轨。当文件包含音轨时,一切都会按预期工作,但如果不包含音轨,我会收到代码 3 的错误:
\atom atom0 does not have any inputs (input0) with an audio track
Run Code Online (Sandbox Code Playgroud)
目前我能想到的唯一选择是:
pubsub侦听作业错误并再次运行失败的作业,但没有音频流(使其正常工作)。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)
使用的文档:
更新
@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)
我将发布此内容以回顾一下我对您的案例的发现。并根据评论交流提出行动建议。
配置提示:
在您的配置中,您正在引用“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)
重试提示:
Node.js上描述的这种实现的客户端。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()
Run Code Online (Sandbox Code Playgroud)
** 05/09 更新:我用最新的更新刷新了我的答案。
重试有用的链接:
总结:
| 归档时间: |
|
| 查看次数: |
950 次 |
| 最近记录: |