2015. 7. 30. 13:24


libavutil/common.h:165: error:'UINT64_C' was not declared in this scope


위와 같은 에러를 만나면 common.h 소스에 아래 코드 추가


#ifndef INT64_C

#define INT64_C(c) (c ## LL)

#define UINT64_C(c) (c ## ULL)

#endif

2015. 7. 23. 21:36

지금 구현하는 프로그램은 동영상 파일을 입력 받아 처음의 다섯 프레임을 ppm 파일로 저장하는 프로그램이다


프로그램의 큰 흐름은 다음과 같다

  1. 파일을 연다. - FileOpen( )
  2. 스트림의 정보를 얻는다. - GetStreamInformation( )
  3. 코텍을 찾는다 - FindCodec( )
  4. 디코딩한다 - Decode( )


Streamer 클래스를 선언하고 다음과 같이 구현한다


생성자 멤버 변수는 생성자에서 다음과 같이 설정한다


소멸자는 다음과 같이 구현한다


파일을 여는 함수는 다음과 같이 구현한다


스트림의 정보를 얻는 함수는 다음과 같이 구현한다


코덱을 찾는 함수는 다음과 같이 구현한다


디코딩하는 함수는 다음과 같이 구현한다


프레임을 저장하는 함수는 다음과 같이 구현한다


미디어 타입을 문자열로 변환하는 함수는 다음과 같이 구현한다


나머지 하나의 함수는 다음과 같이 구현한다


main( ) 함수는 다음과 같이 구현한다

2015. 7. 23. 21:07

FFMPEG 라이브러리 파일 다운로드


위의 링크로 들어가서 빌드된 다음 파일을 다운 받는다

 

 

파일을 다운 받은 후 압축을 푼다

 

Shared 폴더 안에서 bin 파일을 복사하여 링크를 한다

 

Dev 폴더 안에서 include, lib를 복사하여 링크를 한다

 

다음의 헤더파일을 포함한다

 

extern "C"{
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
}

 

필요한 라이브러리만 링크하면 되지만 다음의 파일을 링크한다

 

lib 파일

avcodec.lib

avdevice.lib

avformat.lib

avutil.lib

postproc.lib

swresample.lib

swscale.lib

2015. 7. 15. 09:59

FFMpeg 을 이용하여 프로그래밍 하기 위해서는 동영상 파일의 이해가 필요


출처 : http://aslike.egloos.com/3082696

  • 미디어 파일 : 플레이어에서 재생하기 위한 비디오/오디오 데이터를 가지고 있는 파일

  • 다음과 같은 과정으로 미디어 파일이 만들어짐


  • 2가지 과정이 필요
  1. Encoding : 원본 영상/소리를 압축

    1. Enconding을 하는 이유 : 원본 영상의 데이터 크기가 크기 때문

    2. Encoder : Encoding을 해주는 객체

  2. Muxing : 영상/소리 등 모든 파일을 하나로 합치는 작업

    1. 하나의 파일로 만들기 위해 영상, 소리, 자막등 여러 요소들을 하나로 합침


  • Container 포맷 : 모든 요소(영상, 음성, 자막등)들을 담는 하나의 포맷(상자)



  • 플레이어가 하는 일 : 하나로 합쳐져 있는 파일을 분리, 디코딩(압축 풀기)해서 출력


  • 2가지 과정이 필요
  1. Demuxing : 컨테이너 포맷(파일)을 열고 내용 확인

    1. 몇 종류의 요소가 들었나 확인(영상, 음성, 자막, 다채널 등)

    2. 각 요소마다 하나씩 꺼내서 디코딩 준비

  2. Decoding : 압축을 풀어서 원본 영상/소리로 변환

    1. Decoding 후원본 영상/소리를 가지고 후처리 작업 진행 가능
    2. 영상과 소리를 시간에 맞게 동기화 해서 출력


  • FFMpeg의 역할

    • 출력 이외의 위의 모든 역할을 함





2015. 7. 14. 11:16

SDL (Simple Direct Media Layout)을 사용하는데


다음과 같은 에러가 발생한다


MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol 

                                 _main referenced in function ___tmainCRTStartup

1>D:\bin\Debug\Tutorial.exe : fatal error LNK1120: 1 unresolved externals


이것은 main( ) 함수를 호출할 때 SDL에서 정의 해놓은 SDL_main( )과 겹치기 때문


#define main SDL_main( )


따라서 이것을 막으려면


#undef main


을 해주면 된다


이런 글은 언제 쯤 우리나라에서 검색될 수 있으려나

2015. 7. 9. 15:57
  • 출처 

http://aslike.egloos.com/3082696


  • 컨테이너(Container) : 파일 그 자체  /  ex) 유형(Type) : avi, Quicktime
  • 스트림(Stream) : 데이터 원소(element)의 연속
  • 프레임(Frame)  : 데이터 원소 하나
  • 패킷(Packet)    : 응용프로그램에서 사용 가능할만큼의 raw 프레임으로 디코딩 가능한 데이터의 비트를 포함하는 데이터의 조각
  • 먹싱(Muxing)   : 오디오와 비디오를 하나의 파일로 합침
  • 디먹싱(Demuxing) : 하나의 파일을 오디오와 비디오로 분리

   - 컨테이너라 부르는 이유 : 그 파일 안에 파일 정보, 코덱 정보, 시간, 비트레이트 등 모든 정보를 담고 있는 박스이기 때문
   - 한 패킷은 보통 한 프레임으로 묶임
   - 패킷 : 데이터 전송 상으로 주로 쓰이기 때문에 패킷이라는 용어를 사용

    

  • 스트리밍 기초 흐름도
  1. 동영상 파일로부터 비디오 스트림을 연다
  2. 비디오 스트림으로부터 패킷을 연다
  3. 패킷을 디코딩하여 프레임을 얻는다
  4. 만약 프레임이 완전하지 않으면 다음 프레임을 얻는다
  5. 프레임을 가지고 무엇을 한다
  6. 다음 패킷을 읽어들인다


2015. 7. 9. 13:22
avformat.h

1.

int 

avformat_open_input (AVFormatContext **ps, 

                              const char *filename, 
                              AVInputFormat *fmt

                              AVDictionary **options)



입력 스트림을 열고 헤더를 읽는다.

avformat_close_input( )를 사용하여 꼭 닫아야 한다


  • 파라미터

- ps : avformat_alloc_context( )으로 할당한 AVFormatContext의 포인터

- filename : 열기를 할 스트림의 파일 이름

- fmt : 구체적인 입력 포멧

- options :  AVFormatContext로 채워진 dictionary와 demuxer-private 옵션 


2. 

int 

avformat_find_stream_info (AVFormatContext *ic, 
                                      AVDictionary **options)


avformat_open_input( ) 보다 더 많은 정보를 얻는다
파일을 조금 더 읽어서 구체적인 정보를 AVFormatContext에 저장한다.


3. 

void av_dump_format (AVFormatContext *ic, int index, const char *url, int is_output)


입력, 출력 형식과 같은 상세한 정보를 출력한다. 
 비트레이트, 스트림, 컨테이너, 프로그램, 메타데이타 등등

4.
AVCodec avcodec_find_decoder (enum AVCodecID id)

AVFormatContext에 있는 codec_id를 이용하여 AVCodec을 얻는다.

codecContext를 복사한다


6. 
int avcodec_open2 (AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)

주어진 AVCodec코덱으로 AVCodecContext를 초기화한다

7.