FFmpeg + fdk-aac + libmp3lame 빌드
1. MSYS2 설치
윈도우에서 유닉스/리눅스 시스템을 구현한 프로그램
다만 정말 리눅스로 굴러가는건 아니라서 모든 바이너리가 exe로 구현된다.
리눅스와 명령어 호환성 등으로 C/C++ 크로스 플렛폼 프로그램에 윈도우용 배포 많이 사용된다.
pacman 패키지 관리자를 제공하고 있어서 필요한 라이브러리와 컴파일러를 설치하기 편하다.
- https://www.msys2.org/
- 설치 후 설치된 폴더에서 (기본 C:/msys64)
mingw64.exe
쉘 실행
2. 필요 패키지 설치
여기서 부터는 mingw64쉘 에서 실행한다
#패키지 업데이트
pacman -Syu
# 필요패키지 설치
pacman -S mingw-w64-x86_64-toolchain yasm nasm pkg-config autotools
3. fdk-aac 빌드
따로 mingw64쉘에 git을 설치하여 clone 받아도 상관없다.
다운받은 소스코드 폴더는 압축 해제하여 C:/msys64/home/<사용자>
에 위치시키고
아래 명령어를 입력한다.
# 소스코드 폴더로 이동
cd fdk-aac
# configure 파일 생성
autoreconf -fiv
# makefile 생성을 위한 configure 구성
./configure --prefix=<라이브러리 저장 위치 (절대 경로)> --disable-shared --enable-static
# 빌드
make -j<쓰레드 수>
# 라이브러리 설치
make install
저장 위치는 최상위 디렉토리가 C:/msys64
이며 리눅스 표기법으로 해야한다
- ex) C:/msys64/build/fdk-aac → /build/fdk-aac
4. libmp3lame 빌드
다운받은 소스코드 폴더는 압축 해제하여 C:/msys64/home/<사용자>
에 위치시키고
아래 명령어를 입력한다.
# 소스코드 폴더로 이동
cd lame
# makefile 생성을 위한 configure 구성
./configure --prefix=<라이브러리 저장 위치 (절대 경로)> --enable-nasm --disable-shared --enable-static --disable-frontend --disable-gtktest
# 빌드
make -j<쓰레드 수>
# 라이브러리 설치
make install
(추가) mpg123 라이브러리 설치
위에 libmp3lame make 진행 시
mpg123
관련 애러가 발생하면 진행
다운받은 소스코드 폴더는 압축 해제하여 C:/msys64/home/<사용자>
에 위치시키고
아래 명령어를 입력한다.
# 소스코드 폴더로 이동
cd mpg123
# makefile 생성을 위한 configure 구성
./configure
# 빌드
make -j<쓰레드 수>
# 라이브러리 설치
make install
5. FFmpeg 빌드
다운받은 소스코드 폴더는 압축 해제하여 C:/msys64/home/<사용자>
에 위치시키고
아래 명령어를 입력한다.
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:<fdk-aac 빌드된 경로>/lib/pkgconfig ./configure \
--prefix=<FFmpeg 저장 경로 (절대 경로)> \
--target-os=mingw32 \
--arch=x86_64 \
--enable-gpl \
--enable-nonfree \
--enable-libfdk_aac \
--enable-libmp3lame \
--disable-w32threads \
--disable-shared \
--enable-static \
--pkg-config-flags="--static" \
--extra-cflags="-I<fdk-aac 빌드된 경로 (절대 경로)>/include" \
--extra-cflags="-I<libmp3lame 빌드된 경로 (절대 경로)>/include" \
--extra-ldflags="-L<fdk-aac 빌드된 경로 (절대 경로)>/lib" \
--extra-ldflags="-L<libmp3lame 빌드된 경로 (절대 경로)>/lib" \
--extra-cflags="-static" \
--extra-ldflags="-static -static-libgcc -static-libstdc++" \
--disable-autodetect
# 빌드
make -j<쓰레드 수>
# 라이브러리 설치
make install
configure 옵션 설명
참고 자료
PKG_CONFIG_PATH=$PKG_CONFIG_PATH...
- fdk-aac를 기본 경로에 설치하지 않으면 팔요함
--enable-gpl
&--enable-nonfree
- fdk-aac 라이센스가 무료가 아니라서 해당 옵션이 무조건 필요하다
--enable-static
&--disable-shared
(기본값)- 정적 라이브러리(.a)를 빌드하고 동적라이브러리(.dll)은 빌드하지 않음
- 이렇게 설정하여
ffmpeg.exe
에 모든 라이브러리를 포함 할 수 있도록 함
--enable-libfdk_aac
&--enable-libmp3lame
:fdk_aac
,mp3lame
라이브러리 사용
--disable-autodetect
:- 자동으로 감지된 라이브러리 포함하지 않음
autodetect
가 오작동 되는 건지 빌드 된ffmpeg.exe
를 실행해보면 dll 오류가 떠서 자동으로 라이브러리가enable
되는 걸 막음- 만약 해당 옵션으로 문제 발생 시 위에 참고자료 들어가서
External library support
색션을 참고하여 문제되는 라이브러리를 설치하고enable
해볼 것
--extra-ldflags="-static -static-libgcc -static-libstdc++"
&--extra-cflags="-static"
- ffmpeg 빌드시
libwinpthread
라는 필수 라이브러리가 존재하는데 문제는 이게
msys64/mingw64/bin
폴더에.dll
동적 라이브러리와,msys64/mingw64/lib
에.a
인 정적 라이브러리가 동시에 존재한다. gcc가 빌드 시 동적 라이브러리를 우선시 하는 바람에libwinpthread.dll
없이는 실행이 안되는 문제가 발생했다.
따라서 정적 라이브러리로 링크 하도록 강제하게 만드는 옵션이다.
- ffmpeg 빌드시
참고
- 모든
configure
은 ./configure —help를 통해 허용되는 옵션 살펴 볼 수 있음
MSYS2없이 가능?
너무너무 많이 힘듬
gcc, yasm, nasm 까지는 바이너리 실행파일을 어렵지않게 구할 수 있어서 문제는 없는데
일단 configure
파일 자체가 bash 스크립트라 일반 윈도우쉘로는 불가하고
git bash로 어떻게든 한다 해도
make 과정에서 어떤 빌드 작업이 리눅스에 시스템 폴더를 참고하듯이 스크립트를 짜두면 사실상 답이 없어진다.
예를 들어 /usr 폴더를 참고해버리면 답이 없다
설령 저런 문제를 해결했다 치더라도 autotools
같은 패키지를 설치하려면 직접 또 빌드해야 되니까, 너무 너무 귀찮아 진다.
Visual Studio 사용
참고 자료
Visual Studio에 MSVC 컴파일러를 사용하여 빌드할수 있다.
다만 해당 방법도 MSYS2를 사용해야 한다.
기본적인 컴파일 방법은 위 참고자료에 블로그글 따라서 하면 되는데
저건 라이브러리만 빌드하는 거라 실행파일까지 빌드하려면
패키지 설치 부분이랑, configure 부분은 아래 처럼 해야 된다.
FFmpeg쪽에서 UTF-8을 강제하는 바람에 출력 구문이 깨지는 문제가 있다.
이를 해결하려면 configure 파일에서 -utf8
을 검색해서 나온 부분을 아래처럼 수정하고
configure 진행하자
add_cflags -source-charset:utf-8 -execution-charset:euc-kr
-
패키지 설치
#패키지 업데이트 pacman -Syu # 필요패키지 설치 pacman -S yasm nasm pkg-config autotools make diffutils
-
configure
./configure \ --prefix=<FFmpeg 저장 경로 (절대 경로)>\ --toolchain=msvc \ --arch=x86_64 \ --target-os=win64 \ --enable-nonfree \ --disable-shared \ --enable-static ....
- 만약
FFmpeg.exe
가 제대로 빌드되지 않는다면
--disable-autodetect
옵션과--disable-programs
이 설정되있으면 제거하길 바란다.
- 만약
필요한 인코더 라이브러리는 dll을 구하거나, 정적으로 빌드할 경우 MSYS2에서 정적 라이브러리 (.a
)로 빌드한뒤 dlltool
을 이용해서 .lib
로 변환하여 링크해야 한다.
리눅스에서 윈도우용 FFmpeg 빌드
참고자료
리눅스에서도 윈도우용 gcc인 mingw를 설치할 수 있다
sudo apt install mingw-w64
따라서 이렇게 configure
을 하면 리눅스에서 FFmpeg.exe
빌드가 가능하다
./configure \
--target-os=mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--arch=x86_64 \
...
pacman 패키지 삭제
pacman -Rcns <패키지>
예전 ffmpeg 빌드 옵션
--pkg-config=pkgconf --cc='ccache gcc' --cxx='ccache g++' --ld='ccache g++' --disable-autodetect --enable-amf --enable-bzlib --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-iconv --enable-lzma --enable-nvenc --enable-zlib --enable-sdl2 --enable-ffnvcodec --enable-nvdec --enable-cuda-llvm --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libx264 --enable-libdav1d --enable-libaom --disable-debug --enable-libfdk-aac --enable-fontconfig --enable-libass --enable-libbluray --enable-libfreetype --enable-libmfx --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libwebp --enable-libxml2 --enable-libzimg --enable-libshine --enable-gpl --enable-avisynth --enable-libxvid --enable-libopenmpt --enable-version3 --enable-librav1e --enable-libsrt --enable-libgsm --enable-libvmaf --enable-libsvtav1 --enable-chromaprint --enable-decklink --enable-frei0r --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfribidi --enable-libgme --enable-libilbc --enable-libsvthevc --enable-libkvazaar --enable-libmodplug --enable-librtmp --enable-librubberband --enable-libtesseract --enable-libxavs --enable-libzmq --enable-libzvbi --enable-openal --enable-libcodec2 --enable-ladspa --enable-libglslang --enable-vulkan --enable-libdavs2 --enable-libxavs2 --enable-libuavs3d --enable-opencl --enable-opengl --enable-libopenh264 --enable-openssl --extra-cflags=-fopenmp --extra-libs=-lgomp --extra-cflags=-DLIBTWOLAME_STATIC --extra-libs=-lstdc++ --extra-cflags=-DCACA_STATIC --extra-cflags=-DMODPLUG_STATIC --extra-cflags=-DCHROMAPRINT_NODLL --extra-libs=-lstdc++ --extra-cflags=-DZMQ_STATIC --extra-libs=-lpsapi --extra-cflags=-DLIBXML_STATIC --extra-libs=-liconv --disable-w32threads --extra-cflags=-DKVZ_STATIC_LIB --enable-nonfree --extra-cflags=-DAL_LIBTYPE_STATIC