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
# 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
unzip EN-HCNetSDKV6.1.9.4_build20220412_linux64.zip -d sdk_temp
Paso 3: Crear Carpeta de Librerías
mkdir -p lib
Paso 4: Copiar Librerías Nativas
# 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.solibHCCore.solibHCNetSDKCom.solibPlayCtrl.solibssl.so.1.1libcrypto.so.1.1- Otros archivos
.so
Paso 5: Compilar el Proyecto
mvn clean install
⚙️ Configuración
Configurar Datos del DVR
Edita el archivo src/main/java/com/telcotronics/hikvision/player/HikvisionPlayer.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
- Accede a la interfaz web del DVR:
http://IP_DEL_DVR - Ve a Configuration → Network → Advanced Settings
- Verifica que SDK Port esté habilitado en el puerto 8000
- Anota el número de canal que deseas visualizar
🎮 Ejecución
Método 1: Script de Ejecución (Recomendado)
Crea un archivo run.sh:
#!/bin/bash
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
mvn exec:java -Dexec.mainClass="com.telcotronics.hikvision.player.HikvisionPlayer"
Dale permisos y ejecuta:
chmod +x run.sh
./run.sh
Método 2: Ejecutar con Maven Directamente
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
mvn exec:java -Dexec.mainClass="com.telcotronics.hikvision.player.HikvisionPlayer"
Método 3: Generar JAR Ejecutable
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
// 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:
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):
# 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:
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:
# 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:
- Verifica que el canal tenga una cámara conectada
- Cambia el canal:
previewInfo.lChannel = new NativeLong(2); - Intenta con substream:
previewInfo.lLinkMode = new NativeLong(1); // 0=Main, 1=Sub
Error: "Cannot find AWT libraries"
Solución:
# 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)
previewInfo.lLinkMode = new NativeLong(1); // 0=Main stream, 1=Sub stream
Usar Protocolo UDP en lugar de TCP
previewInfo.byProtoType = 1; // 0=TCP, 1=UDP
Aumentar Buffer de Visualización
previewInfo.dwDisplayBufNum = new NativeLong(5); // 1-10 frames
📦 Dependencias Maven Necesarias
El pom.xml debe incluir:
<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
-
Puerto SDK vs RTSP:
- SDK usa puerto 8000 (configurable en DVR)
- RTSP usa puerto 554
-
Rendimiento: El SDK nativo es más eficiente que RTSP para aplicaciones Java
-
Compatibilidad: Diseñado para DVRs/NVRs Hikvision con SDK v6.x
-
Limitaciones:
- Solo Linux 64-bit
- Máximo 16 conexiones simultáneas por DVR (depende del modelo)
- Requiere OpenSSL 1.1.x
-
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
🤝 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 o verifica los logs de la aplicació