⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
NET_DEC_CLOSE_ERROR (13) IP-Телефония и СКУД

Dahua NetSDK Ошибка 13: NET_DEC_CLOSE_ERROR — Решение и траблшутинг

Обновлено: 24.08.2026  ·  Официальная база знаний

При попытке остановить воспроизведение или освободить ресурсы декодера через NetSDK/PlaySDK возникают следующие симптомы:

  • Функция CLIENT_StopRealPlay или функции PlaySDK (например, PLAY_Stop, PLAY_CloseStream) возвращают отрицательный статус, а CLIENT_GetLastError() возвращает код 13.
  • Утечка дескрипторов портов воспроизведения (Channel/Port Handles).
  • Зависание интерфейса видеостены или клиентского ПО при переключении раскладок камер.
  • Процесс видеосервера аварийно завершается при попытке повторного открытия закрываемого канала.

Ошибка NET_DEC_CLOSE_ERROR (13) возникает в тех случаях, когда подсистема декодирования не может штатно остановить конвейер рендеринга, буферизации или освободить поток декодера (DirectX/OpenGL/Software Decoder).

1. Проверка последовательности завершения сессии

Нарушение строгого порядка дерегистрации вызовов — главная причина ошибки. Остановка должна производиться в следующем порядке:

  1. Остановка приема сетевого потока: CLIENT_StopRealPlayEx(hPlayHandle).
  2. Остановка отрисовки кадра: PLAY_Stop(nPort).
  3. Закрытие потока декодера: PLAY_CloseStream(nPort).
  4. Освобождение порта PlaySDK: PLAY_FreePort(nPort).

2. Пример безопасного освобождения ресурсов на C++

void SafeCloseDecoderStream(LLONG hRealHandle, LONG nPort) {
    if (hRealHandle != 0) {
        if (!CLIENT_StopRealPlayEx(hRealHandle)) {
            DWORD dwErr = CLIENT_GetLastError();
            // Логирование ошибки NetSDK
        }
    }
    if (nPort >= 0) {
        PLAY_Stop(nPort);
        if (!PLAY_CloseStream(nPort)) {
            // Ошибка закрытия потока декодера
        }
        PLAY_FreePort(nPort);
    }
}

3. Проверка видеодрайвера и графического контекста

Если декодер инициализирован в режиме аппаратного ускорения (DXVA2, D3D11, NVDEC):

  • Обновите драйверы видеокарты на сервере декодирования.
  • Проверьте, не уничтожен ли родительский дескриптор окна HWND до вызова PLAY_Stop. Если окно уничтожается раньше закрытия потока, декодер пытается адресоваться к невалидному графическому контексту.
Практический опыт инженера: Частая архитектурная ошибка — вызов CLIENT_StopRealPlay из вторичного потока обратного вызова (fRealDataCallBack). Сетевые вызовы закрытия должны выполняться исключительно в основном контексте управления.

Частые вопросы (FAQ)

Что конкретно означает код ошибки 13 (NET_DEC_CLOSE_ERROR)?

Код указывает на аппаратный или программный сбой при попытке закрыть канал/поток встроенного декодера видеопотока.

Может ли ошибка возникать из-за неправильного дескриптора окна HWND?

Да, если связанное окно интерфейса Windows/Linux было разрушено до вызова функций PLAY_CloseStream и CLIENT_StopRealPlay, рендерер выдаст сбой при освобождении ресурсов.

Как избежать утечки портов PlaySDK при ошибке 13?

Всегда вызывайте PLAY_FreePort в блоке очистки (cleanup/finally), даже если PLAY_CloseStream вернул ошибку, чтобы вернуть индекс порта в пул доступных.

Влияет ли версия dahua PlaySDK на данную ошибку?

Да, устаревшие версии библиотеки playx.dll имеют известные проблемы дедлока при закрытии H.265 (HEVC) потоков высокого разрешения 4K.

Telegram Telegram Max Max Позвонить Позвонить E-mail E-mail