From a9fdb71402aff699deeae7e49f4ee4aceb1c7b66 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Sat, 10 Aug 2024 20:26:42 -0700 Subject: [PATCH] onvif: audio autoconfiguration --- plugins/onvif/src/onvif-configure.ts | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/plugins/onvif/src/onvif-configure.ts b/plugins/onvif/src/onvif-configure.ts index 8f1d1c996..3d507f181 100644 --- a/plugins/onvif/src/onvif-configure.ts +++ b/plugins/onvif/src/onvif-configure.ts @@ -16,12 +16,18 @@ const onvifToFfmpegVideoCodecMap = { }; const onvifToFfmpegAudioCodecMap = { - 'mp4a': 'aac', + 'MP4A-LATM': 'aac', 'aac': 'aac', 'PCMU': 'pcm_mulaw', 'PCMA': 'pcm_alaw', }; +const ffmpegToOnvifAudioCodecMap = { + 'aac': 'MP4A-LATM', + 'pcm_mulaw': 'PCMU', + 'pcm_alaw': 'PCMA', +}; + export function fromOnvifAudioCodec(codec: string) { codec = codec?.toLowerCase(); return onvifToFfmpegAudioCodecMap[codec] || codec; @@ -65,9 +71,13 @@ export async function configureCodecs(console: Console, client: OnvifCameraAPI, client.profiles = undefined; const profiles: any[] = await client.getProfiles(); const profile = profiles.find(profile => profile.$.token === options.id); + const vc = profile.videoEncoderConfiguration; const ac = profile.audioEncoderConfiguration; + const originalVideo = JSON.stringify(vc); + const originalAudio = JSON.stringify(ac); + const { video: videoOptions, audio: audioOptions } = options; if (videoOptions?.codec) { @@ -132,7 +142,17 @@ export async function configureCodecs(console: Console, client: OnvifCameraAPI, vc.rateControl.encodingInterval = 1; } - await client.setVideoEncoderConfiguration(vc); + if (audioOptions?.codec) + ac.encoding = toOnvifAudioCodec(audioOptions.codec); + if (audioOptions?.bitrate) + ac.bitrate = Math.floor(audioOptions?.bitrate / 1000); + if (audioOptions?.sampleRate) + ac.sampleRate = audioOptions.sampleRate / 1000; + + if (JSON.stringify(vc) !== originalVideo) + await client.setVideoEncoderConfiguration(vc); + if (JSON.stringify(ac) !== originalAudio) + await client.setAudioEncoderConfiguration(ac); const configuredVideo = await client.getVideoEncoderConfigurationOptions(profile.$.token, vc.$.token); client.profiles = undefined; const codecs = await getCodecs(console, client);