camstreamerlib
Version:
Helper library for CamStreamer ACAP applications.
121 lines (120 loc) • 4.01 kB
JavaScript
import { z } from 'zod';
import { bitrateVapixParamsSchema, booleanSchema, h264ProfileSchema } from '../common';
export const streamCommonSchema = z.object({
streamId: z.string(),
enabled: z.boolean(),
active: z.boolean(),
title: z.string(),
trigger: z.discriminatedUnion('type', [
z.object({
type: z.literal('manual'),
port: z.number().optional(),
}),
z.object({
type: z.literal('onetime'),
startTime: z.number(),
stopTime: z.number(),
everActivated: z.boolean(),
prepareAheadS: z.number().int().optional(),
}),
z.object({
type: z.literal('recurrent'),
schedule: z.array(z.object({
start: z.object({
day: z.number().int().min(0).max(6),
timeS: z.number().int().min(0).max(86400),
}),
stop: z.object({
day: z.number().int().min(0).max(6),
timeS: z.number().int().min(0).max(86400),
}),
isActive: z.boolean(),
})),
prepareAheadS: z.number().int().optional(),
}),
]),
video: z.object({
output: z.discriminatedUnion('type', [
z.object({
type: z.literal('video'),
url: z.string().nullable(),
parameters: z.string(),
saveToSdCard: z
.object({
ruleId: z.string(),
configurationId: z.string(),
})
.optional(),
}),
z.object({
type: z.literal('images'),
url: z.string().nullable(),
imageIntervalS: z.number(),
}),
z.object({
type: z.literal('none'),
saveToSdCard: z.object({
ruleId: z.string(),
configurationId: z.string(),
}),
}),
]),
input: z.discriminatedUnion('type', [
z.object({
type: z.literal('RTSP_URL'),
url: z.string(),
internalVapixParameters: z.string(),
}),
z.object({
type: z.literal('CSw'),
}),
z.object({
type: z.literal('CRS'),
internalVapixParameters: z.string(),
userVapixParameters: z.string(),
}),
]),
delayS: z.number().int().nonnegative().optional(),
}),
audio: z.discriminatedUnion('source', [
z.object({
source: z.literal('none'),
}),
z.object({
source: z.literal('microphone'),
audioChannelNbr: z.number().int(),
forceStereo: z.boolean(),
}),
z.object({
source: z.literal('file'),
name: z.string(),
path: z.string(),
forceStereo: z.boolean(),
}),
z.object({
source: z.literal('url'),
name: z.string(),
url: z.string(),
avSyncMsec: z.number().int().nonnegative(),
forceStereo: z.boolean(),
}),
]),
status: z.object({
led: z.boolean(),
port: z.number().optional(),
}),
});
export const internalVapixParametersSchema = bitrateVapixParamsSchema.extend({
camera: z.string(),
resolution: z.string(),
fps: z.number().int(),
compression: z.number().int(),
govLength: z.number().int(),
videoCodec: z.union([z.literal('h264'), z.literal('h265'), z.literal('av1')]),
h264Profile: h264ProfileSchema.optional(),
audio: booleanSchema,
nbrOfChannels: z.union([z.literal(1), z.literal(2)]).optional(),
overlays: z
.union([z.literal('all'), z.literal('text'), z.literal('image'), z.literal('application'), z.literal('off')])
.optional(),
});