본문 바로가기

삽질/FFMpeg & GStreamer

[FFMpeg] FFMPEG란?

  •  크로스 플랫폼을 지원하는 오픈소스 멀티미디어 프레임워크

  • 리눅스, 윈도우, 맥을 모두 지원

  • ffmpeg를 사용해서 동영상 파일의 재생이나 인코딩 툴 등을 개발 할 수도 있다.
    (예: 다음팟플레이어, 곰플레이어, km플레이어 등 모두 ffmpeg 기반에서 개발 되었다.)

  • 하지만 ffmpeg 소스 코드를 이해하고 사용하는데는 오랜 시간이 걸릴 것같다. (영상처리에 대한 기본 지식이 전혀 없어서)

    그리고 이게 버전마다 사용되는 함수 이름이랑 변수명이 조금씩 다르다.

    따라서 누군가 2.2.1 버전에서 개발했고 나는 2.8.1 버전을 사용한다면 어떤 함수가 이름이 바뀌었고 지원되지 않는 변수들을 

    어떻게 처리 할 것인지 고민해야 할 것이다. 몸으로 겪어보지 않으면 이 번거로움을 잘 모른다.

    ffmpeg 소스를 다운받으면 예제 파일도 같이 있으니 실행시켜보면 분명히 빨간 줄(에러)이 뜰 것이다.

    ??? ........ ㅡㅡ

  • 굳이 소스 코드를 사용하지 않더라도 ffmpeg 실행 파일로 왠만한 인코딩이나 동영상 재생같은 것은 가능하다.

  • 공식 홈페이지
    https://www.ffmpeg.org/
    이곳에서 ffmpeg 소스 코드와 실행 파일을 다운로드 할 수 있다.

 

 

 

FFMPEG는 디코딩, 인코딩, 트랜스코딩, mux, demux, stream, filter 그리고 오디오와 비디오를 스트리밍 할 수 있는 크로스 플랫폼 솔루션이다. 또한 Libavcodec 라이브러리(Audio/Video 코덱)을 포함하고 있다. FFmpeg은 라이브러리 규모가 큰 편인 데다가 사용되는 외부 라이브러리도 많아서 개발환경을 구성하기가 쉽지 않다. 하지만 FFmpeg 자체가 모든 영상의 디코딩 및 인코딩을 지원하기 때문에 추가적인 코덱 설치가 필요없다. 그리고 멀티 코어를 지원하기 때문에 따로 옵션을 주지 않아도 모든 코어를 사용하여 작업을 수행하기 때문에 처리 속도가 빠르다. 

 

FFMPEG에서 제공하는 것들은 다음과 같다. 

  • ffmpeg - 미디어 포맷 변환 도구
  • ffserver - 라이브 방송을 하는 멀티미디어 스트리밍 서버
  • libavcodec - 오디오/비디오 코덱 라이브러리
  • libavformat - 멀티미디어 컨테이너의 디먹서/먹서 라이브러리
  • libavdevice - 입출력 장치 제어 라이브러리
  • libavfilter - 미디어 필터 라이브러리
  • libswscale - 이미지 처리 라이브러리
  • libswresample - 오디오 처리 라이브러리
 
 
FFmpeg 구조
 
FFmpeg은 컨테이너와 스트림, 코덱을 관리하기 위해 [그림 3-1]과 같이 각각의 컨텍스트라는 구조체로 관리한다.
 
 
 
AVFormatContext 
AVFormatContext는 파일로부터 읽은 컨테이너의 내용을 저장하거나 새로 생 성한 컨테이너를 파일에 쓰기 위한 용도로 사용합니다. AVFormatContext 안 에는 상당히 많은 변수가 들어 있는데 읽은 파일에서 사용하는 변수와 파일을 쓰 기 위해 사용하는 변수가 같은 컨텍스트 안에 있기 때문입니다. 
 
AVStream
AVFormatContext 내부에는 적어도 하나 이상의 스트림이 있습니다. 허용 가능한 최대 스트림 개수는 컨테이너의 종류에 따라 다르며, 이 스트림 정보는 AVStream 컨텍스트 안에 있습니다. AVStream 컨텍스트에서는 시간과 관련된 정보를 가져올 수 있습니다. 가장 많이 사용하는 정보로는 프레임 레이트와 타임 베이스Timebase가 있습니다. 
 
NOTE 
타임베이스는 컨테이너가 영상을 재생할 때 사용하는 시간 단위로, FFmpeg에서는 타임베이스를 변환하는 과정이 두 군데 있습니다. 첫 번째는 파일을 읽은 직후입니다. 원본 컨테이너에서 사용하는 타임베이스를 FFmpeg에서 사용 하는 타임베이스로 변경하여 변환 작업에 유용하게 사용하기 위해서입니다. 두 번째는 인코딩 이후 파일을 쓰기 전입니다. FFmpeg에서 사용하는 타임베이스를 컨테이너에서 사용하는 타임베이스로 변환해야 컨테이너에서 정상적인 재생이 가능하기 때문입니다. 
 
AVCodecContext 
AVStream 안에는 코덱과 관련된 정보를 가진 AVCodecContext가 있습니다. 이 컨텍스트는 AVStream 안에 한 개만 있으며 코덱의 종류에 따라 가진 정보가 다를 수 있습니다. 비디오 코덱인 경우에는 해상도, 픽셀 포맷과 같은 정보가 있으 며 오디오의 경우에는 샘플레이트, 채널 개수와 같은 정보를 담고 있습니다.
 
 
출처: 나무위키, FFmpeg 라이브러리: 코덱과 영상 변환을 중심으로 47 - 48 p