UNPKG

camstreamerlib

Version:

Helper library for CamStreamer ACAP applications.

95 lines (94 loc) 3.15 kB
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, });