기술 선택 기준
플러터 개발 중 필요한 패키지가 생기면 다음과 같이 접근한다.
- pub.dev에서 패키지를 검색한다.
- 지원 플랫폼, 의존성, 프로젝트 성숙도 등을 기준으로 1차 검토를 진행한다.
- 조건을 충족하는 패키지는 예제를 직접 빌드해 보고 빌드에 문제가 없는지, 내가 구상한 흐름이 가능한지 확인한다.
- 이후 코드를 살펴보며 내 프로젝트에 사용 가능한지, 잠재적 위험은 없는지 등 저자의 의도를 파악한다.
라이브러리 검토 시에는 에러를 깊게 추적하기보다 수정 범위를 제한적으로 가져간다.
또한 원본 소스를 직접 수정하기보다 래핑하는 방식을 우선시한다.
에러 해결 과정이 연쇄적으로 이어지는 경우, 구조적인 문제로 판단해 사용을 보류한다.
보이는 에러를 잡아도 잠재적인 문제가 추후 더 큰 비용으로 이어질 수 있기 때문이다.
동시에 “직접 구현하는 것이 더 나을까?”도 생각하며, 다음과 같은 요소들을 고려한다.
- 기존 패키지 대비 장점과 한계
- 의존 범위와 직접 구현 범위, 이에 따른 공수
- 기술적 불확실성, 윤곽은 잡히지만 진행하면서 발생할 세부 문제들
UVC 라이브러리 검토
UVC 프로토콜은 이전 포스팅을 참고
2026.04.10 - [Engineering/system (device, embedded)] - UVC(USB Video Class) Camera
libuvc - UVC 프로토콜을 추상화하여, 카메라 제어 및 스트리밍 기능을 제공하는 C 라이브러리, 내부적으로 libusb를 사용해 디바이스와 통신한다.
UVCCamera (saki4510t) - libuvc를 기반으로 Android에서 UVC 카메라 제어 및 스트리밍을 지원하는 라이브러리다.
마지막 커밋 2018.10
AndroidUSBCamera (jiangdongguo) - libuvc를 기반으로 Android에서 UVC 카메라 제어 및 스트리밍을 지원하는 라이브러리다.
마지막 커밋 2024.09
플러터 패키지의 경우
주로 네이티브(Android/iOS) 라이브러리를 래핑한 뒤, MethodChannel로 사용하는 패턴이 많다.
현재 UVC 플러터 패키지들도 UVCCamera 또는 AndroidUSBCamera를 기반으로 구현되어 있다.
UVCCamera, AndroidUSBCamera 관련 샘플들을 실행해 본 결과 전반적으로 매끄럽지 않았다.
Flutter UVC 패키지 개발 검토
Flutter에서 C/C++을 사용하는 패키지를 구현하는 방법은 몇 가지가 있다.
- JNI를 통해 Android에서 libuvc를 사용하는 방법 (MethodChannel)
- 1번 방식으로 만들어진 라이브러리를 래핑하여 사용하는 방법 (MethodChannel)
- Dart FFI를 통해 Flutter에서 libuvc를 직접 사용하는 방법 (FFI)
1,2번의 경우 앞선 검토에서 사용성이 좋지 않았다.
3번 방식을 검토해 보면
- libuvc는 저장소 규모가 약 1~2MB 수준으로 크지 않고 파일 수도 많지 않다.
- 같이 빌드해야 할 C 라이브러리(.so)는 libusb 와 libjpeg-turbo 이고,
둘 다 빌드 관련 설정들이 관리되고 있다. (빌드될 확률↑)
또한 Dart FFI를 통해 C/C++ 네이티브 레이어를 연동하는 구조에 익숙하며, mediapipe_face_mesh 패키지를 개발한 경험도 있다.
2026.01.01 - [MediaPipe Face Mesh] Flutter 패키지 개발
전반적으로 가능성이 충분하다고 판단해 개발을 진행했다.
flutter_ffi_uvc
https://pub.dev/packages/flutter_ffi_uvc
flutter_ffi_uvc | Flutter package
Flutter FFI plugin for Android UVC cameras built on vendored libuvc.
pub.dev
중간 라이브러리 없이 libuvc를 직접 연동한 FFI 패키지로, UVC 카메라 연결과 제어, 스트리밍 및 프리뷰를 지원한다.
libuvc는 iOS를 지원하지 않으며, flutter_ffi_uvc 역시 동일하다.
libuvc에는 uvc_get_device_list(), uvc_open()과 같은 디바이스 조회·연결 함수가 있지만,
Android 기기 권한과 시스템 제약으로 인해 libusb 레벨의 디바이스 탐색에 한계가 있다.
그래서 디바이스 조회와 USB 권한 획득/연결은 Android USB Host API에서 처리하고,
실제 USB 통신과 UVC 제어/스트리밍은 libusb + libuvc 기반의 C 네이티브 레이어에서 수행한다.



'mobile > SDKs & Plugins' 카테고리의 다른 글
| [mediapipe_face_mesh] Face mesh Detection Flutter Package 개발 (0) | 2026.01.01 |
|---|