Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

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

NET_PLAY_BACK_END (39) IP-Телефония и СКУД

Dahua NetSDK Ошибка 39: NET_PLAY_BACK_END — завершение видеопотока

Обновлено: 24.08.2026 · Официальная документация ↗
  • Функция чтения архивного потока возвращает код состояния 39 (NET_PLAY_BACK_END).
  • Процесс экспорта архива или стриминга записи внезапно останавливается до достижения конца таймлайна.
  • В callback-функции воспроизведения перестают поступать бинарные пакеты.

1. Анализ логики обработки кода 39

Код 39 в Dahua NetSDK не является критической системной ошибкой; это штатный флаг индикации того, что видеопоток архивной записи по заданному временному интервалу полностью вычитан из хранилища (End of File/Stream):

// Обработка статуса в Callback функции воспроизведения/загрузки
void CALLBACK DownLoadPosCallBack(LLONG lPlayHandle, DWORD dwTotalSize, DWORD dwDownLoadSize, LDWORD dwUser) {
    if (dwDownLoadSize == (DWORD)-1 || CLIENT_GetLastError() == 39) {
        printf("Playback / Download completed successfully.\n");
        CLIENT_StopPlayBack(lPlayHandle);
    }
}

2. Проверка фрагментации архивных записей

Если воспроизведение обрывается раньше времени, архив на NVR разбит на непересекающиеся отрезки (фрагментация по детектору движения). Выполните предварительный поиск всех файлов отрезка:

NET_IN_FIND_RECORD_PARAM stIn = { sizeof(stIn) };
stIn.nChannelId = 0;
stIn.nRecordType = 0; // Все типы записей
// Задание структуры времени stIn.stStartTime / stIn.stEndTime

NET_OUT_FIND_RECORD_PARAM stOut = { sizeof(stOut) };
CLIENT_FindFileCard(lLoginHandle, &stIn, &stOut, 5000);

NET_RECORDFILE_INFO stFileInfo = { 0 };
while (CLIENT_FindNextFileCard(stOut.lFindHandle, &stFileInfo, sizeof(stFileInfo)) > 0) {
    printf("Found slice: %s -> %s\n", stFileInfo.starttime.toString(), stFileInfo.endtime.toString());
    // Последовательное воспроизведение каждого найденного блока
}

3. Закрытие дескрипторов PlayBack сессии

После получения флага завершения потока освободите ресурсы:

CLIENT_StopPlayBack(lPlaybackHandle);
CLIENT_StopDownload(lDownloadHandle);
💡 Практика специалистов: Не игнорируйте статус 39 при скачивании архива в файл на диск. Если приложение не вызовет CLIENT_StopDownload() после получения EOF, файл на диске останется заблокированным процессом, а заголовок MP4/DAV-контейнера не будет финализирован.

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

Что делать, если ошибка 39 приходит через 1 секунду после старта воспроизведения?

Это указывает на то, что в запрашиваемом интервале времени на жестких дисках NVR отсутствуют видеозаписи (пустой таймлайн), либо тип записи (Manual/Alarm/Motion) не совпадает с переданным фильтром.

Как воспроизвести непрерывный поток, состоящий из множества файлов?

Используйте функцию CLIENT_PlayBackByTimeEx, которая автоматически производит сквозную сшивку смежных архивных блоков без необходимости ручного перезапуска дескриптора воспроизведения.

Как ускорить скачивание архива через SDK?

Используйте функцию CLIENT_SetDownloadSpeed с флагом скорости 4x, 8x или 16x (DH_DOWNLOAD_SPEED_E), либо скачивайте напрямую сырые .dav файлы через CLIENT_DownloadByRecordFile.

Как узнать текущий прогресс воспроизведения в процентах?

Вызывайте функцию CLIENT_GetPlayBackOsdTime(lPlaybackHandle, &stCurTime, &stStartTime, &stEndTime) или используйте позиционный callback, передаваемый в CLIENT_PlayBackByTime.

Полезные материалы
Рекомендуем