Dahua NetSDK Ошибка 39: NET_PLAY_BACK_END — завершение видеопотока
- Функция чтения архивного потока возвращает код состояния
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); Частые вопросы (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.