FFmpeg library build for Windows1

비주얼 스튜디오를 이용하여 윈도우즈용으로 FFmpeg 라이브러리를 빌드 해본다.
구버전의 DLL과 라이브러리 파일이 필요하면 직접 빌드 해야 한다.

빌드 환경

windows : windows 8.1 64bit
ffmpeg: 3.2.2
msys2: msys2-x86_64-20161025.exe
Visual studio: Microsoft Visual Studio Community 2015

다운로드

ffmpeg: https://github.com/FFmpeg/FFmpeg
msys2: http://www.msys2.org/

MSYS2 패키지 업데이트

64비트용인 msys2-x86_64-20161025.exe 파일을 다운로드 받아서 설치 한다.
설치시 폴더는 D:\msys64로 지정하였다.

msys 컴맨드 창이 자동 실행되면 패키지를 업데이트 한다.

pacman -Syuu

msys 컴맨드 창을 닫고 msys2_shell.cmd로 컴맨드 창을 다시 실행한다.
다음의 패키지도 설치한다.

pacman -S make
pacman -S diffutils
pacman -S yasm
pacman -S mingw-w64-i686-gcc

gcc용는 32비트를 타겟으로 설치한다.
        - 64비트용 : mingw-w64-x86_64-gcc
        - 32비트용 : mingw-w64-i686-gcc

빌드

1. MSYS 컴맨드 환경 설정

MSVC용으로 빌드하기 위해 윈도우즈 쉘의 경로 변수를 MSYS 컴맨드 창으로 가져오는 방법이 있다.
D:\msys64\msys2_shell.cmd 파일을 다음과 같이 설정한다.

rem To export full current PATH from environment into MSYS2 use '-use-full-path'parameter
rem or uncomment next line
set MSYS2_PATH_TYPE = inherit

2. 비주얼스튜디오 컴맨드 배치 파일 실행

64비트나 32비트중에 선택해서 실행한다.

64비트는 vcvarsall.bat amd64
32비트는  vcvarsall.bat x86

컴맨드 배치파일을 검색해서 실행 할수도 있다.
VS2015 컴맨드 배치파일을 검색한다.



폴더에는 다음의 파일이 들어 있다.

VS2015 x64 ARM Cross Tools Command Prompt
VS2015 x64 Native Tools Command Prompt
VS2015 x64 x86 Cross Tools Command Prompt
VS2015 x86 ARM Cross Tools Command Prompt
VS2015 x86 Native Tools Command Prompt
VS2015 x86 x64 Cross Tools Command Prompt

윈도우즈 64비트
VS2015 x64 Native Tools Command Prompt :   vcvarsall.bat amd64

윈도우즈 32비트
VS2015 x86 Native Tools Command Prompt :   vcvarsall.bat x86

3. VS2015 Native Tools Command Prompt에서 MSYS 실행

32bit 실행
D:\msys64\msys2_shell.cmd -mingw32

64bit 실행
D:\msys64\msys2_shell.cmd -mingw64

4. 비주얼 스튜디오 경로를 확인하여 link 경로 설정

앞에서 MSYS2_PATH_TYPE = inherit을 했기 때문에 비주얼스튜디오 컴맨드 프롬프트와 MSYS 프롬프트에서 경로 설정이 동일하게 나와야 한다.

비주얼스튜디오 컴맨드 프롬프트에서 경로 확인
set PATH

MSYS 프롬프트에서 경로 확인
echo $PATH

비주얼 스튜디오 컴파일러를 먼저 참조하는지 확인
$ which -a cl
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64/cl

이 경로를 이용하여 link 경로를 지정해준다.
export PATH="/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64:$PATH"

"export PATH"로 경로 설정을 하기 전에는 MSYS의 link를 먼저 참조 한다.

비주얼 스튜디오 link를 먼저 참조하는지 확인
$ which -a link
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64/link
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/link
/usr/bin/link
/bin/link
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64/link

5. ffmpeg 복사

ffmpeg 폴더를 "D:\msys64\home\[사용자]" 폴더로 복사한다.

6. make 만들기

--toolchain : msvc를 지정한다.
--enable-shared : DLL을 만들기 위해 지정한다.

mkdir out
cd out
../ffmpeg/configure --toolchain=msvc --prefix=./ --enable-shared

7. config.mak 수정

config.mak가 생성되면 다음의 워닝은 무시한다.
WARNING: pkg-config not found, library detection may fail.

out/config.mak 파일의 EXTRALIBS에 user32.lib 추가
EXTRALIBS= ... secur32.lib psapi.lib advapi32.lib shell32.lib user32.lib

8. make 실행

make
make install

9. DLL 확인

out/bin 폴더에 lib, dll 파일등이 생성 되었는지 확인한다.

DLL의 의존성을 확인한다.
dumpbin -dependents bin/avcodec-57.dll

다른 DLL의 어떤 함수를 호출하는지 확인한다.
dumpbin -imports bin/avcodec-57.dll

export 하는 함수를 확인한다.
dumpbin -exports bin/avcodec-57.dll

참조)
http://qiita.com/omochimetaru/items/35df0524594255354885#msys2mingw32
https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC