360 lines
9.0 KiB
Markdown
360 lines
9.0 KiB
Markdown
# Reproductor de Video Hikvision DVR con SDK Nativo
|
|
|
|
Aplicación Java para reproducir video en tiempo real desde DVRs/NVRs Hikvision utilizando el SDK oficial HCNetSDK.
|
|
|
|
## 📋 Requisitos Previos
|
|
|
|
### Software
|
|
- **Java JDK 11** o superior
|
|
- **Maven 3.6+**
|
|
- **Sistema Operativo**: Linux 64-bit (Ubuntu/Debian recomendado)
|
|
- **Hikvision SDK**: EN-HCNetSDKV6.1.9.4_build20220412_linux64.zip
|
|
|
|
### Hardware
|
|
- DVR/NVR Hikvision conectado a la red
|
|
- Acceso a las credenciales del dispositivo
|
|
|
|
## 🚀 Instalación
|
|
|
|
### Paso 1: Instalar Dependencias del Sistema
|
|
|
|
```bash
|
|
# Ubuntu/Debian
|
|
sudo apt-get update
|
|
sudo apt-get install -y \
|
|
default-jdk \
|
|
maven \
|
|
libssl-dev \
|
|
libstdc++6 \
|
|
libx11-6 \
|
|
libxext6 \
|
|
libxrender1 \
|
|
libxtst6 \
|
|
libxi6
|
|
|
|
# Fedora/RHEL/CentOS
|
|
sudo yum install -y \
|
|
java-11-openjdk-devel \
|
|
maven \
|
|
openssl-devel \
|
|
libstdc++ \
|
|
libX11 \
|
|
libXext \
|
|
libXrender \
|
|
libXtst \
|
|
libXi
|
|
```
|
|
|
|
### Paso 2: Descomprimir el SDK de Hikvision
|
|
|
|
```bash
|
|
unzip EN-HCNetSDKV6.1.9.4_build20220412_linux64.zip -d sdk_temp
|
|
```
|
|
|
|
### Paso 3: Crear Carpeta de Librerías
|
|
|
|
```bash
|
|
mkdir -p lib
|
|
```
|
|
|
|
### Paso 4: Copiar Librerías Nativas
|
|
|
|
```bash
|
|
# Copiar todas las librerías .so necesarias
|
|
cp sdk_temp/lib/*.so lib/
|
|
|
|
# Verificar que se copiaron correctamente
|
|
ls -la lib/
|
|
```
|
|
|
|
Deberías ver archivos como:
|
|
- `libhcnetsdk.so`
|
|
- `libHCCore.so`
|
|
- `libHCNetSDKCom.so`
|
|
- `libPlayCtrl.so`
|
|
- `libssl.so.1.1`
|
|
- `libcrypto.so.1.1`
|
|
- Otros archivos `.so`
|
|
|
|
### Paso 5: Compilar el Proyecto
|
|
|
|
```bash
|
|
mvn clean install
|
|
```
|
|
|
|
## ⚙️ Configuración
|
|
|
|
### Configurar Datos del DVR
|
|
|
|
Edita el archivo `src/main/java/com/telcotronics/hikvision/player/HikvisionPlayer.java`:
|
|
|
|
```java
|
|
// Variables de configuración
|
|
private String dvrIP = "192.168.1.100"; // IP del DVR
|
|
private int dvrPort = 8000; // Puerto del SDK (NO RTSP)
|
|
private String username = "admin"; // Usuario del DVR
|
|
private String password = "tu_password"; // Contraseña del DVR
|
|
private int channel = 1; // Número de canal (1, 2, 3, etc.)
|
|
```
|
|
|
|
### Verificar Configuración en el DVR
|
|
|
|
1. Accede a la interfaz web del DVR: `http://IP_DEL_DVR`
|
|
2. Ve a **Configuration → Network → Advanced Settings**
|
|
3. Verifica que **SDK Port** esté habilitado en el puerto **8000**
|
|
4. Anota el número de canal que deseas visualizar
|
|
|
|
## 🎮 Ejecución
|
|
|
|
### Método 1: Script de Ejecución (Recomendado)
|
|
|
|
Crea un archivo `run.sh`:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
|
|
mvn exec:java -Dexec.mainClass="com.telcotronics.hikvision.player.HikvisionPlayer"
|
|
```
|
|
|
|
Dale permisos y ejecuta:
|
|
|
|
```bash
|
|
chmod +x run.sh
|
|
./run.sh
|
|
```
|
|
|
|
### Método 2: Ejecutar con Maven Directamente
|
|
|
|
```bash
|
|
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
|
|
mvn exec:java -Dexec.mainClass="com.telcotronics.hikvision.player.HikvisionPlayer"
|
|
```
|
|
|
|
### Método 3: Generar JAR Ejecutable
|
|
|
|
```bash
|
|
mvn clean package
|
|
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
|
|
java -jar target/hikvision-player-1.0-SNAPSHOT.jar
|
|
```
|
|
|
|
## 📖 Ejemplo de Uso Básico
|
|
|
|
### Código Mínimo para Integrar en tu Panel
|
|
|
|
```java
|
|
// Inicializar SDK
|
|
HCNetSDK sdk = HCNetSDK.INSTANCE;
|
|
sdk.NET_DVR_Init();
|
|
|
|
// Conectar al DVR
|
|
NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
|
|
NativeLong userID = sdk.NET_DVR_Login_V30("192.168.1.100", 8000, "admin", "password", deviceInfo);
|
|
|
|
// Configurar preview
|
|
NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO();
|
|
previewInfo.lChannel = new NativeLong(1); // Canal 1
|
|
previewInfo.hPlayWnd = Native.getComponentPointer(tuCanvas); // Tu Canvas Swing
|
|
previewInfo.byProtoType = 0; // TCP
|
|
|
|
// Iniciar reproducción
|
|
NativeLong realHandle = sdk.NET_DVR_RealPlay_V40(userID, previewInfo, null, null);
|
|
|
|
// Detener reproducción
|
|
sdk.NET_DVR_StopRealPlay(realHandle);
|
|
|
|
// Desconectar
|
|
sdk.NET_DVR_Logout(userID);
|
|
sdk.NET_DVR_Cleanup();
|
|
```
|
|
|
|
## 🐛 Solución de Problemas
|
|
|
|
### Error: "libhcnetsdk.so: cannot open shared object file"
|
|
|
|
**Solución**:
|
|
```bash
|
|
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
|
|
# O agrega la ruta permanentemente
|
|
echo 'export LD_LIBRARY_PATH=/ruta/completa/al/proyecto/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
|
|
source ~/.bashrc
|
|
```
|
|
|
|
### Error: "UnsatisfiedLinkError: libssl.so.1.1"
|
|
|
|
**Solución en Ubuntu 22.04+** (que usa OpenSSL 3):
|
|
```bash
|
|
# Descargar OpenSSL 1.1 compatible
|
|
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
|
|
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
|
|
```
|
|
|
|
O copia las librerías del SDK directamente:
|
|
```bash
|
|
cp sdk_temp/lib/libssl.so.1.1 lib/
|
|
cp sdk_temp/lib/libcrypto.so.1.1 lib/
|
|
```
|
|
|
|
### Error: "Error al conectar al DVR. Código: 1"
|
|
|
|
**Posibles causas**:
|
|
- ✗ Usuario o contraseña incorrectos
|
|
- ✗ DVR no accesible en la red
|
|
- ✗ Puerto 8000 bloqueado por firewall
|
|
|
|
**Solución**:
|
|
```bash
|
|
# Verifica conectividad
|
|
ping IP_DEL_DVR
|
|
|
|
# Verifica que el puerto esté abierto
|
|
telnet IP_DEL_DVR 8000
|
|
```
|
|
|
|
### Error: "Error al iniciar reproducción. Código: 7"
|
|
|
|
**Causa**: Canal no disponible o número de canal incorrecto
|
|
|
|
**Solución**: Verifica en la interfaz web del DVR qué canales están activos
|
|
|
|
### Error de Código 23
|
|
|
|
**Causa**: El DVR alcanzó el límite máximo de conexiones simultáneas
|
|
|
|
**Solución**: Desconecta otras sesiones activas del DVR
|
|
|
|
### Video no se muestra (pantalla negra)
|
|
|
|
**Soluciones**:
|
|
1. Verifica que el canal tenga una cámara conectada
|
|
2. Cambia el canal: `previewInfo.lChannel = new NativeLong(2);`
|
|
3. Intenta con substream:
|
|
```java
|
|
previewInfo.lLinkMode = new NativeLong(1); // 0=Main, 1=Sub
|
|
```
|
|
|
|
### Error: "Cannot find AWT libraries"
|
|
|
|
**Solución**:
|
|
```bash
|
|
# Ubuntu/Debian
|
|
sudo apt-get install libxrender1 libxtst6 libxi6
|
|
|
|
# Si usas JDK sin cabecera gráfica, instala el completo
|
|
sudo apt-get install default-jdk
|
|
```
|
|
|
|
## 📊 Códigos de Error Comunes
|
|
|
|
| Código | Descripción | Solución |
|
|
|--------|-------------|----------|
|
|
| 1 | Usuario/contraseña incorrectos | Verifica credenciales |
|
|
| 3 | Tiempo de espera agotado | Verifica conectividad de red |
|
|
| 7 | Canal no disponible | Verifica número de canal |
|
|
| 23 | Máximo de conexiones alcanzado | Cierra otras sesiones |
|
|
| 26 | Versión SDK incompatible | Actualiza el SDK |
|
|
| 29 | El dispositivo está ocupado | Espera y reintenta |
|
|
|
|
## 📁 Estructura del Proyecto
|
|
|
|
```
|
|
.
|
|
├── EN-HCNetSDKV6.1.9.4_build20220412_linux64.zip # SDK descargado
|
|
├── lib/ # Librerías nativas .so
|
|
│ ├── libhcnetsdk.so
|
|
│ ├── libHCCore.so
|
|
│ ├── libssl.so.1.1
|
|
│ ├── libcrypto.so.1.1
|
|
│ └── ...
|
|
├── pom.xml # Configuración Maven
|
|
├── run.sh # Script de ejecución
|
|
├── README.md # Este archivo
|
|
└── src/
|
|
└── main/
|
|
└── java/
|
|
└── com/
|
|
└── telcotronics/
|
|
└── hikvision/
|
|
└── player/
|
|
└── [TU_PANEL_AQUI].java
|
|
```
|
|
|
|
## 🔧 Configuración Avanzada
|
|
|
|
### Cambiar a Substream (menor calidad, menor ancho de banda)
|
|
|
|
```java
|
|
previewInfo.lLinkMode = new NativeLong(1); // 0=Main stream, 1=Sub stream
|
|
```
|
|
|
|
### Usar Protocolo UDP en lugar de TCP
|
|
|
|
```java
|
|
previewInfo.byProtoType = 1; // 0=TCP, 1=UDP
|
|
```
|
|
|
|
### Aumentar Buffer de Visualización
|
|
|
|
```java
|
|
previewInfo.dwDisplayBufNum = new NativeLong(5); // 1-10 frames
|
|
```
|
|
|
|
## 📦 Dependencias Maven Necesarias
|
|
|
|
El `pom.xml` debe incluir:
|
|
|
|
```xml
|
|
<dependencies>
|
|
<!-- JNA para llamadas nativas -->
|
|
<dependency>
|
|
<groupId>net.java.dev.jna</groupId>
|
|
<artifactId>jna</artifactId>
|
|
<version>5.13.0</version>
|
|
</dependency>
|
|
|
|
<dependency>
|
|
<groupId>net.java.dev.jna</groupId>
|
|
<artifactId>jna-platform</artifactId>
|
|
<version>5.13.0</version>
|
|
</dependency>
|
|
</dependencies>
|
|
```
|
|
|
|
## 📝 Notas Importantes
|
|
|
|
1. **Puerto SDK vs RTSP**:
|
|
- SDK usa puerto **8000** (configurable en DVR)
|
|
- RTSP usa puerto **554**
|
|
|
|
2. **Rendimiento**: El SDK nativo es más eficiente que RTSP para aplicaciones Java
|
|
|
|
3. **Compatibilidad**: Diseñado para DVRs/NVRs Hikvision con SDK v6.x
|
|
|
|
4. **Limitaciones**:
|
|
- Solo Linux 64-bit
|
|
- Máximo 16 conexiones simultáneas por DVR (depende del modelo)
|
|
- Requiere OpenSSL 1.1.x
|
|
|
|
5. **Seguridad**:
|
|
- Nunca incluyas credenciales en el código fuente
|
|
- Usa archivos de configuración externos (.properties, .env)
|
|
- Agrega archivos de configuración a `.gitignore`
|
|
|
|
## 📚 Recursos Adicionales
|
|
|
|
- [Portal de Soporte Hikvision](https://www.hikvision.com/en/support/)
|
|
- [Documentación HCNetSDK](https://www.hikvision.com/en/support/download/sdk/)
|
|
- [JNA Documentation](https://github.com/java-native-access/jna)
|
|
|
|
## 🤝 Contribuciones
|
|
|
|
Si encuentras errores o mejoras, reporta los issues o envía pull requests.
|
|
|
|
## 📄 Licencia
|
|
|
|
Este proyecto utiliza el SDK de Hikvision que está sujeto a sus propios términos de licencia.
|
|
|
|
---
|
|
|
|
**¿Necesitas ayuda?** Revisa la sección de [Solución de Problemas](#-solución-de-problemas) o verifica los logs de la aplicació
|