저는 입사 4개월차 초보 개발자 입니다. 전문가가 아니기에 작성하는 정보에 오류가 있을 수 있음 을 밝힙니다. 오류가 있을 경우 지적해주시면 최대한 고치도록 노력하겠습니다. 모든 정보는 정확하지 않을 경우 추측성 어조를 사용해 표현했습니다. 또한, 되도록 출처와 관련된 정보를 포함하는 링크 주소를 남기려 노력했습니다. 감사합니다.
ffmpeg 라이브러리 사용하기 1단계
- 설치 및 예제 컴파일
작성일
- 2018-11-16
환경
- windows10 64bit
- visual studio 2017
1. 설치하기
위 사이트에서 빨간색 네모 박스가 쳐진 선택지를 각각 선택한 후 다운로드 하면 됩니다.
저의 경우 Version은 위의 20181114-... 을 선택했고 Architecture은 64bit를 선택했습니다.
Linking은 Shared 와 Dev 둘 모두 다운받아야합니다.
설치 후 압축을 풀면 위의 왼쪽 사진과 같게됩니다.
여기서 필요한 것은 빨간 화살표가 가리키고 있는 bin, include, lib 폴더입니다.
이들만 따로 복사해서 ffmpeg이라는 이름의 폴더 안에 별도로 넣어 관리하면 편리하게 사용할 수 있습니다.
2. 프로젝트에 추가하기
visual studio 2017 을 사용해 Test용으로 빈프로젝트를 하나 만들었습니다.
프로젝트 폴더 안에 위에서 만든 ffmpeg이라는 이름의 폴더를 복사 붙여넣기합니다.
이제 폴더안의 bin, include, lib 각각을 프로젝트에 추가해 주어야합니다.
a. bin
동적 라이브러리 (*.dll) 가 들어있는 폴더 입니다.
'프로젝트(P) - 프로젝트 속성(P) - 구성 속성 - 디버깅 - 환경' 의 경로에 bin 폴더의 경로를 추가합니다.
PATH=원하는 경로;%PATH% 의 형태로 입력하면 됩니다.
저의 경우 'PATH=$(SolutionDir)\addition\ffmpeg\bin;%PATH%' 와 같이 경로를 추가했습니다.
b. include
헤더 파일 (*.h) 이 들어있는 폴더 입니다.
'프로젝트(P) - 프로젝트 속성(P) - 구성 속성 - C/C++ - 일반 - 추가 포함 디렉터리' 의 경로에 include 폴더의 경로를 추가합니다.
저의 경우 '$(SolutionDir)\addition\ffmpeg\include' 와 같이 경로를 추가했습니다.
c. lib
정적 라이브러리 (*.lib) 가 들어있는 폴더 입니다.
'프로젝트(P) - 프로젝트 속성(P) - 구성 속성 - 링커 - 일반 - 추가 라이브러리 디렉터리' 의 경로에 lib 폴더의 경로를 추가합니다.
저의 경우 '$(SolutionDir)\addition\ffmpeg\lib' 와 같이 경로를 추가했습니다.
정적 라이브러리의 경우 추가적으로
'프로젝트(P) - 프로젝트 속성(P) - 구성 속성 - 링커 - 입력 - 추가 종속성' 의 경로에 사용할 lib 파일 이름을 추가합니다.
저의 경우 avformat.lib, avcodec.lib, avutil.lib 세 가지를 추가했습니다.
이 것으로 프로젝트에 ffmpeg 라이브러리 추가가 끝났습니다.
3. 예제 코드 빌드 및 에러 잡기
이제 기본 예제 코드를 빌드해보겠습니다.
#include < libavformat/ avformat.h>
#include < libavcodec/ avcodec.h>
#include < libavutil/ avutil.h>
#include < stdio.h>
int main(void ) {
av_register_all();
return 0 ;
}
cs
여러 가지 에러가 발생합니다. 발생한 에러들과 해결 방법을 정리합니다.
fatal error C1189: #error: missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
참고
libavutil의 common.h 에서 __STDC_CONSTANT_MACROS가 정의되지 않았을 경우 에러가 발생하도록 해놓아서 발생하는 에러입니다.
잘 모르겠지만,
__STDC_CONSTANT_MACROS 를 정의하면 C++프로그램이 C99 표준에 정의된 stdint.h 를 사용할 수 있다고 하는 것 같습니다.
ffmpeg 헤더 파일들을 include 하기 전에 아래 코드를 삽입하면 해결됩니다.
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
cs
error LNK2019: "void __cdecl av_register_all(void)" (?av_register_all@@YAXXZ) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
참고
테스트를 위해 사용한 함수 av_register_all()이 deprecated 이기 때문에 발생하는 에러입니다.
예전에는 사용했지만 지금은 또는 이제 머지 않을 미래에는 사용하지 않을 함수이니 다른 방법을 사용하라는 뜻입니다.
프로젝트 맨 위에 다음 코드를 작성하면 해결됩니다.
#pragma warning(disable : 4996 )
cs
LNK2019 "void __cdecl av_register_all(void)" (?av_register_all@@YAXXZ) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
참고 참고1
ffmpeg library가 c언어로 작성되었기 때문에 이를 c++ 파일에서 불러올 경우 발생하는 문제입니다. (키워드 : Name Mangling)
파일의 확장자를 .c로 변경하거나 extern "C" {} 블럭으로 ffmpeg 헤더 파일 선언부를 감싸 해결할 수 있습니다.
빌드를 성공적으로 마쳤습니다.
이번 글에서는 ffmpeg 라이브러리를 설치하고 예제 코드를 빌드해보았습니다.
감사합니다.