capture bootstrap: forward every codec env var to captureManager.start
This commit is contained in:
parent
3b4af6ef11
commit
485af25d4a
1 changed files with 43 additions and 16 deletions
|
|
@ -10,24 +10,38 @@ const app = express();
|
||||||
const PORT = process.env.PORT || 3001;
|
const PORT = process.env.PORT || 3001;
|
||||||
const MAM_API_URL = process.env.MAM_API_URL || 'http://mam-api:3000';
|
const MAM_API_URL = process.env.MAM_API_URL || 'http://mam-api:3000';
|
||||||
|
|
||||||
// Middleware
|
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
|
|
||||||
// Health check
|
|
||||||
app.get('/health', (req, res) => {
|
app.get('/health', (req, res) => {
|
||||||
res.json({ status: 'ok' });
|
res.json({ status: 'ok' });
|
||||||
});
|
});
|
||||||
|
|
||||||
// Routes
|
|
||||||
app.use('/capture', captureRoutes);
|
app.use('/capture', captureRoutes);
|
||||||
|
|
||||||
// Start server
|
|
||||||
const server = app.listen(PORT, () => {
|
const server = app.listen(PORT, () => {
|
||||||
console.log(`Wild Dragon Capture Service listening on port ${PORT}`);
|
console.log(`Wild Dragon Capture Service listening on port ${PORT}`);
|
||||||
bootstrapAutoStart();
|
bootstrapAutoStart();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Mapped from the env vars routes/recorders.js writes into the container.
|
||||||
|
// Empty strings collapse to undefined so capture-manager's defaults win.
|
||||||
|
function envOpt(name) {
|
||||||
|
const v = process.env[name];
|
||||||
|
return v === undefined || v === '' ? undefined : v;
|
||||||
|
}
|
||||||
|
function envInt(name) {
|
||||||
|
const v = envOpt(name);
|
||||||
|
if (v === undefined) return undefined;
|
||||||
|
const n = parseInt(v, 10);
|
||||||
|
return Number.isFinite(n) ? n : undefined;
|
||||||
|
}
|
||||||
|
function envBool(name) {
|
||||||
|
const v = envOpt(name);
|
||||||
|
if (v === undefined) return undefined;
|
||||||
|
return v === 'true' || v === '1' || v === 'yes';
|
||||||
|
}
|
||||||
|
|
||||||
async function bootstrapAutoStart() {
|
async function bootstrapAutoStart() {
|
||||||
const recorderId = process.env.RECORDER_ID;
|
const recorderId = process.env.RECORDER_ID;
|
||||||
const sourceType = process.env.SOURCE_TYPE;
|
const sourceType = process.env.SOURCE_TYPE;
|
||||||
|
|
@ -44,29 +58,42 @@ async function bootstrapAutoStart() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const listen = process.env.LISTEN === '1' || process.env.LISTEN === 'true';
|
const listen = process.env.LISTEN === '1' || process.env.LISTEN === 'true';
|
||||||
const listenPort = process.env.LISTEN_PORT
|
const listenPort = envInt('LISTEN_PORT');
|
||||||
? parseInt(process.env.LISTEN_PORT, 10)
|
const streamKey = envOpt('STREAM_KEY');
|
||||||
: undefined;
|
const sourceUrl = envOpt('SOURCE_URL');
|
||||||
const streamKey = process.env.STREAM_KEY || undefined;
|
const device = envInt('DEVICE_INDEX');
|
||||||
const sourceUrl = process.env.SOURCE_URL || undefined;
|
|
||||||
|
|
||||||
if (sourceType === 'sdi') {
|
|
||||||
console.warn('[bootstrap] SDI auto-start not supported');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(`[bootstrap] starting ${sourceType} ingest (listen=${listen} port=${listenPort || 'n/a'})...`);
|
console.log(`[bootstrap] starting ${sourceType} ingest (listen=${listen} port=${listenPort || 'n/a'})...`);
|
||||||
try {
|
try {
|
||||||
const session = await captureManager.start({
|
const session = await captureManager.start({
|
||||||
assetId: process.env.ASSET_ID || null,
|
assetId: envOpt('ASSET_ID') || null,
|
||||||
projectId,
|
projectId,
|
||||||
binId: process.env.BIN_ID || null,
|
binId: envOpt('BIN_ID') || null,
|
||||||
clipName,
|
clipName,
|
||||||
|
device,
|
||||||
sourceType,
|
sourceType,
|
||||||
sourceUrl,
|
sourceUrl,
|
||||||
listen,
|
listen,
|
||||||
listenPort,
|
listenPort,
|
||||||
streamKey,
|
streamKey,
|
||||||
|
|
||||||
|
// Recording codec — recorders.js passes these straight through
|
||||||
|
videoCodec: envOpt('RECORDING_CODEC') || 'prores_hq',
|
||||||
|
videoBitrate: envOpt('RECORDING_VIDEO_BITRATE'),
|
||||||
|
framerate: envOpt('RECORDING_FRAMERATE'),
|
||||||
|
audioCodec: envOpt('RECORDING_AUDIO_CODEC') || 'pcm_s24le',
|
||||||
|
audioBitrate: envOpt('RECORDING_AUDIO_BITRATE'),
|
||||||
|
audioChannels: envInt('RECORDING_AUDIO_CHANNELS') ?? 2,
|
||||||
|
container: envOpt('RECORDING_CONTAINER') || 'mov',
|
||||||
|
|
||||||
|
proxyEnabled: envBool('PROXY_ENABLED') ?? true,
|
||||||
|
proxyVideoCodec: envOpt('PROXY_CODEC') || 'h264',
|
||||||
|
proxyVideoBitrate: envOpt('PROXY_VIDEO_BITRATE') || '8M',
|
||||||
|
proxyFramerate: envOpt('PROXY_FRAMERATE'),
|
||||||
|
proxyAudioCodec: envOpt('PROXY_AUDIO_CODEC') || 'aac',
|
||||||
|
proxyAudioBitrate: envOpt('PROXY_AUDIO_BITRATE') || '192k',
|
||||||
|
proxyAudioChannels: envInt('PROXY_AUDIO_CHANNELS') ?? 2,
|
||||||
|
proxyContainer: envOpt('PROXY_CONTAINER') || 'mp4',
|
||||||
});
|
});
|
||||||
console.log(`[bootstrap] session ${session.sessionId} started for clip ${clipName}`);
|
console.log(`[bootstrap] session ${session.sessionId} started for clip ${clipName}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue