Dahua NetSDK Ошибка 16: NET_TALK_NOT_INIT — Ошибка вызова функций интеркома
Проявление ошибки при программной отправке аудио-фреймов:
- Вызовы
CLIENT_TalkSendDataилиCLIENT_AudioDecвозвращают ошибку с кодом16. - Аудиопоток не поступает на устройство, голос оператора отсутствует.
- SDK сообщает, что модуль голосовой связи не находится в инициализированном состоянии.
Код NET_TALK_NOT_INIT (16) означает, что приложение пытается передать голосовые данные или завершить сеанс двусторонней связи без предварительного успешного установления интерком-сессии через CLIENT_StartTalkEx.
1. Проверка валидности дескриптора сессии Talk
// Неправильно:
CLIENT_TalkSendData(hTalkHandle, pAudioBuf, dwBufSize); // hTalkHandle равен 0 или невалиден
// Правильно:
if (hTalkHandle != 0) {
LONG nRet = CLIENT_TalkSendData(hTalkHandle, pAudioBuf, dwBufSize);
if (nRet <= 0) {
DWORD dwErr = CLIENT_GetLastError();
// Обработка ошибки отправки
}
} else {
// Сессия не инициализирована!
}2. Проверка завершения асинхронного рукопожатия
Если используется асинхронный старт, убедитесь, что устройство подтвердило готовность к приему аудиопотока до отправки первого фрейма. Отправка фреймов до получения положительного ответа от сокета приводит к ошибке 16.
3. Контроль состояния соединения
Если устройство разорвало связь (например, по таймауту тишины или из-за перезагрузки), статус сессии сбрасывается. Реализуйте обработчик fHaveReConnect для восстановления сессии интеркома.
Частые вопросы (FAQ)
Почему возникает ошибка 16 при вызове CLIENT_TalkSendData?
Переданный дескриптор hTalkHandle равен 0, либо сессия голосовой связи была разорвана до момента передачи аудио-буфера.
Нужно ли передавать заголовки контейнера в CLIENT_TalkSendData?
Нет, передаются только сырые аудио-данные (RAW PCM/G.711 фреймы) в соответствии с форматом, согласованным при инициализации.
Что возвращает CLIENT_StopTalk, если сессия уже была закрыта?
Функция вернет FALSE, а CLIENT_GetLastError() выдаст код 16 (NET_TALK_NOT_INIT).
Может ли ошибка возникать при переключении аудиоканала на регистраторе?
Да, при смене канала интеркома старую сессию необходимо закрыть и заново инициализировать новый канал через CLIENT_StartTalkEx.