본문 바로가기
iOS/Frameworks

ReplayKit을 활용한 LIVE Broadcast 삽질 일기

by Mildwhale 2017. 3. 3.

개요

iOS 10부터 ReplayKit을 이용하여, LIVE Broadcast를 할 수 있게 되었습니다.

Xcode 8.0, Swift 3 환경에서 개발하였고, Youtube를 스트리밍 서버로 이용할 예정입니다.


(ReplayKit을 이용한 Broadcast의 기본 개념 및 구조는 WWDC  참고해주세요)


준비물

  • lf.swift Framework
    • 미디어 데이터를 스트리밍 서버로 전달할 수 있는 오픈소스입니다.
  • 실시간 스트리밍이 가능한 Youtube(Google) 계정이 필요합니다.


Broadcast Extension

내 앱(게임)에서 ReplayKit을 적용하는 것은 매우 간단합니다.

하지만, 스트리밍 서버와 앱의 중간 역할을 하는 Extension 영역의 구현이 매우 어려웠습니다.


Extension은 2개로 구성되어있습니다.

  1. Broadcast UI Extension
    • Broadcast에 필요한 정보를 설정합니다. 스트리밍 서비스[각주:1]에서 제공하는 URL과, Stream Key를 가져올 수 있습니다.
    • Youtube나 Facebook의 LIVE API를 호출하여 해당 정보를 받아올 수 있습니다.
  2. Broadcast Upload Extension
    • UI Extension에서 설정한 URL과 Stream Key를 이용하여 Audio, Video 데이터를 서버로 전송합니다.Broadcast Upload 


Extension을 프로젝트에 추가하면, MovieClipHandler, SampleHandler 클래스가 자동으로 추가됩니다.

MovieClipHandler는 MP4 형태의 동영상 파일을 처리할 수 있고, SampleHandler는 Audio, Video 샘플 데이터[각주:2]를 처리할 수 있습니다. 

이 포스트에서는 SampleHandler를 활용합니다. 


프로젝트 설정

Broadcast Upload, UI Extension 추가 후, 몇가지 설정이 필요합니다.

  1. BroadcastExtension의 info.plist를 열고, NSExtension 항목을 확인합니다.
  2. RPBroadcastProcessMode를 'RPBroadcastProcessModeSampleBuffer'로 변경합니다.
  3. NSExtensionPrincipalClass를 '$(PRODUCT_MODULE_NAME).SampleHandler'로 변경합니다.

동영상 업로드

가장 오랜시간을 삽질했던 부분입니다.


처음에는 MP4 동영상 파일을 서버에 업로드하고, ffmpeg를 이용하여 서버에서 동영상을 스트리밍하도록 계획했지만, 분할되어있는 영상을 실시간으로 처리할 방법을 찾지못해 계획으로 끝났습니다.


다음으로 생각한 방법은, 단말에서 직접 스트리밍 서버로 업로드를 하는 방법이었습니다. Youtube에서 rtmp 프로토콜을 지원하고 있기에, iOS 단말에서 rtmp 프로토콜을 이용할 수 있는 방법을 찾아보았고, lf.swift 오픈 소스를 찾게되었습니다.

(RTMP 스트림 업로드를 직접 구현할 수 있다면, 이 부분을 건너뛰셔도 됩니다.)


친절하게도, Broadcast예제 코드까지 제공하고 있습니다.

 lf.swift 의 Example/iOS/Screencast를 참고하여, SampleHandler 소스를 작성합니다. (그대로 복사, 붙여넣기를 해도 됩니다.)

소스코드 작성이 완료되면, 이 프로젝트 앱을 테스트할 단말에 설치합니다.



테스트

테스트에는 ReplayKit으로 Boradcast가 구현된 게임이 필요합니다. 여기에서는 '아스팔트 8'을 이용하여 테스트를 진행합니다.


Youtube로 영상을 업로드하기 위해서는, Youtube에서 제공하는 서버 URL과 Stream Key가 필요합니다.

Youtube 실시간 대시보드에서 확인할 수 있습니다.


게임을 실행하고, Broadcast 버튼을 누르면, Broadcast Extension이 구현된 앱이 목록에 노출됩니다. 이 목록에서 위에서 설치했던 앱을 선택합니다.


서버 URL과 Stream Key(Name)을 입력하고, Start를 누릅니다.


Start 버튼을 누르고 조금 기다리면, Youtube 실시간 스트리밍이 시작됩니다.


마무리

개인용 스트리밍 서버를 구축하고 싶다면 nginx를 이용하여 rtmp 서버를 손쉽게 구축할 수 있습니다.

https://github.com/arut/nginx-rtmp-module 링크를 참고해주세요.


ReplayKit과 Broadcast 관련 정보는 구글링으로도 찾기가 매우 어려웠고, 영상을 처리 관련 지식이 없는 상태에서 진행했기 때문에, 이 정보들을 수집하고 정리하는데 상당한 시간이 소요되었습니다.


오픈 소스에 구현된 예제를 활용하는 것이 전부이지만, 처음부터 삽질하는 시행착오를 줄이고자 이 포스트를 작성하였습니다.



  1. Youtube, Facebook, Twitch 등 개인 방송을 지원하는 서비스 [본문으로]
  2. 1프레임으로 추정 (아시는분이 있으면 알려주세요.) [본문으로]