출처: http://daoudev.tistory.com/28 다우기술SW 공식 블로그
iOS 또는 안드로이드 기반의 모바일 기기에서 지원하는 동영상 파일 포맷, 재생 방법과 동영상을 재생하기 위해 필요한 기술에 대해서 살펴보도록 하겠습니다.
1. 지원 파일
안드로이드 공식 지원 파일 포맷
코덱 | 확장자 | 비고 |
H.263 | 3gp, mp4 | |
H.264 AVC | 3gp, mp4, ts | 인코딩은 허니컴부터 지원 ts 형식 또한 허니컴부터 지원 |
MPEG-4 SP | 3gp | |
VP8 | webm, mkv | 2.3.3 부터 지원 스트리밍 형태는 ICS 부터 가능 |
아이폰 공식 지원 파일 포맷
코덱 | 확장자 | 비고 |
H.264 | m4v, mp4, mov, 3gp | 640 * 480, 30fps, 1.5Mbps 320 * 240, 30fps, 768Kbps |
MPEG-4 | m4v, mp4, mov, 3gp | 640 * 480, 30fps, 2.5Mbps |
화질 | 비디오 | 오디오 |
Low | 96Kbps | 64Kbps |
Medium | 256Kbps | 64Kbps |
High | 800Kbps | 64Kbps |
3. FFMpeg 소개
FFMpeg는 인코딩2/먹싱3/트랜스코딩/디먹싱4/디코딩5/스트림/재생 등 멀티미디어 관련한 거의 모든기능을 갖추고 있는 오픈 소스 멀티 미디어 프레임워크입니다. 크로스 플랫폼(Cross Platform)을 지원하고 GNU Lesser General Public License (LGPL) 라이선스에 의해 배포됩니다.
FFMpeg는 간단한 동영상 출력 프로그램인 ffplay도 제공합니다.
FFMpeg Library
libavcodec: 오디오/비디오의 인코더/디코더
- libavformat: 오디오/비디어 컨테이너 포맷의 muxer/demuxer
- libavutil: FFmpeg 개발 시 필요한 다양한 유틸리티
- libpostproc: video post-processing
- libswscale: 비디오의 image scaling, color-space, pixel-format 변환
- libavfilter: 인코더와 디코더 사이에서 오디오/비디오를 변경하고 검사
- libswresample: 오디오 리샘플링(audio resampling)
일반적인 컨버팅 절차
FFMpeg 동영상 컨버팅 과정
출처: http://helloworld.naver.com/helloworld/8794
1) libavformat 을 통해 비디어코덱과 오디오 코덱의 정보를 추출
2) libavcodec 을 통해 비디오/오디오 데이터를 디코딩
3) PC, 모바일에서 동일하게 적용되는 방법이며 위에서 추출한 데이터를 기반으로 파일로 저장/재생/편집
동영상 플레이어 구현 방법
출처: http://helloworld.naver.com/helloworld/8794
1) 컨버팅 과정에서 받은 정보를 큐에 저장
2) 큐에 저장된 정보를 SDL6을 통해서 지속적으로 렌더링하여 재생
- 영상: 비디오 Refresher가 프레임 갱신을 요청/처리하여 비디오 Renderer를 통해서 화면에 출력
- 오디오: 오디오 Renderer를 통해 오디오 정보를 재생
4. 구현 방법 시나리오
A. 서버에서 변환하는 경우
A-1) 컨텐츠 제공자가 파일을 등록할 때 변환
- 파일이 업로드 되면 서버에서 자동으로 파일을 변환하여 저장하는 방식
- FFmpeg 에서 제공하는 변환 기능을 통해 업로드 된 파일을 변환 저장 가능
- 유튜브, 네이버, 네이트 등 동영상 스트리밍 서비스에서 주로 사용되는 방식
A-2) 컨텐츠 제공자가 파일 스트리밍 요청할 때 변환
- 스트리밍 요청이 왔을 때 서버에서 실시간으로 변환하며 스트리밍
- 네이버 N드라이브가 모바일에서 동영상 전송시 사용되는 방식
- 대다수의 RTSP, HLS 기능을 포함한 서버 툴이 이러한 방식을 사용
A-3) 컨텐츠 제공자가 규약된 포맷으로 변환 후 업로드
- 컨텐츠 제공자가 규약된 포맷으로 변환하여 서버에 업로드
- 개인 사용자가 사용 가능한 다양한 변환 툴7이 있음.
- 개인용 서버에서 주로 사용되는 방식
B. 모바일에서 변환하는 경우
B-1) 변환 후 내장 플레이어로 플레이 가능한 파일로 저장
- 전달받은 영상 정보를 파일로 변환하여 저장 후 재생하는 방식
- FFmpeg 에 내장된 기능으로 특정 포맷으로 파일 변환/저장이 가능
- 일반 듀얼코어 PC 에서 800M 영상을 변환시 12분 소요
- 이보다 성능이 낮은 모바일 기기에서 구현시 배터리와 성능에 있어서 많은 문제가 있을것으로 예상됨.
B-2) 변환 후 내장 플레이어로 데이터 전달
- 내장 플레이어에 접근 가능한 모듈을 통해 변환 정보를 전송하는 방식
- 모바일 내장 플레이어에 대한 플러그인이 공식적으로 지원되지 않음.
- 별도의 제조사별 협의가 필요하며 다양한 기기에 대한 지원 대책이 필요함.
B-3) 변환 기능이 포함된 플레이어를 통해 플레이
- 전달 받은 영상 정보를 변환 모듈을 추가한 플레이어를 통해 재생하는 방식
- 가장 일반적인 방법으로 FFmpeg 를 활용한 다양한 플레이어가 있음.
- NHN 의 N드라이브 내장 플레이어 (안드로이드, iOS), AVPlayer (iOS) 가 개발 소스를 공개함.8
- HTTP Live Streaming 애플에서 2009년 iOS 3.0 발표 때 내놓은 프로토콜로 스트리밍 데이터를 MPEG-2 TS에 담아 시간단위로 쪼개서 보냅니다. Adobe사는 Flash Media Server 4.0에서, MicroSoft에서는 IIS Media Server 4.0 에서부터 정식 지원했으며 안드로이드는 3.0에서부터 지원합니다. [본문으로]
- 인코딩 (Encoding): 영상 데이터를 특정 동영상 코덱으로 변환하는 것 [본문으로]
- 먹싱 (Muxing): 변환한 데이터를 Digital Container Format 파일에 담는 것 [본문으로]
- 디먹싱 (Demuxing): 먹싱과 반대 개념으로 동영상 파일로 부터 비트 스트림 데이터를 추출하는 것[본문으로]
- 디코딩 (Decoding): 특정 코덱의 데이터로부터 영상 데이터를 추출하는 것 [본문으로]
- SDL(Simple Directmedia Layer) : 비디오, 오디오, 사용자 입력 등의 계층을 추상화하여, 리눅스, 마이크로소프트 윈도, 맥 OS X 등 여러 운영 체제에서 실행이 가능하도록 한 크로스플랫폼 멀티미디어 라이브러리 [본문으로]
- 이러한 프로그램을 인코더(Encoder)라고 부른다. 특정 포맷의 동영상을 다른 포맷의 영상파일로 바꿔주는 기능을 수행한다. 국내에서 대중적으로 사용되는 프로그램은 다음의 팟 인코더이며 FFmpeg 를 활용하여 개발되었다. 라이센스는 개인/기업/공공/교육 등에 제한이 없다. [본문으로]
- 안드로이드 소스: http://helloworld.naver.com/helloworld/8794, N드라이브에 내장된 플레이어의 개발 과정 및 샘플 프로젝트가 공개됨. iOS 소스: http://luuvish.org/206, 엔터테이먼트 부문 2위 ( 플레이어 1위) 인 AVPlayer 소스가 공개됨. [본문으로]