12월 252013
 

필자는 인디밴드 들을 위한 온라인 공연 서비스인 인디크라우드 서비스를 만들었다. 이 서비스를 만들면서 팀원들과 여러가지 미디어 서버들을 고려해본 결과 당시에 가지고 있던 자금 등의 상황을 견주어 봤을 때 제일 적절한 솔루션이 Wowza Media Server라는 결론을 얻었었다. 우리는 실제로 서버를 구입하여 직접 테스트를 해보고 실제 공연을 해본 결과 문제 없이 잘 동작하는 것을 확인할 수 있었다. 하지만 문제는 실시간 공연이라는 점이였다. 지금부터 실시간 스트리밍 서비스를 만들기 위해서 어떤 고려사항이 있는지 알아보도록 한다.

실시간 방송(생방송)을 송출하고 PC, 스마트폰 할 것 없이 모든 디바이스에서 볼 수 있게 하기 위해서는 크게 두 가지 기술이 모든 디바이스에서 지원을 해야한다.

  1. 코덱1
    코덱

    코덱(Codec, Coder-Decoder)은 영상이나 음성을 일정한 형식에 맞게 변환하는 기술을 말한다. 동영상 서버, 방송 송출 장비, 방송 수신 장비 들이 모두 코덱을 지원할 수 있어야만 한다. 예를 들어서 영상 코덱에 H.263이라는 것이 있는데 방송 송출 장비와 방송 수신 장비는 지원하지만 수신장비(Ex:스마트폰)에서 지원을 하지 않으면 영상을 볼 수가 없게 된다. 또는 방송 송출 장비에서 H.263을 지원안하는데 다른 두 부분에서 지원을 한다면 이 또한 변환이 불가능하기 때문에 방송 송출이 불가능해 진다. 이렇게 코덱은 세 가지 부분에서 다 지원이 되는 것을 해야한다. 만약 안된다면 직접 구현하여 탑제해야 하는데 라이브러리가 없다면 최악의 경우 코덱을 구현해야할 수도 있다. 회사의 경우 코드 공개가 힘든 경우가 많은데 오픈 소스를 쓰기 어려워지기 때문에 비용이 증가한다. 그리고 경우에 따라서 사용자가 스마트폰 앱을 설치하거나 PC용 프로그램을 설치해야하는 부가 비용이 발생 할 수 있다. 그리고 코덱을 선택할 때 주의할 점은 코덱 자체(Ex: 특허비, 라이센스 비용)등이 발생할 수 있다

  2. 실시간 스트리밍 프로토콜2

    프로토콜

    실시간 스트리밍 프로토콜은 영상이나 음성을 인터넷을 통해 전송하기 위한 규약을 말한다. 스트리밍 프로토콜도 코덱과 마찬가지로 각각 시스템에서 지원이 되어야 한다. 예를들면 RTMP프로토콜의 경우 서버에서 지원을 하더라도 사용자가 보게 될 디바이스(스마트폰)에서 지원을 하지 않는다면 볼 수가 없다. 이도 코덱과 마찬가지 문제가 있다. 프로토콜을 사용하기 위한 라이센스 비용은 보통 없다. 하지만 지원하지 않는 장치에 대해서는 프로토콜을 따로 구현하고 앱을 설치 해야한다는 문제가 있다.

코덱과 프로토콜

방송 송출 디바이스부터 방송 수신 디바이스까지 영상/소리 데이터 흐름

위의 그림은 방송 송출 디바이스, 서버, 방송 수신 디바이스에서 고려해야할 것들을 항목별로 나누어 본 것이다.

동영상을 송출하는 측에서는 인코더(코덱)과 스트리밍 프로토콜이 필요하다. 실시간으로 획득한 영상과 소리 데이터는 인코더를 통하여 압축된다. 그리고 이 압축된 내용은 서버와 미리 약속한 프로토콜을 통하여 전송하게 된다.

서버의 디코더/인코더는 필요할 수도 있고 필요 없을 수도 있다. 만약 동영상을 수신하는 측에서 송출할 때 사용된 코덱이 지원하지 않는다면 지원하는 코덱으로 다시 인코딩을 하여야 한다. 이러한 역할을 하는 것을 트랜스코더(Transcoder)라고 부른다. 만약 필요가 없을 경우 바로 동영상을 수신하는 측으로 영상/소리 데이터를 클라이언트와 미리 약속된 프로토콜로 전달하게 된다.

클라이언트는 지원하는 프로토콜을 이용하여 압축된 영상/소리 데이터를 수신한다. 그리고 받은 데이터를 디코딩(압축을 품)하여 영상을 출력하고 소리를 재생하게 된다.

위의 그림을 통해서 우리가 선택한 Wowza Media Server에 어떤 장단점이 있는지 알아볼 것이다.

다음 포스팅에는 장치, OS, 라이브러리 별로 가능한 스트리밍 프로토콜과 코덱에 대해서 이야기를 해보고 Wowza Media Server에서 라이브 스트리밍을 할 때 어떤 문제와 어려움이 있는지에 대해서 설명해 보도록 하겠다.

  1. 위키백과- 코덱(Codec) , http://ko.wikipedia.org/wiki/코덱
  2. 위키백과 – 실시간 스트리밍 프로토콜, http://ko.wikipedia.org/wiki/실시간_스트리밍_프로토콜
5월 212013
 

인터넷 영상 스트리밍 클라이언트를 웹에서 구현하기 위해서는 여러 가지 방법을 이용할 수 있다. 그 중에서 Flash를 이용하여 많이 구현을 한다. 그 이유는 대부분의 브라우져에서 Flash를 지원하며, 빠른 구현이 가능하고, 영상 스트리밍과 관련된 많은 기능을 지원하기 때문이다. Flash에서 스트리밍을 위해 많이 사용하는 프로토콜은 RTMP라고 하는 것이 있다. RTMP는 Macromedia에서 영상 스트리밍 전송을 위해 만든 기술로써 이를 지원하는 서버가 많이 존재한다.

Flash는 보안과 관련하여 많은 고민을 하여 만들어 졌는데, 이 중 하나가 RTMP에서 들어온 음성 스트림에 대한 샘플 데이터에 대한 보안이다. 샘플 데이터는 SoundMixer라는 클래스의 computeSpectrum()이라는 함수[1]를 이용하여 알아낼 수 있다. 서버에서 허가를 하지 않으면 RTMP에서 들어온 음성 스트림 샘플을 이용할 수 없게 된다.  소리가 나오는데 computeSpectrum()의 결과값이 ‘0’으로만 채워져서 리턴되는 것이다.  이 포스팅에서는 이를 WowzaMediaServer에서 어떻게 해결하는지를 알아 본다.

방법은 간단하다. WowzaMediaServer 설치 디렉토리 밑의 conf 디렉토리에서 설정을 바꾸고 싶은 어플리케이션(Application)의 Application.xml 파일을 변경하면 된다. Root->Application->Client->Access->StreamAudioSampleAccess 설정에 *를 표시하면 이 문제가 해결된다 [2]. 이 문제는 crossdomain.xml[3]과 관련된 문제와는 별게의 것으로 알려져 있다.

<Client>
     <IdleFrequency>-1</IdleFrequency>
     <Access>
          <StreamReadAccess>*</StreamReadAccess>
          <StreamWriteAccess>*</StreamWriteAccess>
          <StreamAudioSampleAccess>*</StreamAudioSampleAccess>  <!-- 이부분 수정 -->
          <StreamVideoSampleAccess></StreamVideoSampleAccess>
          <SharedObjectReadAccess>*</SharedObjectReadAccess>
          <SharedObjectWriteAccess>*</SharedObjectWriteAccess>
     </Access>
</Client>

참고 자료

[1] SoundMixer 클래스(2013-05-21 02:02 KST에 확인),  http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundMixer.html

[2] Example of how to use ComputeSpectrum with Wowza Media Server(2013-05-21 02:23 KST에 확인), http://www.wowza.com/forums/content.php?56-Example-of-how-to-use-ComputeSpectrum-with-Wowza-Media-Server

[3] Cross-domain policy for Flash movies(2013-05-21 02:23 KST에 확인),  http://kb2.adobe.com/cps/142/tn_14213.html