문제는 이렇습니다. 동영상 코덱이 제각각인데, 다행히 모바일의 인코딩 표준은 “H.264/MPEG-4 AVC” 입니다. 사용자의 네트워크 속도는 제한적이고, 특히 모바일에서는 더 그렇습니다. 사용자들의 기기에 있는 CPU, 메모리 등도 다 다릅니다. 특히 아이폰3GS는 오직 “H.264/MPEG-4 AVC” 만 지원합니다.

해결책은 디코드 후 다시 인코딩하는 것입니다. resolution 과 bit rate 를 낮추고 표준 코덱으로 변경한 뒤, HTTP Live Streaming 으로 스트리밍합니다. https://developer.apple.com/streaming/

주목할 만한 점이 몇 가지 있습니다. cc2.8xlarge 인스턴스에서 병렬로 코딩 변환을 처리합니다. 그들의 경험상 up to a dozen transcoding job 을 수행해야 했다고 합니다. memcache 를 job 을 분산시키는 데 쓰고 있는데, job 의 프로세스를 추적하고, 머신의 load 를 보고하며, 그 load 정보를 로드 밸런싱에 이용합니다. 멤캐시로 로드 밸런싱을 한다는 것이 머리에 딱히 구조가 떠오르지는 않습니다. 앞단의 LB는 cc1.xlarge 인스턴스에 nginx, haproxy 로 구성했습니다. 디코드와 인코드에는 많은 포맷을 지원하는 ffmpeg 를 썼습니다.

ffmpeg looks something like the following:

ffmpeg -i pipe:0 -dn -vcodec libx264 -vsync 1 -pix_fmt yuv420p -ac 2 
  -profile:v baseline -level 30 -x264opts bitrate=:vbv-maxrate= 
  -rc-lookahead 0 -r -g -refs 1 -acodec libfaac -async 1 
  -ar 44100 -ab 64k -f mpegts -s -muxdelay 0 pipe:1

https://tech.dropbox.com/2014/02/video-processing-at-dropbox/