'MSVC++'에 해당되는 글 1건

  1. 2011.01.13 ffmpeg의 ffplay를 MSVC++ 6.0 에서 컴파일 하기
항상 HW 코덱을 사용하다가, SW 코덱을 사용해야 하는 경우가 발생했다. 그래서 ffmpeg를 선택하게 되었는데, 최종 목적은 안드로이드 앱에서 사용 할 목적이다. 

막상 NDK 용으로 빌드를 했지만, 도대체 어떻게 돌아 가는 것인지 복잡한 코드를 분석하는 것은 쉽지 않았다. 그래서 고민 끝에 MSVC++ 에서 디버깅 및 트레이스를 해 보기로 했다. 다행히 인터넷에서는 ffmpeg를 원도우 환경으로 컴파일 하는 문서가 많았다. 하지만, ffplay를 MSVC++ 에서 컴파일 한 경우는 없는 듯하였다. 

이를 정리 하면, 나와 같은 고민에 빠진 사람들에게 도움이 될 것이다.

1.    다운로드 MinGW

http://sourceforge.net/projects/mingw/files/

mingw-get-inst-20101030.exe (796.0 KB)

 

2.    MinGW 설치

인스톨 옵션 : 풀 인스톨

설치 경로 : C:\MinGW

 

3.    다운로드 ffmpeg

http://www.ffmpeg.org/download.html#release

ffmpeg-0.6.1.tar.bz2

ffmpeg 작업 디렉토리에 압축해제

– MinGW Shell의 홈 디렉토리에 풀었다.

 

C:\MinGW\msys\1.0\home\MYHOME

C:\MinGW\msys\1.0\home\MYHOME\ffmpeg-0.6.1\ffmpeg-0.6.1

 

4.    MinGW Shell 실행, ffmpeg 컴파일

$ ./configure --enable-memalign-hack --enable-shared --enable-swscale

--enable-postproc --enable-gpl --enable-avfilter --enable-avfilter-lavf


$make

$install

 


5.    헤더파일 설치 경로

 

6.    inttypes.h, stdint.h 다운로드 및 복사

헤더파일 경로에 같이 위치 시킨다.

 

7.    라이브러리 설치 경로


8.    SDL 다운로드

http://www.libsdl.org/download-1.2.php

Development Libraries:

Win32: 
SDL-devel-1.2.14-VC6.zip (Visual C++ 6.0)

 

9.    압축 해제 및 복사


라이브러리는 ffmpeg 라이브러리와 동일한 위치에 복사

 


헤더 파일은 ffmpeg 헤더파일과 동일한 위치에 복사

 

10. MSVC 6.0 프로젝트 생성


Win32 Console Application 선택 및 Project name , Location 를 입력한다.

Location ffmpeg 디렉토리로 하였다.

11. Cpp 파일을 c 파일로 수정 ( Blee2.cpp -> blee2.c )


 

프로젝터 파일에 ffplay.c, cmdutils.c 포함한다.

 

12. 설정

Project settings -> C/C++, Precompiled Headers -> Not using precompiled headers


Project Settings -> Link  라이브러리 추가


avcodec-52.lib avdevice-52.lib avformat-52.lib avutil-50.lib

swscale-0.lib postproc-51.lib avfilter-1.lib SDL.lib

 

11. 헤더파일과 라이브러리 경로 추가

Tools -> Options -> Directories


Include files 추가

C:\MINGW\MSYS\1.0\LOCAL\INCLUDE

C:\MINGW\MSYS\1.0\INCLUDE

 


C:\MINGW\MSYS\1.0\LOCAL\BIN

 

13. 소스 수정

//-----------------------------------------------

// ffplay.c

//-----------------------------------------------

#include <windows.h>

void usleep(unsigned long usec)

{

     Sleep(usec/1000);

}

 

#define rint(x) (floor((x)+0.5))

 

//    DECLARE_ALIGNED(16,uint8_t,audio_buf1)[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

//    DECLARE_ALIGNED(16,uint8_t,audio_buf2)[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

    uint8_t audio_buf1[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

    uint8_t audio_buf2[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

 

//static int wanted_stream[AVMEDIA_TYPE_NB]={

//    [AVMEDIA_TYPE_AUDIO]=-1,

//    [AVMEDIA_TYPE_VIDEO]=-1,

//    [AVMEDIA_TYPE_SUBTITLE]=-1,

//};

static int wanted_stream[AVMEDIA_TYPE_NB]={

     0,

    -1,

    -1,

     0,

    -1

};

 

//    ap->time_base= (AVRational){1, 25};

     ap->time_base.num = 1;

     ap->time_base.den = 25;

 

//uint64_t size=  url_fsize(cur_stream->ic->pb);

int64_t size=  url_fsize(cur_stream->ic->pb);

 

//            FFTSample data[2][2*nb_freq];

                FFTSample data[2][4096];

 

int main(int argc, char **argv) -> int ff_main(int argc, char **argv)

 

//#if !defined(__MINGW32__) && !defined(__APPLE__)

//    flags |= SDL_INIT_EVENTTHREAD; /* Not supported on Windows or Mac OS X */

//#endif

 

//-----------------------------------------------

// libavutil\common.h

//-----------------------------------------------

#define inline __inline

 

14.   라이브러리 복사


 

15. 빌드 및 실행 화면


 


 

16. 기타

정리하지 못한 문제도 있을 것임.


다음은 투토리얼을 따라 해 보고, 정리 되면, 문서를 만들어 볼 계획이다.

Posted by blee
,