FFmpeg Player with Visual Studio - 02 Project 생성하기 └ FFMPEG

2. Project 생성하기


> Library 준비하기


앞선 강좌에서 설명한대로  http://ffmpeg.zeranoe.com/builds/ 에서 Windows용 빌드 파일들을 다운로드 받습니다.


FFmpeg-xxxxxx-win32-dev 파일에서 include / lib 폴더만



그리고 FFmpeg-xxxxxxx-win32-shared 파일에서 bin 폴더만



별도의 공간에 압축을 풀어둡시다.



Visual C++를 통해서 ffmpeg 프로그램을 만들기 위해서는 준비과정이 하나더 필요합니다

( gcc 계열로 컴파일 하시는 분들은 건너뛰셔도 됩니다 )


Visual stduio 의 버전이 2013 이전 버전이라면, inttypes.h 파일을 추가해 줘야 하는데요.

아래 사이트에서 해당 파일을 받을 수 있습니다


https://code.google.com/p/msinttypes/



다운로드를 받고 압축을 풀어보면 2개의 헤더 파일을 볼 수 있습니다



VC++ 2010을 기준으로 stdint.h 는 제공되고 있으므로, 사실 상 필요한 것은 inttypes.h뿐이지만, VC++ 6.0 의 경우 stdint.h 가 없으므로, 같이 포함되어 있는 헤더파일을 사용하면 됩니다.


이번 강좌에는 VC++ 2010을 기준으로 작성했기 때문에 stdint.h가 있다는 전제하에 진행하겠습니다.


inttypes.h 헤더 파일만 아까 압축을 풀어둔 ffmpeg 폴더 내의 include/libavutil/ 밑에 복사합니다.

그리고 include/libavutil/common.h 파일을 Text Editor로 열어서 아래와 같이 편집합니다.


#include <inttypes.h>  ->  #include “inttypes.h”



common.h와 같은 디렉토리에 있는 (방금 복사한) inttypes.h를 우선 불러오도록 하기 위함입니다.


어찌되었든, 컴파일러로 하여금 inttypes.h를 불러올 수 있도록 하는 조치이기 때문에

사실, inttypes.h를 VC의 기본 include 폴더에 복사하셔도 무방합니다만,


일단 inttypes.h를 설치한 목적이 ffmpeg 프로젝트를 위해서 이기 때문에 이렇게 사용하는 것도 나쁘지 않은 방법입니다.


> Project 생성


이제 본격적으로 시작해 보도록 하겠습니다


Visual Studio ( 또는 C++ )를 열고 프로젝트를 생성합니다


Win32 프로젝트를 하나 생성할 것입니다

강좌에서는 Console 프로젝트로 생성해서 진행할건데, 꼭 Console 프로젝트 일 필요는 없습니다.




프로젝트를 생성할 때는, Empty Project로 설정합시다




이제 프로젝트 속성 설정을 해주도록 하겠습니다

아래 3가지 중 한가지 방법으로 속성창을 띄우도록 합시다


1. Solution Explorer에서 프로젝트에 마우스 오른쪽 버튼을 클릭 -> Properties

2. Menu의 Project -> Properties

3. 단축키 Alt + F7


먼저 유니코드 설정부터 해제하겠습니다. ( VC++ 6.0 사용자는 필요없는 과정입니다 )

왼쪽 속성 목록에 General (일반) 설정이 Default 로 떠있습니다.

Character Set이 [Use Unicode Character set ] 으로 설정되어 있을텐데, 이를 [Not Set]으로 바꿔줍니다.




다음은 ffmpeg 라이브러리를 사용할 수 있도록 Path 설정을 하는 것입니다.

일반적으로 Visual C++에서는 Path 설정을 2가지 방법으로 할 수 있습니다.

“VC++ Directories” 를 이용한 방법과 C++ 및 Linker 설정에서 “Additional Include / Library Directories” 에서 설정하는 방법입니다. (아래 이미지 참조)


[VC++ Directories]





[Additional Include / Library Directories]





** 왼쪽의 C/C++ 속성이 보이지 않는다면 속성 창을 닫고, 프로젝트에 빈 cpp 파일을 하나 추가하신 후, 다시 속성 창을 열어보면 생겨있습니다.


참고로 “VC++ Directories”에 등록하는 방법은 VC++ 2010 이전에는 Global Path였습니다. 다시 말해 한번 설정해 놓으면 이후 새로운 프로젝트를 생성할 때, 다시 Path를 등록 시키지 않아도 사용할 수 있었습니다. ( 2010 이후 부터는 프로젝트 속성으로 바뀌면서, 별도로 Global Path를 설정하지 않는 이상, Project 단위로 다시 Path를 추가해야 합니다 )


Path를 지정하는데에는 어느 쪽을 사용해도 문제는 없습니다만, 저 같은 경우 Project단위로 소스코드를 배포하는 일이 많았던 지라 후자를 더 사용하고 있는 편입니다.


Include Directories 에는 아까 압축을 풀었던 Include 폴더의 Path를

Library Directories 에는 아까 압축을 풀었던 Lib 폴더의 Path를 작성합니다.


가령, 아까 압축을 풀어둔 폴더의 Path가 D:\ffmpeg 인 경우,

Include Directories에는 “D:\ffmpeg\include” 를 추가하고,

Library Directories에는 “D:\ffmpeg\lib” 를 추가합니다.


마지막으로 컴파일 후, 바로 실행할 수 있도록 dll path를 지정하도록 하겠습니다.

역시, 속성 창에서 진행됩니다.


아래 화면과 같이 속성 목록의 “Debugging” 을 선택하고 Environment(환경) 에 설정하시면 됩니다.



아래와 같이 입력합시다


PATH=%PATH%;$(압축을 풀어둔 폴더)\bin


가령, 아까 압축을 풀어둔 폴더의 Path가 D:\ffmpeg 인 경우,

PATH=%PATH%;D:\ffmpeg\bin

이 됩니다.


> Hello FFmpeg


이번 시간에는 간단하게 Console에 “Hello FFmpeg” 이라는 문구만 찍는 아주 단순한 프로그램만 만들어보도록 하겠습니다.


main.cpp


///> Include FFMpeg

extern "C" {

#include <libavformat/avformat.h>

}


///> Library Link On Windows System

#pragma comment( lib, "avformat.lib" )

#pragma comment( lib, "avutil.lib" )


int main(void)

{

av_log( NULL, AV_LOG_INFO, "Hello FFmpeg\n" );

return 0;

}


만일 프로젝트 세팅 및 모든 과정이 정상적으로 되었다면,

Console 창이 뜨면서 “Hello FFmpeg” 이라는 문구가 뜰 것입니다.


아래 링크는 VC++ 2010용 샘플 프로젝트 파일입니다.

(dll포함) Library를 모두 포함하고 있어서 약 12MB 정도입니다만,

프로젝트를 열어서 바로 실행해 볼 수 있겠금 했습니다.


HelloFFmpeg.7z.001

HelloFFmpeg.7z.002


다음 시간에는 ffmpeg을 이용해서 미디어 파일을 열고 닫는 방법에 대해서 알아보겠습니다



덧글

  • 초보자 2014/04/02 17:00 # 삭제 답글

    올라왔네요. 잘보고 따라 해보겠습니다. 감사합니다.
  • K 2014/04/23 22:55 # 삭제 답글

    채.... 책을 쓰시죠, 사겠습니다 (_ _)ㅋㅋ
    ㅎ FFmpeg 입문자 감사히 보겠습니다.
  • 배우미 2014/05/25 01:00 # 삭제 답글

    안녕하세요?
    저도 ffmpeg로 뭘좀 만들려고 시도하던 중 좋은 자료 참 고맙게 읽었구요.
    님의 심려가 깃든 라이브러리 다운하여 잘 쓰고 있습니다.
    그런데 release 모드에서는 av_register_all 부분에서 실행중에 에러가 나네요.
    베포파일이 debug 용이래서 그런것 같은데.
    염치없지만 release 용도 올려주시면 정말~ 고맙겠습니다.

    앞으로 님블로그 자주 찾아뵙겠고 꼭 도와주시면 잊지않겠습니다.
  • 체인지겟타 2014/05/26 10:06 #

    라이브러리 자체의 문제라기 보다는 release모드 build confiuration에 debug처럼 path정보를 잡아주지 않아서 발생하는 문제입니다.

    위 강좌(2번째 강좌) 중간부터 유니코드 설정 및 Path 설정 등에 대해서 설명한 부분이 있는데 똑같이 Release모드 빌드 옵션에도 같이 적용해주시면 동작할 것으로 생각됩니다.

    위 스크린샷 기준으로 Property (프로젝트 속성) 윈도우 왼쪽 위에 보시면 [Active(Debug)] 라고 되어 있는 콤보 박스를 [Release]로 바꾸고 설정하시면 됩니다
  • 배우미 2014/05/26 18:52 # 삭제 답글

    안녕하세요?

    바쁜 시간 내어 답글 주셔서 감사합니다.

    님이 대준대로 하였는데도 왠 일인지 안됩니다. 저만 그런건가요?
    Debug 에서는 잘 되는데, Release 모드에 가면 실행시 오류가 납니다.

    프로젝트 속성도 꼭 같이 맞추었구요, 유니코드 설정도 No Set 로 하였는데도 실행만 하면

    <The procedure entry point GdipDrawImageI could not be located int the
    dynamic link library avformat-55.dll.>

    라는 에러메시지가 뜨고 프로그램이 실행이 안됩니다.

    Debug 일 때는 유니코드로 설정을 하여도 잘 실행이 되는데, 옵션을 꼭 같이 주었는데도 release에서는 실행이 안됩니다.
    (유니코드도 Not Set로 바꾸어도 보았습니다)

    사실 회사 과제맡은거 있어서요,,,
    고민 하던 중 님블로그 만나 다행이다 싶었는데 Release 로 떨구면 딱 안되네요.

    이 것만 해결이 되면 되겠는데,,, 제 생각에는 av_register_all() 호출시에 나오는 에러 같습니다.

    염치 없지만 한번 확인해 주시면 고맙겠습니다.
    감사합니다.~

  • 배우미 2014/05/26 20:45 # 삭제 답글

    안녕하세요? 체인지겟타 님.

    답글 감사드리구요.

    옵션에서 Linker>Optimization 에서
    References 와 Enable COMDAT Folding 항목을 모두 지우고 build 했더니 에러 없이 넘어갑니다.

    님의 Library 잘 쓰고 있구요,

    앞으로 자주 오겠습니다.

    감사합니다.



  • 쟌쟌 2015/05/12 17:57 # 삭제

    오.. 저도 같은 문제로 해매고 있었는데 감사합니다.
  • 쟌쟌 2015/05/12 17:57 # 삭제

    오.. 저도 같은 문제로 해매고 있었는데 감사합니다.
  • 개뒷치기 2014/06/01 19:33 # 삭제 답글

    안녕하세요 ffmpeg 강좌도중 해결하지못한 오류가 있어서 댓글을 남깁니다.
    1>test.obj : error LNK2019: _av_log 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>C:UsersAdministratorDocumentsVisual Studio 2012ProjectsfftestDebugfftest.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.
    1>
    강좌대로 라이브러리 링크를 했는데 위와같은 에러가 발생했습니다 .ㅠ 어떻게 해야 할까요
    VS2012 64bit 사용하고 있습니다. ffmpeg 2014 6 01 최신버전입니다.
  • 체인지겟타 2014/06/02 11:02 #

    보통 LNK2019 에러는 Library 링크가 제대로 되지 않는 경우 발생하는 에러인데요

    1. Path 설정을 잘못했거나
    2. #pragma comment( lib, "avutil.lib" ) 와 같이 소스코드 레벨에서 링크를 명시하지 않았거나
    프로젝트 (속성)설정에서 ( Linker(링커) -> Input(입력) -> Additional Dependencies(추가 종속성) )
    에 lib를 추가 를 하지 않았거나

    해서 발생하는 문제입니다

    일단 위 2경우가 제대로 되었는지 확인해 볼 필요가 있을 것 같습니다
  • 개뒷치기 2014/06/02 13:59 # 삭제 답글

    VS2010 버전에서는 잘 되는데.. 이상하게 VS2012버전에서는 잘 안됩니다.. av_log 함수에서 헤더랑은 잘 연결됬으나 lib랑 dll이 잘 연결 안되는거 같은데.. 원인을 모르겠군요 ㅠ
  • 체인지겟타 2014/06/02 18:16 #

    VS2012가 64bit 버전이어서 그럴 수 있습니다
    VS2012를 32bit 버전으로 바꿔서 해보시거나 Library를 받으실 때 64bit용으로 받아서 한번 해보시기 바랍니다
  • 마벨 2014/08/18 17:10 # 삭제 답글

    안녕하세요. 매번 좋은 강좌 올려주셔서 정말정말 감사합니다.
    저도 위에 분과 마찬가지로 링크에러가 나는데요

    main.obj : error LNK2019: unresolved external symbol _av_log referenced in function _main
    1>F:project fileHelloFFmpegDebugHelloFFmpeg.exe : fatal error LNK1120: 1 unresolved externals

    강좌대로 include, lib 주소 잘 입력했고, 위에서 이야기 하신 3가지 사항에 해당되나 찾아보았는데
    결국 실행이 되지 않았습니다.
    무슨 문제가 있는 걸까요?

    몇일째 이거 잡고 헤메고 있어요
    도와주세요ㅠㅠ
  • 마벨 2014/08/18 17:12 # 삭제 답글

    아 그리고 extern에 빨간줄이 가지고 PCH Warning이라는 경고가 뜨는데
    이것은 어떻게 해결해야 하는 거죠?
  • 짱가 2015/01/28 17:17 # 삭제 답글

    환경 설정시 유니코드 설정을 해결하라고 하셨는데 무슨 이유인지 알 수 있을 까요?
  • 2015/02/15 01:06 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 지각생 2015/03/19 18:43 # 삭제 답글

    너무 늦게 올려서 염치 없지만.....
    지금 현재 Debug 모드에서는 정상적으로 컴파일해서 이상없이 실행되는데요
    Release 모드에서는 환경설정에서 Path를 그대로 똑같이 맞춰 줬는데도
    [작동이 중지되었습니다.] 라는 실행 에러가 발생하네요. 원인을 한참 찾아봐도 분석이 안되네요
    혹시 무슨 문제인지 아시는지요?
  • 다시 2015/05/24 13:17 # 삭제

    위 댓글보셔요
  • 지각생 2015/03/19 18:43 # 삭제 답글

    너무 늦게 올려서 염치 없지만.....
    지금 현재 Debug 모드에서는 정상적으로 컴파일해서 이상없이 실행되는데요
    Release 모드에서는 환경설정에서 Path를 그대로 똑같이 맞춰 줬는데도
    [작동이 중지되었습니다.] 라는 실행 에러가 발생하네요. 원인을 한참 찾아봐도 분석이 안되네요
    혹시 무슨 문제인지 아시는지요?
  • 지각생 2015/03/19 18:56 # 삭제 답글

    너무 늦게 올려서 염치 없지만.....
    지금 현재 Debug 모드에서는 정상적으로 컴파일해서 이상없이 실행되는데요
    Release 모드에서는 환경설정에서 Path를 그대로 똑같이 맞춰 줬는데도
    [작동이 중지되었습니다.] 라는 실행 에러가 발생하네요. 원인을 한참 찾아봐도 분석이 안되네요
    혹시 무슨 문제인지 아시는지요?
  • Lpeace 2016/01/11 14:07 # 삭제 답글

    main.obj : error LNK2019: unresolved external symbol _av_log referenced in function _main
    폴더 경로를 잘 설정했음에도 불구하고 위에 에러가 나시는 경우는
    프로젝트 platform 설정을 바꾸시면 될 수도 있습니다.
  • kimqoola 2016/01/28 18:34 # 삭제 답글

    감사합니다 유후~^^
  • 도우미 2016/03/07 18:16 # 삭제 답글

    main.obj : error LNK2019: unresolved external symbol _av_log referenced in function _main

    이 에러는 보통 64비트 빌드파일을 링크시켜두고 32비트 컴파일을 해서 발생하는 에러더군요.

    32비트 파일을 받거나 컴파일 옵션을 바꾸니 잘 됩니다.
  • 영일만 2016/09/02 00:05 # 삭제 답글

    제가 ffmpeg를 3일째 검색 하면서 귀하의 내용을 보게 되었습니다.
    이제 좀 이해가 됩니다. 모두들 열심히 설명은 해 두었지만 난 초보인데 따라하다보면 안되었었는데
    귀하의 설명은 이해가 됩니다. 감사합니다란 인사는 꼭 해야 될것 같아 글을 써 봅니다.
    사실 main.cpp는 모르지만 헤메다 보면 알겠죠 사실 c를 모르거던요
    어찌되었던 감사 합니다.
  • 상열 2016/09/30 10:40 # 삭제 답글

    선생님~! 좋은 강좌 감사드립니다.
    예제 파일 까지 올려주시니 얼마나 감사한지.
    저는 64bit 를 다운 받았다가 링킹 에러로 시간을 좀 보냈습니다.
    이제는 hello 코드가 잘 동작해서 참 기쁘네요.
    이후 강좌도 잘 따라하면서 ffmpeg 세계를 여행하도록 하겠습니다.
    감사합니다.
  • 아둥이 2017/01/31 15:21 # 삭제 답글

    안녕하세요!! 글이올라온지 너무 한참이라 지끔 질문을해도 답주실지모르겠네요..ㅠㅠ 혹시 프로젝트프로퍼티의 캐릭터셋부분을 유니코드로하면 안되는 이유가 있는건가요? 개발중인 프로그램 특성상 유니코드로 개발해야하는 경우라...ㅠ
  • 어썸!! 2018/04/10 10:33 # 삭제 답글

    선생님 정말 감사합니다.
    C++을 처음시작하는 사람으로서 정말 알기 쉽게 정리해주셔서 덕분에 헤매던 부분을 해결했습니다.
    FFmpeg에 한걸음 다가간거 같네요. 작성해주신 글들 너무 감사하고 열심히 따라해보겠습니다.
    감사합니다!!!!
댓글 입력 영역