-
Notifications
You must be signed in to change notification settings - Fork 254
Description
Describe the bug
Hi there. Love the library. Have used it in a few projects.
I've got a HikVision DS-7732NI-I4 (Firmware V4.60.005 build 230307), which from what I can tell should be fairly ONVIF compliant.
I'm not seeing issues on Firmware V4.40.017 build 210721, so it looks like their implementation has changed in the new firmware. There is the possibility this could be the streams configured on this NVR though.
I'm seeing an error Unrecognized configuration when getting RTSP URIs. I believe this is caused by
Line 795 in e03355c
| if (profile.videoSourceConfiguration.sourceToken === videoSrcToken || profile.videoSourceConfiguration.sourceToken === profile.videoSourceConfiguration.name) { |
I have many streams on this NVR, and they all follow the same pattern, where XXX is the stream number.
- Profiles
token=ProfileTokenXXX - VideoSourceConfiguration
token=VideoSourceConfigurationTokenXXX - VideoSourceConfiguration
SourceToken=VideoSourceTokenXXX
Before the if condition, I have added:
console.log('profile.videoSourceConfiguration.sourceToken=', profile.videoSourceConfiguration.sourceToken, 'videoSrcToken=', videoSrcToken, 'profile.videoSourceConfiguration.name=', profile.videoSourceConfiguration.name);And get:
profile.videoSourceConfiguration.sourceToken= VideoSourceToken006 videoSrcToken= VideoSourceToken001 profile.videoSourceConfiguration.name= VideoSourceConfigurationName006
profile.videoSourceConfiguration.sourceToken= VideoSourceToken006 videoSrcToken= VideoSourceToken001 profile.videoSourceConfiguration.name= VideoSourceConfigurationName006
I have 4 NVRs in total with 2 firmwares. I can't say for certain it's not related to the streams or stream order, but:
- NVR1 - Firmware V4.40.017 build 210721 - OK
- NVR2 - Firmware V4.40.017 build 210721 - OK
- NVR3 - Firmware V4.60.005 build 230307 - Crash
- NVR4 - Firmware V4.60.005 build 230307 - Crash
I've replicated on another NVR with the same firmware version. The same issue occurs.
I'm not as familiar with the ONVIF standard here - Is HikVision's implementation perhaps just non-compliant and shouldn't be supported?
If I remove the filter, I'm able to get RTSP URIs (which all work).
From the NVR UI, I can't see any specific settings around ONVIF, other than an "Enable ONVIF" checkbox.
To Reproduce
await cam.connect();
const profiles = await cam.getProfiles();Debug SOAP-messages for request and response
Request
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<Security s:mustUnderstand="1"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<UsernameToken>
<Username>xxxxx</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">xxxxxxxxxxxxxxxxx</Password>
<Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">xxxxxxxxxxxxxxxxx</Nonce>
<Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2025-09-15T05:46:32.496Z</Created>
</UsernameToken>
</Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetVideoSources xmlns="http://www.onvif.org/ver10/media/wsdl"/>
</s:Body>
</s:Envelope>Response
Limited to first 7 profiles. There were 63.
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:trt="http://www.onvif.org/ver10/media/wsdl"
xmlns:tt="http://www.onvif.org/ver10/schema">
<soap:Body>
<trt:GetProfilesResponse>
<trt:Profiles token="ProfileToken001" fixed="true">
<tt:Name>ProfileName001</tt:Name>
<tt:VideoSourceConfiguration token="VideoSourceConfigurationToken001">
<tt:Name>VideoSourceConfigurationName001</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>VideoSourceToken001</tt:SourceToken>
<tt:Bounds x="0" y="0" width="1280" height="720"/>
</tt:VideoSourceConfiguration>
<tt:AudioSourceConfiguration token="AudioSourceConfigurationToken001">
<tt:Name>AudioSourceConfigurationName001</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>AudioSourceToken001</tt:SourceToken>
</tt:AudioSourceConfiguration>
<tt:AudioEncoderConfiguration token="AudioEncoderConfigurationToken001">
<tt:Name>AudioEncoderConfigurationName001</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:Encoding>G711</tt:Encoding>
<tt:Bitrate>64</tt:Bitrate>
<tt:SampleRate>8</tt:SampleRate>
<tt:Multicast>
<tt:Address>
<tt:Type>IPv4</tt:Type>
<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
</tt:Address>
<tt:Port>8862</tt:Port>
<tt:TTL>128</tt:TTL>
<tt:AutoStart>false</tt:AutoStart>
</tt:Multicast>
<tt:SessionTimeout>PT30S</tt:SessionTimeout>
</tt:AudioEncoderConfiguration>
<tt:Extension>
<tt:AudioOutputConfiguration token="AudioOutputConfigurationToken">
<tt:Name>AudioOutputConfigurationName</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:OutputToken>AudioOutputToken</tt:OutputToken>
<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Server</tt:SendPrimacy>
<tt:OutputLevel>10</tt:OutputLevel>
</tt:AudioOutputConfiguration>
<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
<tt:Name>AudioDecoderConfig</tt:Name>
<tt:UseCount>2</tt:UseCount>
</tt:AudioDecoderConfiguration>
</tt:Extension>
</trt:Profiles>
<trt:Profiles token="ProfileToken002" fixed="true">
<tt:Name>ProfileName002</tt:Name>
<tt:VideoSourceConfiguration token="VideoSourceConfigurationToken002">
<tt:Name>VideoSourceConfigurationName002</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>VideoSourceToken002</tt:SourceToken>
<tt:Bounds x="0" y="0" width="1280" height="720"/>
</tt:VideoSourceConfiguration>
<tt:AudioSourceConfiguration token="AudioSourceConfigurationToken002">
<tt:Name>AudioSourceConfigurationName002</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>AudioSourceToken002</tt:SourceToken>
</tt:AudioSourceConfiguration>
<tt:AudioEncoderConfiguration token="AudioEncoderConfigurationToken002">
<tt:Name>AudioEncoderConfigurationName002</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:Encoding>G711</tt:Encoding>
<tt:Bitrate>64</tt:Bitrate>
<tt:SampleRate>8</tt:SampleRate>
<tt:Multicast>
<tt:Address>
<tt:Type>IPv4</tt:Type>
<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
</tt:Address>
<tt:Port>8862</tt:Port>
<tt:TTL>128</tt:TTL>
<tt:AutoStart>false</tt:AutoStart>
</tt:Multicast>
<tt:SessionTimeout>PT30S</tt:SessionTimeout>
</tt:AudioEncoderConfiguration>
<tt:Extension>
<tt:AudioOutputConfiguration token="AudioOutputConfigurationToken">
<tt:Name>AudioOutputConfigurationName</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:OutputToken>AudioOutputToken</tt:OutputToken>
<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Server</tt:SendPrimacy>
<tt:OutputLevel>10</tt:OutputLevel>
</tt:AudioOutputConfiguration>
<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
<tt:Name>AudioDecoderConfig</tt:Name>
<tt:UseCount>2</tt:UseCount>
</tt:AudioDecoderConfiguration>
</tt:Extension>
</trt:Profiles>
<trt:Profiles token="ProfileToken003" fixed="true">
<tt:Name>ProfileName003</tt:Name>
<tt:VideoSourceConfiguration token="VideoSourceConfigurationToken003">
<tt:Name>VideoSourceConfigurationName003</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>VideoSourceToken003</tt:SourceToken>
<tt:Bounds x="0" y="0" width="1280" height="720"/>
</tt:VideoSourceConfiguration>
<tt:AudioSourceConfiguration token="AudioSourceConfigurationToken003">
<tt:Name>AudioSourceConfigurationName003</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>AudioSourceToken003</tt:SourceToken>
</tt:AudioSourceConfiguration>
<tt:AudioEncoderConfiguration token="AudioEncoderConfigurationToken003">
<tt:Name>AudioEncoderConfigurationName003</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:Encoding>G711</tt:Encoding>
<tt:Bitrate>64</tt:Bitrate>
<tt:SampleRate>8</tt:SampleRate>
<tt:Multicast>
<tt:Address>
<tt:Type>IPv4</tt:Type>
<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
</tt:Address>
<tt:Port>8862</tt:Port>
<tt:TTL>128</tt:TTL>
<tt:AutoStart>false</tt:AutoStart>
</tt:Multicast>
<tt:SessionTimeout>PT30S</tt:SessionTimeout>
</tt:AudioEncoderConfiguration>
<tt:Extension>
<tt:AudioOutputConfiguration token="AudioOutputConfigurationToken">
<tt:Name>AudioOutputConfigurationName</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:OutputToken>AudioOutputToken</tt:OutputToken>
<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Server</tt:SendPrimacy>
<tt:OutputLevel>10</tt:OutputLevel>
</tt:AudioOutputConfiguration>
<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
<tt:Name>AudioDecoderConfig</tt:Name>
<tt:UseCount>2</tt:UseCount>
</tt:AudioDecoderConfiguration>
</tt:Extension>
</trt:Profiles>
<trt:Profiles token="ProfileToken004" fixed="true">
<tt:Name>ProfileName004</tt:Name>
<tt:VideoSourceConfiguration token="VideoSourceConfigurationToken004">
<tt:Name>VideoSourceConfigurationName004</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>VideoSourceToken004</tt:SourceToken>
<tt:Bounds x="0" y="0" width="1280" height="720"/>
</tt:VideoSourceConfiguration>
<tt:AudioSourceConfiguration token="AudioSourceConfigurationToken004">
<tt:Name>AudioSourceConfigurationName004</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>AudioSourceToken004</tt:SourceToken>
</tt:AudioSourceConfiguration>
<tt:AudioEncoderConfiguration token="AudioEncoderConfigurationToken004">
<tt:Name>AudioEncoderConfigurationName004</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:Encoding>G711</tt:Encoding>
<tt:Bitrate>64</tt:Bitrate>
<tt:SampleRate>8</tt:SampleRate>
<tt:Multicast>
<tt:Address>
<tt:Type>IPv4</tt:Type>
<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
</tt:Address>
<tt:Port>8862</tt:Port>
<tt:TTL>128</tt:TTL>
<tt:AutoStart>false</tt:AutoStart>
</tt:Multicast>
<tt:SessionTimeout>PT30S</tt:SessionTimeout>
</tt:AudioEncoderConfiguration>
<tt:Extension>
<tt:AudioOutputConfiguration token="AudioOutputConfigurationToken">
<tt:Name>AudioOutputConfigurationName</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:OutputToken>AudioOutputToken</tt:OutputToken>
<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Server</tt:SendPrimacy>
<tt:OutputLevel>10</tt:OutputLevel>
</tt:AudioOutputConfiguration>
<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
<tt:Name>AudioDecoderConfig</tt:Name>
<tt:UseCount>2</tt:UseCount>
</tt:AudioDecoderConfiguration>
</tt:Extension>
</trt:Profiles>
<trt:Profiles token="ProfileToken005" fixed="true">
<tt:Name>ProfileName005</tt:Name>
<tt:VideoSourceConfiguration token="VideoSourceConfigurationToken005">
<tt:Name>VideoSourceConfigurationName005</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>VideoSourceToken005</tt:SourceToken>
<tt:Bounds x="0" y="0" width="1280" height="720"/>
</tt:VideoSourceConfiguration>
<tt:AudioSourceConfiguration token="AudioSourceConfigurationToken005">
<tt:Name>AudioSourceConfigurationName005</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>AudioSourceToken005</tt:SourceToken>
</tt:AudioSourceConfiguration>
<tt:AudioEncoderConfiguration token="AudioEncoderConfigurationToken005">
<tt:Name>AudioEncoderConfigurationName005</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:Encoding>G711</tt:Encoding>
<tt:Bitrate>64</tt:Bitrate>
<tt:SampleRate>8</tt:SampleRate>
<tt:Multicast>
<tt:Address>
<tt:Type>IPv4</tt:Type>
<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
</tt:Address>
<tt:Port>8862</tt:Port>
<tt:TTL>128</tt:TTL>
<tt:AutoStart>false</tt:AutoStart>
</tt:Multicast>
<tt:SessionTimeout>PT30S</tt:SessionTimeout>
</tt:AudioEncoderConfiguration>
<tt:Extension>
<tt:AudioOutputConfiguration token="AudioOutputConfigurationToken">
<tt:Name>AudioOutputConfigurationName</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:OutputToken>AudioOutputToken</tt:OutputToken>
<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Server</tt:SendPrimacy>
<tt:OutputLevel>10</tt:OutputLevel>
</tt:AudioOutputConfiguration>
<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
<tt:Name>AudioDecoderConfig</tt:Name>
<tt:UseCount>2</tt:UseCount>
</tt:AudioDecoderConfiguration>
</tt:Extension>
</trt:Profiles>
<trt:Profiles token="ProfileToken006" fixed="true">
<tt:Name>ProfileName006</tt:Name>
<tt:VideoSourceConfiguration token="VideoSourceConfigurationToken006">
<tt:Name>VideoSourceConfigurationName006</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>VideoSourceToken006</tt:SourceToken>
<tt:Bounds x="0" y="0" width="640" height="480"/>
</tt:VideoSourceConfiguration>
<tt:AudioSourceConfiguration token="AudioSourceConfigurationToken006">
<tt:Name>AudioSourceConfigurationName006</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>AudioSourceToken006</tt:SourceToken>
</tt:AudioSourceConfiguration>
<tt:VideoEncoderConfiguration token="VideoEncoderConfigurationToken006">
<tt:Name>VideoEncoderConfigurationName006</tt:Name>
<tt:UseCount>1</tt:UseCount>
<tt:Encoding>H264</tt:Encoding>
<tt:Resolution>
<tt:Width>1280</tt:Width>
<tt:Height>960</tt:Height>
</tt:Resolution>
<tt:Quality>5</tt:Quality>
<tt:RateControl>
<tt:FrameRateLimit>12</tt:FrameRateLimit>
<tt:EncodingInterval>1</tt:EncodingInterval>
<tt:BitrateLimit>2048</tt:BitrateLimit>
</tt:RateControl>
<tt:H264>
<tt:GovLength>25</tt:GovLength>
<tt:H264Profile>Baseline</tt:H264Profile>
</tt:H264>
<tt:Multicast>
<tt:Address>
<tt:Type>IPv4</tt:Type>
<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
</tt:Address>
<tt:Port>0</tt:Port>
<tt:TTL>0</tt:TTL>
<tt:AutoStart>false</tt:AutoStart>
</tt:Multicast>
<tt:SessionTimeout>PT30S</tt:SessionTimeout>
</tt:VideoEncoderConfiguration>
<tt:AudioEncoderConfiguration token="AudioEncoderConfigurationToken006">
<tt:Name>AudioEncoderConfigurationName006</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:Encoding>G711</tt:Encoding>
<tt:Bitrate>64</tt:Bitrate>
<tt:SampleRate>8</tt:SampleRate>
<tt:Multicast>
<tt:Address>
<tt:Type>IPv4</tt:Type>
<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
</tt:Address>
<tt:Port>8862</tt:Port>
<tt:TTL>128</tt:TTL>
<tt:AutoStart>false</tt:AutoStart>
</tt:Multicast>
<tt:SessionTimeout>PT30S</tt:SessionTimeout>
</tt:AudioEncoderConfiguration>
<tt:Extension>
<tt:AudioOutputConfiguration token="AudioOutputConfigurationToken">
<tt:Name>AudioOutputConfigurationName</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:OutputToken>AudioOutputToken</tt:OutputToken>
<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Server</tt:SendPrimacy>
<tt:OutputLevel>10</tt:OutputLevel>
</tt:AudioOutputConfiguration>
<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
<tt:Name>AudioDecoderConfig</tt:Name>
<tt:UseCount>2</tt:UseCount>
</tt:AudioDecoderConfiguration>
</tt:Extension>
</trt:Profiles>
<trt:Profiles token="ProfileToken007" fixed="true">
<tt:Name>ProfileName007</tt:Name>
<tt:VideoSourceConfiguration token="VideoSourceConfigurationToken007">
<tt:Name>VideoSourceConfigurationName007</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>VideoSourceToken007</tt:SourceToken>
<tt:Bounds x="0" y="0" width="1280" height="720"/>
</tt:VideoSourceConfiguration>
<tt:AudioSourceConfiguration token="AudioSourceConfigurationToken007">
<tt:Name>AudioSourceConfigurationName007</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:SourceToken>AudioSourceToken007</tt:SourceToken>
</tt:AudioSourceConfiguration>
<tt:AudioEncoderConfiguration token="AudioEncoderConfigurationToken007">
<tt:Name>AudioEncoderConfigurationName007</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:Encoding>G711</tt:Encoding>
<tt:Bitrate>64</tt:Bitrate>
<tt:SampleRate>8</tt:SampleRate>
<tt:Multicast>
<tt:Address>
<tt:Type>IPv4</tt:Type>
<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
</tt:Address>
<tt:Port>8862</tt:Port>
<tt:TTL>128</tt:TTL>
<tt:AutoStart>false</tt:AutoStart>
</tt:Multicast>
<tt:SessionTimeout>PT30S</tt:SessionTimeout>
</tt:AudioEncoderConfiguration>
<tt:Extension>
<tt:AudioOutputConfiguration token="AudioOutputConfigurationToken">
<tt:Name>AudioOutputConfigurationName</tt:Name>
<tt:UseCount>2</tt:UseCount>
<tt:OutputToken>AudioOutputToken</tt:OutputToken>
<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Server</tt:SendPrimacy>
<tt:OutputLevel>10</tt:OutputLevel>
</tt:AudioOutputConfiguration>
<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
<tt:Name>AudioDecoderConfig</tt:Name>
<tt:UseCount>2</tt:UseCount>
</tt:AudioDecoderConfiguration>
</tt:Extension>
</trt:Profiles>
<!-- ... More profiles ... -->
</trt:GetProfilesResponse>
</soap:Body>
</soap:Envelope>Capabilities information:
{
"network": {
"IPFilter": false,
"ZeroConfiguration": false,
"IPVersion6": true,
"DynDNS": true,
"Dot11Configuration": false,
"Dot1XConfigurations": 0,
"HostnameFromDHCP": false,
"NTP": 1,
"DHCPv6": false
},
"security": {
"TLS1.0": false,
"TLS1.1": false,
"TLS1.2": false,
"OnboardKeyGeneration": false,
"AccessPolicyConfig": false,
"DefaultAccessPolicy": false,
"Dot1X": false,
"RemoteUserHandling": false,
"X.509Token": false,
"SAMLToken": false,
"KerberosToken": false,
"UsernameToken": true,
"HttpDigest": true,
"RELToken": true,
"MaxUsers": 32
},
"system": {
"DiscoveryResolve": false,
"DiscoveryBye": true,
"RemoteDiscovery": false,
"SystemBackup": false,
"SystemLogging": true,
"FirmwareUpgrade": false,
"HttpFirmwareUpgrade": true,
"HttpSystemBackup": false,
"HttpSystemLogging": false,
"HttpSupportInformation": false
}
}Information:
- Device manufacturer: HikVision
- Device model: DS-7732NI-I4
- Firmware version: V4.60.005 build 230307
- Node.js version: Node 22.7.0; Bun 1.2.18
Happy to do more troubleshooting if it helps.