camstreamerlib
Version:
Helper library for CamStreamer ACAP applications.
95 lines (94 loc) • 3.15 kB
JavaScript
import { z } from 'zod';
import { bitrateVapixParamsSchema, booleanSchema, h264ProfileSchema } from '../common';
const scheduleSchema = 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(),
});
export const streamTriggerSchema = z.discriminatedUnion('type', [
z.object({
type: z.literal('manual'),
ioPort: z.string().nullable(),
}),
z.object({ type: z.literal('onetime'), startTime: z.number(), stopTime: z.number() }),
z.object({
type: z.literal('recurrent'),
schedule: z.array(scheduleSchema),
}),
]);
export const streamInputTypeSchema = z.union([z.literal('CSw'), z.literal('CRS'), z.literal('RTSP_URL')]);
export const streamingProtocolTypeSchema = z.union([z.literal('RTMP'), z.literal('RTMPS'), z.literal('HLS_PUSH')]);
export const videoCodecSchema = z.union([z.literal('h264'), z.literal('h265'), z.literal('av1')]);
export const overlaysSchema = z.union([
z.literal('all'),
z.literal('text'),
z.literal('image'),
z.literal('application'),
z.literal(''),
z.literal('off'),
]);
export const streamDelaySchema = z.object({
value: z.number().int(),
unit: z.union([z.literal('seconds'), z.literal('minutes'), z.literal('hours')]),
});
export const internalVapixParametersSchema = bitrateVapixParamsSchema.extend({
camera: z.string(),
resolution: z.string(),
fps: z.number().int(),
compression: z.number().int(),
govLength: z.number().int(),
videoCodec: videoCodecSchema,
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(''),
z.literal('off'),
])
.optional(),
});
export const streamVideoSchema = z.object({
inputType: streamInputTypeSchema,
sourceUrl: z.string().optional(),
internalVapixParameters: z.string(),
userVapixParameters: z.string(),
streamingProtocol: streamingProtocolTypeSchema,
streamDelay: streamDelaySchema.optional(),
});
export const streamAudioSchema = z.discriminatedUnion('source', [
z.object({
source: z.literal('none'),
}),
z.object({ source: z.literal('microphone'), audioChannelNbr: z.union([z.literal(1), z.literal(2)]) }),
z.object({
source: z.literal('file'),
fileName: z.string(),
filePath: z.string(),
}),
z.object({
source: z.literal('url'),
fileName: z.string(),
fileUrl: z.string(),
avSyncMsec: z.number().int().nonnegative(),
}),
]);
export const streamCommonSchema = z.object({
id: z.number(),
enabled: z.boolean(),
active: z.boolean(),
title: z.string(),
trigger: streamTriggerSchema,
video: streamVideoSchema,
audio: streamAudioSchema,
});