DJI 드론의 실시간 영상을 OBS Studio로 보내기
이번 학기에 수강하는 실시간방송시스템구축과활용 과목에서 유튜브 라이브를 하는 과제가 나왔다. 1분 이내로 라이브를 하고 나서 그 링크를 제출하는 것이고, 수업에서 배운 소프트웨어를 사용해서 간단한 효과를 주면 되므로 기술적으로는 매우 쉽다. 간단하게 라이브를 한번 해보는 계기를 만들어 줌으로써 이후에 실제로 시청자 앞에서 라이브를 하는 것의 부담을 덜어주는 데 의미가 있는 것 같다.
드론을 이용해서 라이브를 할 수 있지 않을까 하는 아이디어가 떠올라서 갖고 있던 DJI Neo를 사용하려고 하니, 과제 요건에 OBS Studio를 사용하게 되어 있어서 DJI Neo에서 송출하는 라이브 스트림을 어떻게 OBS로 전달할지가 문제였다. Grok한테 시켜서 알아낸 방법은 다음과 같이 다소 복잡하다.
### DJI Neo 실시간 스트림을 OBS Studio로 보내는 가장 쉽고 안정적인 방법
DJI Neo는 DJI Fly 앱을 통해 RTMP(Real-Time Messaging Protocol) 프로토콜을 지원하여 실시간 비디오 스트림을 외부 소프트웨어로 전송할 수 있습니다. 이는 무선으로 스마트폰(안드로이드/iOS)을 통해 드론 영상을 PC의 OBS Studio로 보내는 데 적합하며, 캡처 카드나 HDMI 연결 없이도 가능합니다. 가장 쉽고 안정적인 방법은 **로컬 RTMP 서버(NGINX 기반)를 설정하고 DJI Fly 앱에서 스트림을 푸시한 후 OBS에서 해당 스트림을 소스로 추가하는 방식**입니다. 이 방법은 지연이 적고(로컬 네트워크 사용), 무료 오픈소스 도구로 구현 가능하며, 사용자 커뮤니티(예: OBS 포럼, Reddit)에서 DJI Avata 2나 Neo 같은 O4 전송 시스템 드론에 자주 추천됩니다.
다른 방법(예: 클라우드 서비스 사용)은 추가 비용이 들거나 지연이 발생할 수 있지만, 로컬 RTMP는 네트워크가 안정적일 때 가장 신뢰성 높습니다. 아래에 단계별 가이드를 설명하겠습니다. (Windows 11 기준, 다른 OS도 유사)
#### 준비물
- DJI Neo 드론과 DJI Fly 앱이 설치된 스마트폰(안드로이드 추천, iOS도 가능).
- PC에 OBS Studio 설치 (무료: obsproject.com).
- 같은 Wi-Fi 네트워크 (5GHz 추천, 지연 최소화).
- NGINX RTMP 서버: GitHub에서 미리 설정된 도구 사용 (쉬운 설치).
#### 단계별 설정
1. **로컬 RTMP 서버 설치 (NGINX Gryphon 또는 Drone Tools 사용)**:
- GitHub에서 [TheQuib/dji-obs-stream](https://github.com/TheQuib/dji-obs-stream) 또는 [NGBen1/drone-tools](https://github.com/NGBen1/drone-tools) 다운로드.
- **쉬운 선택: drone-tools (Docker 기반)** – Docker가 설치되어 있으면 한 번에 실행.
- Docker 설치 (docker.com).
- GitHub 지시 따라 명령어 실행: `docker run -d -p 1935:1935 --name rtmp-server ngben1/drone-rtmp`.
- **Windows 직접 설치: dji-obs-stream** – ZIP 다운로드 후 `nginx.exe` 실행.
- 서버가 실행되면 RTMP URL: `rtmp://localhost:1935/live` (스트림 키: `stream` 또는 임의 설정, 예: `mystream`).
- 포트 1935가 열려 있는지 확인 (방화벽 허용). 서버 콘솔에서 스트림 수신 로그 확인 가능.
2. **DJI Fly 앱에서 스트림 설정**:
- 앱 열고 DJI Neo 연결 (드론 비행 준비).
- 카메라 뷰에서 오른쪽 상단 **전송(Transmit)** 아이콘 클릭 > **라이브 스트림(Live Stream)** 선택.
- **커스텀 RTMP** 모드 선택.
- 서버 URL 입력: `rtmp://[PC IP 주소]:1935/live` (PC IP는 명령 프롬프트에서 `ipconfig`로 확인, 예: `rtmp://192.168.1.100:1935/live`).
- 스트림 키 입력: `mystream` (서버 설정과 맞춤).
- 해상도: 1080p/30fps 추천 (안정성 위해 720p부터 테스트).
- **시작** 클릭 – 앱에서 드론 영상이 RTMP 서버로 푸시됩니다.
3. **OBS Studio에서 스트림 추가 및 사용**:
- OBS 열고 **소스(Source)** > **+** > **미디어 소스(Media Source)** 추가.
- 입력: **입력 URL**에 `rtmp://localhost:1935/live/mystream` 입력 (로컬이니 PC IP 대신 localhost 사용).
- **확인** 클릭 – 드론 영상이 즉시 미리보기에서 나타납니다.
- 장면에 추가하고, 필요 시 필터(크롭, 오버레이) 적용.
- 스트리밍 시작: OBS에서 YouTube/Twitch 등으로 방송.
#### 안정성 팁
- **네트워크**: PC와 스마트폰을 같은 Wi-Fi 라우터에 연결 (모바일 핫스팟 피함, 지연 증가). 유선 이더넷으로 PC 연결 시 더 안정.
- **테스트**: 짧은 비행으로 지연(1-2초)과 프레임 드랍 확인. O4 시스템(Neo)은 1080p/60fps 지원하지만, 안정 위해 30fps 사용.
- **문제 해결**:
- 연결 안 됨: PC IP 재확인, 포트 포워딩 (라우터에서 1935 허용).
- 지연/끊김: Wi-Fi 신호 강화 또는 앱 재시작. OBS에서 "비디오 버퍼링" 비활성화.
- iOS: USB로 스마트폰을 PC에 연결해 "화면 미러링"으로 대체 가능하지만, RTMP만큼 안정적이지 않음.
- **대안 (더 쉽지만 덜 안정적)**: 클라우드 RTMP 서비스(예: StreamVoodoo 또는 SuperStreamSystem) 사용 – 앱에서 클라우드 URL 입력 후 OBS에서 클라우드 스트림 pull. 무료 티어 있지만, 인터넷 의존으로 지연 3-5초 발생.
이 방법은 OBS 포럼과 Reddit 사용자들이 DJI Neo/Avata 2에 검증된 것으로, 설치 10-15분 만에 완료됩니다. 추가 질문 있으시면 말씀해주세요!
NGINX를 설치하거나 Docker를 사용해야 한다는 것이 너무 복잡하게 느껴져서, 아예 전용 RTMP 서버를 새로 만들어버리는 게 낫겠다는 생각이 들었다.
개발 언어는 전부터 기회를 보고 있던 Rust를 채택했다. 나는 Rust 책을 두 권인가 교정했지만 실제로 코드를 작성한 경험이 없다. 그래도 Claude와 ChatGPT한테 코딩을 맡겨서 어렵지 않게 만들어 낼 수 있었다. LLM이 알고 있는 패키지 사용법이 최신 버전에서 바뀐 것이 많아서 자잘한 오류가 많이 나서 공식 문서와 소스코드를 찾아보면서 오류를 잡았고, 처음에 ffmpeg와 ffplay로 테스트하고 나서 OBS Studio와 DJI Fly로 바꿔 가면서 최적화했다.
https://github.com/ychoi-kr/neo-rtmp-server
그렇게 개발한 RTMP 서버를 이용해 라이브 방송을 하고, 링크를 과제로 제출했다.
https://www.youtube.com/live/lC3U1t0mzxs
유튜브 섬네일이 있으면 좋겠다 싶어서 ChatGPT한테 시켰더니 예쁘게 잘 그려주어서 그대로 사용했다.

올해에 새로 만든 채널(https://www.youtube.com/@ychoi_scu)은 라이브를 할 권한을 얻기 위한 전화 인증에 실패해서, 위 라이브는 구 채널(https://www.youtube.com/@yc_scu)에서 진행했다. 학업 관련 유튜브 채널이 두 개인 이유는, 학교를 졸업하면 학교를 통해 만든 GMail 계정이 삭제되기 때문에 유튜브 채널이 사라지거나 원활한 운영이 힘들 것으로 예상되어 새로 만든 것이다. 학업 관련 티스토리 블로그가 두 개 있는 것과 같은 이유다.
이 프로젝트를 하면서 새로운 걸 많이 배웠다.
- OBS Studio로 YouTube 라이브를 하는 방법
- DJI Fly에서 라이브 스트림을 RTMP로 송출하는 방법
- Rust 네트워크 프로그래밍
- RTMP 프로토콜
- ffplay와 ffmpeg를 RTMP 클라이언트로 사용하기
- 드론의 Position Hold 모드와 Attitude(ATTI) 모드