NT98331 DVR/NVR SDK는 Novatek의 NT98331/NT98332 칩셋을 기반으로 하는 디지털 비디오 레코더(DVR) 및 네트워크 비디오 레코더(NVR) 시스템 개발을 위한 소프트웨어 개발 키트입니다.
이 SDK는 다음과 같은 주요 특징을 제공합니다:
본 SDK는 다음 칩셋을 지원합니다:
NT98331 DVR/NVR SDK는 다음과 같은 디렉터리 구조로 구성됩니다:
NT98331_DVR_NVR_SDK/ ├── Hardware/ # 하드웨어 관련 문서 및 회로도 ├── Document/ # 기술 문서 ├── Chip/ # 칩셋별 소스코드 ├── Software/ # 소프트웨어 소스 및 도구 ├── PC_Tool/ # PC용 개발 도구 └── Disclaimer/ # 라이센스 및 법적 고지사항
효율적인 개발을 위해 다음과 같은 개발 환경을 권장합니다:
Ubuntu 18.04 LTS 이상에서 개발하는 것을 강력히 권장합니다. 다른 Linux 배포판도 사용 가능하지만, 의존성 문제나 호환성 이슈가 발생할 수 있습니다.
sudo apt update sudo apt install build-essential git wget curl sudo apt install libncurses5-dev libssl-dev sudo apt install device-tree-compiler u-boot-tools
NT98331/NT98332 개발 보드를 PC에 연결하기 위해 다음 인터페이스를 사용합니다:
제공받은 SDK 압축 파일을 적절한 위치에 압축 해제합니다:
cd /opt sudo tar -xzf NT98331_DVR_NVR_SDK.tar.gz sudo chown -R $USER:$USER NT98331_DVR_NVR_SDK
NT98331 SDK는 두 가지 툴체인을 지원합니다:
표준 glibc 라이브러리를 사용하는 툴체인으로, 더 많은 기능을 제공하지만 바이너리 크기가 큽니다.
임베디드 시스템에 최적화된 경량 C 라이브러리를 사용하는 툴체인입니다. 메모리가 제한된 환경에서 유리합니다.
개발 환경을 설정하기 위해 환경 설정 스크립트를 실행합니다:
cd /opt/NT98331_DVR_NVR_SDK source envsetup.sh
이 스크립트는 다음과 같은 환경 변수를 설정합니다:
lunch 명령을 통해 빌드할 프로젝트와 툴체인을 선택합니다:
lunch
메뉴에서 적절한 옵션을 선택합니다:
전체 시스템을 빌드하려면 다음 명령을 사용합니다:
make all
이 명령은 다음 구성 요소를 순차적으로 빌드합니다:
make uboot
make linux
make rootfs
make app
빌드 완료 후 output 디렉터리에 다음 파일들이 생성됩니다:
| 파일명 | 설명 | 용도 |
|---|---|---|
| u-boot.bin | U-Boot 부트로더 | 시스템 부팅 |
| uImage | Linux 커널 이미지 | 운영체제 커널 |
| rootfs.ubifs | 루트 파일시스템 | 기본 시스템 파일 |
| app.ubifs | 애플리케이션 파일시스템 | 사용자 애플리케이션 |
빌드된 이미지를 개발 보드에 업로드하기 위해 FwUpgrade.exe 도구를 사용합니다:
NT98331 시스템의 부팅 과정은 다음과 같은 단계로 진행됩니다:
vg_boot.sh 스크립트는 시스템 부팅 시 자동으로 실행되며 다음 작업을 수행합니다:
다음과 같은 커널 모듈들이 부팅 시 로드됩니다:
nvt_ipc.ko: Inter-Process Communicationnvt_ivot.ko: Input/Output Transportnvt_vdec.ko: Video Decodernvt_venc.ko: Video Encodernvt_audio.ko: Audio Processingmodule_init.c는 시스템 초기화의 마지막 단계에서 실행되며 다음 기능을 담당합니다:
시스템에서 사용할 메모리 영역을 설정하고 관리합니다. 이는 비디오 처리를 위한 대용량 버퍼 할당에 중요합니다.
다음과 같은 외부 장치들을 초기화합니다:
비디오 입력 및 출력 채널을 시스템에 등록하고, 각 채널의 상태를 모니터링합니다.
HDAL(Hardware Device Abstraction Layer)은 하드웨어 종속성을 제거하고 일관된 API를 제공하는 추상화 계층입니다.
HDAL은 크게 두 가지 종류의 모듈로 구분됩니다:
실시간 데이터 스트림 처리를 담당하는 모듈들:
보조 기능을 제공하는 모듈들:
모든 HDAL 모듈은 다음과 같은 공통 API 패턴을 따릅니다:
| 함수 | 설명 | 사용 시점 |
|---|---|---|
| hd_xxx_init() | 모듈 초기화 | 프로그램 시작 시 |
| hd_xxx_uninit() | 모듈 해제 | 프로그램 종료 시 |
| hd_xxx_open() | 디바이스 열기 | 사용 전 |
| hd_xxx_close() | 디바이스 닫기 | 사용 완료 후 |
| hd_xxx_bind() | 모듈 간 연결 | 데이터 플로우 구성 |
| hd_xxx_unbind() | 모듈 간 연결 해제 | 플로우 변경 시 |
| 함수 | 설명 | 용도 |
|---|---|---|
| hd_xxx_set() | 설정값 변경 | 런타임 설정 변경 |
| hd_xxx_get() | 설정값 조회 | 현재 상태 확인 |
| 함수 | 설명 | 용도 |
|---|---|---|
| hd_xxx_start() | 데이터 처리 시작 | 스트림 시작 |
| hd_xxx_stop() | 데이터 처리 중지 | 스트림 중지 |
| hd_xxx_recv() | 데이터 수신 | 결과 데이터 획득 |
| hd_xxx_release() | 데이터 반환 | 메모리 해제 |
비디오 캡처에서 인코딩까지의 기본적인 데이터 플로우를 구현하는 예제입니다.
Video Sensor → HD_VIDEOCAP → HD_VIDEOENC → Bitstream Output
#include "hd_type.h"
#include "hd_videocap.h"
#include "hd_videoenc.h"
int main(void)
{
HD_RESULT ret;
HD_PATH_ID videocap_path, videoenc_path;
HD_VIDEOCAP_DEV_CONFIG videocap_config;
HD_VIDEOENC_DEV_CONFIG videoenc_config;
// 1. 모듈 초기화
ret = hd_videocap_init();
if (ret != HD_OK) {
printf("videocap init failed\n");
return -1;
}
ret = hd_videoenc_init();
if (ret != HD_OK) {
printf("videoenc init failed\n");
return -1;
}
// 2. 디바이스 열기
ret = hd_videocap_open(0, HD_VIDEOCAP_0_OUT, &videocap_path);
if (ret != HD_OK) {
printf("videocap open failed\n");
return -1;
}
ret = hd_videoenc_open(0, HD_VIDEOENC_0_OUT, &videoenc_path);
if (ret != HD_OK) {
printf("videoenc open failed\n");
return -1;
}
// 3. 디바이스 설정
videocap_config.sensor_id = 0;
videocap_config.width = 1920;
videocap_config.height = 1080;
videocap_config.frame_rate = 30;
ret = hd_videocap_set(videocap_path, HD_VIDEOCAP_PARAM_DEV_CONFIG, &videocap_config);
videoenc_config.codec = HD_CODEC_TYPE_H264;
videoenc_config.bitrate = 4000000; // 4Mbps
ret = hd_videoenc_set(videoenc_path, HD_VIDEOENC_PARAM_DEV_CONFIG, &videoenc_config);
// 4. 모듈 간 연결 (바인딩)
ret = hd_videocap_bind(HD_VIDEOCAP_0_OUT, videoenc_path);
if (ret != HD_OK) {
printf("bind failed\n");
return -1;
}
// 5. 스트리밍 시작
ret = hd_videocap_start(videocap_path);
ret = hd_videoenc_start(videoenc_path);
// 6. 인코딩된 데이터 수신 루프
while (running) {
HD_VIDEO_FRAME frame;
ret = hd_videoenc_recv(videoenc_path, &frame, 1000); // 1초 타임아웃
if (ret == HD_OK) {
// 인코딩된 프레임 처리
process_encoded_frame(&frame);
// 프레임 반환
hd_videoenc_release(videoenc_path, &frame);
}
}
// 7. 정리 작업
hd_videocap_stop(videocap_path);
hd_videoenc_stop(videoenc_path);
hd_videocap_unbind(HD_VIDEOCAP_0_OUT);
hd_videocap_close(videocap_path);
hd_videoenc_close(videoenc_path);
hd_videocap_uninit();
hd_videoenc_uninit();
return 0;
}
캡처한 비디오를 실시간으로 화면에 출력하는 라이브뷰 기능을 구현합니다.
Video Sensor → HD_VIDEOCAP → HD_VIDEOPROC → HD_VIDEOOUT → Display
↓
HD_OSG (OSD 오버레이)
녹화된 비디오 파일을 디코딩하여 재생하는 기능을 구현합니다.
Video File → HD_DATAIN → HD_VIDEODEC → HD_VIDEOPROC → HD_VIDEOOUT → Display
비디오 품질 향상을 위한 노이즈 제거 기능:
// 노이즈 제거 설정 HD_VIDEOPROC_NR nr_config; nr_config.enable = TRUE; nr_config.strength = 50; // 0-100 범위 hd_videoproc_set(videoproc_path, HD_VIDEOPROC_PARAM_NR, &nr_config);
특정 영역을 마스킹하여 프라이버시를 보호하는 기능:
// 프라이버시 마스크 설정 HD_VIDEOPROC_MASK mask_config; mask_config.enable = TRUE; mask_config.x = 100; mask_config.y = 100; mask_config.width = 200; mask_config.height = 150; mask_config.color = 0x000000; // 검은색 hd_videoproc_set(videoproc_path, HD_VIDEOPROC_PARAM_MASK, &mask_config);
영상에서 움직임을 감지하는 기능:
// 움직임 감지 설정 HD_VIDEOCAP_MD md_config; md_config.enable = TRUE; md_config.sensitivity = 80; // 민감도 md_config.threshold = 10; // 임계값 hd_videocap_set(videocap_path, HD_VIDEOCAP_PARAM_MD, &md_config);
증상: "cross compiler not found" 오류 발생
해결방법:
증상: 빌드 중 헤더 파일 또는 라이브러리를 찾을 수 없음
해결방법:
# Ubuntu/Debian에서 필수 패키지 설치 sudo apt install build-essential libncurses5-dev sudo apt install device-tree-compiler u-boot-tools
증상: 시스템이 정상적으로 부팅되지 않음
확인사항:
증상: 커널 로딩 중 패닉 발생
해결방법:
증상: hd_xxx_init() 함수에서 오류 반환
해결방법:
증상: hd_xxx_bind() 함수에서 실패
해결방법:
증상: 메모리 할당 실패 또는 성능 저하
해결방법:
증상: 영상이 끊어지거나 프레임이 누락됨
해결방법:
시스템 로그를 통해 문제를 진단합니다:
# 시스템 로그 확인 dmesg | tail -50 # 특정 모듈 로그 확인 cat /proc/nvt_logs/videocap
# CPU 사용률 확인 top # 메모리 사용량 확인 free -m # 프로세스별 리소스 사용량 ps aux | grep hd_
SDK에 포함된 예제 코드들은 다음 경로에서 확인할 수 있습니다:
NT98331_DVR_NVR_SDK/Software/samples/
├── encode/
│ ├── encode_with_nr.c
│ ├── encode_with_osg.c
│ └── encode_with_mask.c
├── liveview/
│ └── liveview_1div_to_4div.c
├── playback/
│ └── playback_1div_to_4div.c
└── display/
└── display_to_encode.c
- 문서 끝 -