문제

  • 동영상 코덱이 제각각.
  • 사용자의 네트워크 속도는 제한적임. (특히 모바일)
  • 사용자들의 기기에 있는 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 을 수행해야 하더라.
  • memcahe 를 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/