Qt Audio and Video Development 17-Haikang SDK Decoding

I. Introducción

En el campo de la industria de la videovigilancia, Haikang merece ser el jefe, y ha estado en el primer trono durante muchos años. Recientemente, es necesario cambiar el sistema de videovigilancia al kernel de Haikang SDK, así que consulté deliberadamente el manual de usuario del SDK y el SDK relacionado. Los documentos y archivos se pueden descargar directamente desde el sitio web oficial y se actualizan con frecuencia. Actualmente, se proporciona el SDK en Windows y Linux. El SDK en Win todavía se actualiza de forma rápida y completa, pero el sdk en Linux tiene que quejarse. Es muy antiguo. Versión muy antigua, no mire el archivo del paquete es muy nuevo, de hecho, el contenido dentro es muy antiguo, no sé por qué el funcionario no actualiza también el sdk en Linux, tal vez no haya mucha demanda en Linux ahora, pero con producción nacional Con el vigoroso avance de Linux, se estima que Linux se mejorará gradualmente en un futuro cercano. Quizás el funcionario ya haya tenido este plan. También hay una suposición personal de que se estima que el kit de desarrollo en Linux será nuevo de uso interno por parte del funcionario. Sí, puede planear crear varios clientes en Linux usted mismo.

El manual oficial del SDK todavía es muy detallado y también proporciona códigos de demostración en idiomas como VC / JAVA / C #. Esto definitivamente es digno de elogio. Un producto sigue vendiéndose bien. Debe haber razones muy arraigadas. Además de la excelente calidad del producto en sí, los servicios circundantes también deben mantenerse. Como estoy acostumbrado a usar Qt para el desarrollo, compilé directamente la demostración de VC y la ejecuté en un solo paso. La interfaz es relativamente simple y fea, pero la mayoría de las funciones que quiero todavía están disponibles y es posible que muchos botones no se muestren. Es genial, sea lo que sea, lo que queremos es la función, demostrar cómo usar la función del método correspondiente, etc. En cuanto al embellecimiento de la interfaz, intenta dárselo a las chicas profesionales de la interfaz de usuario. Si no hay una chica de interfaz de usuario, obtén algunas hojas de estilo qss por ti mismo. Conviértase en ello, el núcleo de embellecimiento de la interfaz es principalmente dos puntos: diseño + color.

El oficial empaquetó todos los SDK de sus dispositivos de uso común. Un archivo de encabezado es grande, y el archivo de encabezado HCNetSDK.h tiene 47 451 líneas. Mi hecho, se estima que es para la conveniencia de los usuarios ponerlos en un archivo de encabezado. Por dentro, de hecho, estos SDK no solo admiten cámaras, sino también NVR / CVR y otros dispositivos. Tienen buena compatibilidad y precio. Puedes usar el mismo SDK. El oficial es solo unificar una categoría de diferentes categorías. Todavía existen algunas diferencias entre el SDK entre los productos de hardware, como el reconocimiento facial popular, la medición de temperatura por infrarrojos, etc., que son hardware y funciones recién agregados, pero la interfaz general y el proceso de uso son generalmente los mismos.

Flujo del proceso de decodificación:

  1. Llame a NET_DVR_Init para inicializar el SDK, y solo necesita inicializarlo una vez en un proyecto.
  2. Llame a NET_DVR_SetConnectTime, NET_DVR_SetReconnect para establecer el tiempo de conexión y el tiempo de reconexión.
  3. Complete los datos de la estructura NET_DVR_PREVIEWINFO para iniciar sesión.
  4. Llame a NET_DVR_Login_V30 para iniciar sesión en el dispositivo.
  5. Llame a NET_DVR_RealPlay_V40 para reproducir el video.
  6. Llame a NET_DVR_StopRealPlay para detener la reproducción.
  7. Llame a NET_DVR_Logout para cerrar sesión en el dispositivo.

2. Características

  1. Admite la reproducción de secuencias de video y archivos MP4 locales.
  2. Admite dos modos: manejo y devolución de llamada.
  3. Imágenes de pantalla multiproceso, no atascadas en la interfaz principal.
  4. Vuelva a conectar la cámara web automáticamente.
  5. Puede establecer el tamaño del borde, el desplazamiento y el color del borde.
  6. Puede establecer si desea dibujar etiquetas OSD, es decir, etiquetar texto o imágenes y posiciones de etiquetas.
  7. Se pueden configurar dos posiciones y estilos de OSD.
  8. Puede establecer si guardar en archivo y nombre de archivo.
  9. Puede arrastrar archivos directamente al control de haikangwidget para reproducirlos.
  10. Admite transmisión de video h264 / h265.
  11. Puede pausar y reanudar la reproducción.
  12. Admite el almacenamiento de archivos de video individuales y el almacenamiento de tiempo de archivos de video.
  13. Personalice la barra flotante superior, envíe una notificación de señal de clic y establezca si desea habilitarla.
  14. Puede establecer el relleno de estiramiento de la pantalla o el relleno de igual proporción.
  15. Puede configurar la decodificación para que tenga prioridad de velocidad, prioridad de calidad y procesamiento de ecualización.
  16. Puede tomar capturas de pantalla (imágenes originales) y capturas de pantalla (formas de video) de videos.
  17. Los archivos de video se almacenan como archivos MP4.
  18. Admite control de enfoque, control de panorámica / inclinación.
  19. Funciones personalizables.

Tres, representaciones

Inserte la descripción de la imagen aquí

Cuatro sitios relacionados

  1. Sitio nacional: https://gitee.com/feiyangqingyun/QWidgetDemo
  2. Sitio internacional: https://github.com/feiyangqingyun/QWidgetDemo
  3. Página de inicio personal: https://blog.csdn.net/feiyangqingyun
  4. Página de inicio de Zhihu: https://www.zhihu.com/people/feiyangqingyun/
  5. Dirección de experiencia: https://blog.csdn.net/feiyangqingyun/article/details/97565652

Cinco, el código central

bool HaiKangThread::playRtsp()
{
    bool ok = false;
    QString ip, userName, userPwd;
    int port, streamType;
    getInfo(ip, port, streamType, userName, userPwd);

    //登录设备
    NET_DVR_DEVICEINFO_V30 deviceInfo;
    long userid = NET_DVR_Login_V30(ip.toUtf8().data(), port, userName.toUtf8().data(), userPwd.toUtf8().data(), &deviceInfo);
    if (userid >= 0) {
        qDebug() << TIMEMS << "登录海康设备成功" << userid << deviceInfo.sSerialNumber;
        //这里还需要拿到视频流的宽高
        //qDebug() << TIMEMS << url << "videoWidth:" << videoWidth << "videoHeight:" << videoHeight;

        //以下参数具体见对应头文件说明
        NET_DVR_PREVIEWINFO previewInfo;
        previewInfo.lChannel = 1;
        previewInfo.dwStreamType = streamType;
        previewInfo.dwLinkMode = (transport == "tcp" ? 0 : 1);
        previewInfo.bBlocked = 0;
        previewInfo.byProtoType = 1;
        previewInfo.byPreviewMode = 0;
        previewInfo.dwDisplayBufNum = 15;

        //回调则可以拿到音视频数据,否则就直接句柄播放
        if (callback) {
            hand = NET_DVR_RealPlay_V40(userid, &previewInfo, RealDataCallBack, this);
        } else {
            previewInfo.hPlayWnd = (HWND)playWidget->winId();
            hand = NET_DVR_RealPlay_V40(userid, &previewInfo, NULL, NULL);
        }

        if (hand >= 0) {
            ok = true;
            qDebug() << TIMEMS << "打开视频数据成功" << url << "码流" << streamType;
        } else {
            qDebug() << TIMEMS << "打开视频数据失败" << url << NET_DVR_GetLastError();
        }
    } else {
        qDebug() << TIMEMS << "登录海康设备失败" << NET_DVR_GetLastError();
    }

    return ok;
}

bool HaiKangThread::playLocal()
{
    //转码以便支持中文路径
    QTextCodec *codec = QTextCodec::codecForName("gb2312");
    QByteArray data = codec->fromUnicode(url);

    PlayM4_GetPort(&port);
    bool ok = PlayM4_OpenFile(port, data.data());
    if (ok) {
        //设置文件播放完毕回调函数
        PlayM4_SetFileEndCallback(port, FileEndCallback, this);

        //回调则可以拿到音视频数据,否则就直接句柄播放
        if (callback) {
            PlayM4_SetDecCallBackMend(port, DecCallBack, (quser)this);
            PlayM4_Play(port, NULL);
        } else {
            PlayM4_Play(port, (HWND)playWidget->winId());
        }

        //同时播放声音
        PlayM4_PlaySound(port);

        //倒放
        //PlayM4_ReversePlay(port);

        //快进播放,多次调用速度更快
        //PlayM4_Fast(port);
        //PlayM4_Fast(port);

        ok = true;
        qDebug() << TIMEMS << "打开视频文件成功" << url;
    } else {
        qDebug() << TIMEMS << "打开视频文件失败" << url << PlayM4_GetLastError(port);
    }

    return ok;
}

bool HaiKangThread::init()
{
    //判断该摄像机是否能联通
    if (checkConn && isRtsp) {
        if (!checkUrl(url, checkTime)) {
            return false;
        }
    }

    if (playWidget == NULL) {
        return false;
    }

    //视频流和本地文件分别处理
    bool ok = false;
    if (isRtsp) {
        ok = playRtsp();
    } else {
        ok = playLocal();
    }

    if (!ok) {
        return false;
    }

    //设置保存文件
    this->initSave();
    return true;
}

void HaiKangThread::free()
{
    if (isRtsp) {
        //停止播放+登出设备
        NET_DVR_StopRealPlay(hand);
        NET_DVR_Logout(hand);
        hand = -1;
    } else {
        //停止播放+关闭文件+释放端口
        PlayM4_Stop(port);
        PlayM4_StopSound();
        PlayM4_CloseFile(port);
        PlayM4_FreePort(port);
        port = -1;
    }
}

Supongo que te gusta

Origin blog.csdn.net/feiyangqingyun/article/details/108213015
Recomendado
Clasificación