1.시스템&인프라/스트리밍

[FFmpeg] CUDA 가속 포함 FFmpeg 7.1 정적 빌드 – MinGW64 + libx264/x265 + NVENC

쿼드큐브 2025. 11. 5. 14:00
반응형

 

반응형

[FFmpeg] CUDA 가속 포함 FFmpeg 7.1 정적 빌드 – MinGW64 + libx264/x265 + NVENC

"본 글은 과거 티스토리에서 발행했던 콘텐츠를 기반으로, 최신 정보를 반영해 새롭게 정리한 업데이트 버전입니다."

 

📚 목차
1. 개발 환경 구성 및 CUDA Toolkit 설정
2. Clang 컴파일러 설치: mingw-w64-x86_64-clang
3. nv-codec-headers 다운그레이드 및 수동 설치
4. FFmpeg 7.1 빌드 설정: CUDA 가속 + 정적 링크
5. 빌드 완료 및 ffmpeg.exe 생성 확인
6. CUDA 인코딩 테스트: HEVC_NVENC 실습 예제
✔ 마무리

 

ffmpeg CUDA 가속 빌드 삽화 이미지
ffmpeg CUDA 가속 빌드 삽화 이미지

1. 개발 환경 구성 및 CUDA Toolkit 설정

본 실습의 목표는 MSYS2 기반의 MinGW64 환경에서 FFmpeg 7.1을 정적 링크(static build) 방식으로 빌드하고, 여기에 NVIDIA GPU의 CUDA 하드웨어 가속 기능을 활성화하여 고성능 영상 인코딩 및 디코딩을 구현하는 것입니다.

 

특히, H.264(libx264) 및 H.265(libx265) 코덱은 소프트웨어 인코딩으로 처리할 경우 CPU 점유율이 매우 높아질 수 있으며, 대용량 실시간 영상 처리에는 병목이 발생할 수 있습니다. 이러한 상황에서 GPU 기반의 NVENC/NVDEC 가속 기능을 FFmpeg에 포함하여 사용하는 것은 실무에서 매우 유용한 전략입니다.

 

먼저 MSYS2가 설치된 경로로 이동하여 mingw64.exe를 실행합니다.

C:\msys64\mingw64.exe

관리자 권한으로 실행하는 것이 좋습니다. 일부 경로 접근이나 권한 문제를 방지할 수 있습니다.

 

🔷 CUDA Toolkit 설치 및 환경 경로 세팅

FFmpeg에서 NVENC/NVDEC 가속을 사용하려면, NVIDIA CUDA SDK가 반드시 설치되어 있어야 하며, 설치 경로를 FFmpeg 빌드 도중 인식할 수 있도록 MSYS2 환경에 명시적으로 추가해야 합니다.

 

1. NVIDIA 공식 사이트에서 본인의 그래픽카드에 맞는 CUDA Toolkit을 다운로드해 설치합니다.

2. MSYS2에서 CUDA 명령어를 인식할 수 있도록 PATH를 추가합니다.

$ export PATH="/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0/bin/":$PATH

3. 경로에 공백이 포함된 Program Files 대신, MSYS2 홈 디렉토리로 파일을 복사해 사용하는 것이 안정적입니다.

🔸 헤더파일 복사
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include
→ C:\msys64\home\ubuntu\cuda_sdk\include

🔸 라이브러리 파일 복사
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\lib\x64
→ C:\msys64\home\ubuntu\cuda_sdk\lib

이렇게 별도 폴더로 분리해두면, FFmpeg 빌드 시 경로 지정이 쉬워지고 공백 경로 이슈도 피할 수 있습니다.
테스트 환경에서는 include와 lib를 분리하지 않고 C:\msys64\home\ubuntu\cuda_sdk 에 복사하여 테스트하였습니다.

CUDA SDK 복사결과 화면 예시

 

이 과정은 FFmpeg 빌드 과정에서 CUDA 관련 컴포넌트를 연결하기 위한 기초 환경 설정 단계입니다.

특히 윈도우 환경에서는 공백 경로, 권한 문제, 경로 인식 누락 등 다양한 변수가 존재하기 때문에, 초기 CUDA 설치 및 경로 설정이 실패하면 이후 모든 빌드 과정이 무의미해질 수 있습니다.

 

2. Clang 컴파일러 설치: mingw-w64-x86_64-clang

FFmpeg를 MinGW64 환경에서 정적으로 빌드하려면, Clang/LLVM 계열의 컴파일러가 필요합니다.

기본적으로 MSYS2는 GCC를 포함하고 있지만, 정적 링크(static linking) 및 CUDA 관련 빌드 과정에서 Clang이 더 나은 호환성과 유연성을 제공합니다.


특히 FFmpeg는 CUDA, libx264, libx265 등 다양한 외부 라이브러리와 연동 시, Clang 기반 컴파일러를 사용하는 것을 공식적으로 지원하고 있으며, Windows 환경에서는 GCC보다 Clang이 의존성 제어와 경량화 측면에서 유리한 경우가 많습니다.

 

MSYS2의 pacman 패키지 매니저를 통해 다음과 같이 Clang 컴파일러를 설치할 수 있습니다

$ pacman -S mingw-w64-x86_64-clang

 

mingw-w64-x86_64-clang 패키지는 LLVM 기반의 Clang 컴파일러 + 링커(ld.lld) 를 포함하며, MinGW64 환경에 최적화된 툴체인으로 구성되어 있습니다.

 

🔷 FFmpeg에서 Clang이 필요한 이유

1. 정적 링크(Static Linking) 유연성

GCC는 동적 링크를 기본으로 처리하기 때문에, 정적 빌드를 강제하면 라이브러리 충돌이나 링커 에러가 자주 발생합니다.

반면, Clang은 -static, -static-libgcc, -static-libstdc++ 등의 플래그를 안정적으로 지원합니다.

2. CUDA 연동 및 NVENC/NVDEC 지원

Clang은 CUDA LLVM 백엔드(--enable-cuda-llvm)를 통해 CUDA 코드를 컴파일할 수 있습니다.

이를 통해 FFmpeg는 NVENC/NVDEC, cuvid, libnpp 등 GPU 가속 기능을 Clang 기반으로 안정적으로 사용할 수 있습니다.

3. libx264 / libx265과의 정적 연결

FFmpeg를 --enable-libx264 및 --enable-libx265 옵션으로 빌드할 경우, 컴파일러 호환성 문제로 GCC 기반에서는 undefined symbol 오류가 발생할 수 있습니다. Clang은 이런 호환성 문제를 덜 발생시킵니다.

 

3. nv-codec-headers 다운그레이드 및 수동 설치

nv-codec-headers는 FFmpeg에서 NVIDIA 하드웨어 인코딩(NVENC) 및 디코딩(NVDEC) 기능을 사용할 때 반드시 필요한 헤더 라이브러리입니다.

NVIDIA의 비디오 인코딩 API를 FFmpeg이 호출할 수 있도록 연결하는 역할을 하며, 해당 헤더 파일은 FFmpeg 내부에서 직접 포함하지 않고 외부 의존성으로 관리됩니다.

 

글 작성일 기준 nv-codec-headers 소스는 Version 13.0.19.0 이 설치됩니다.
ffmpeg 빌드는 정상적으로 되나 실행 중 버전 오류가 발생하여 원인을 찾던 중 ffmpeg 7.1 은 nv-codec-headers 12.2까지 지원하는 것을 확인하였습니다.
nv-codec-headers 소스의 버전을 확인하여 12.2.x 대 버전으로 변경 후 빌드 하였습니다.

 

🔷 설치 단계: 실습 절차

1. 소스 다운로드 및 특정 버전으로 전환

$ cd /home/ubuntu
$ git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
$ cd nv-codec-headers
$ git checkout n12.2.72.0

 

n12.2.72.0은 FFmpeg 7.1과 공식적으로 호환되는 안정 버전입니다.
git checkout 명령으로 버전을 명시적으로 고정하지 않으면 최신 브랜치(13.x)가 자동 적용됩니다.

 

2. 헤더 파일 수동 설치

$ make install PREFIX=/mingw64

이 명령은 /mingw64/include/ffnvcodec 경로에 헤더를 설치하며, 기본적인 설정만 적용됩니다.

 

3. pkg-config 정보 수동 설정 (매우 중요)

FFmpeg configure 단계에서 --enable-ffnvcodec 플래그를 사용하면 pkg-config를 통해 헤더 경로를 탐색하게 됩니다.

하지만 make install만으로는. pc 파일이 자동 설치되지 않으므로, 아래 작업을 수동으로 수행해야 합니다:

$ sed 's#@@PREFIX@@#C:/msys64/mingw64#' ffnvcodec.pc.in > ffnvcodec.pc
$ install -m 0755 -d '/mingw64/include/ffnvcodec'
$ install -m 0644 include/ffnvcodec/*.h '/mingw64/include/ffnvcodec'
$ install -m 0755 -d '/mingw64/lib/pkgconfig'
$ install -m 0644 ffnvcodec.pc '/mingw64/lib/pkgconfig'

이 작업을 통해 다음이 보장됩니다:

▸ FFmpeg의 configure 명령이 pkg-config로 해당 라이브러리를 정확히 인식

▸ 라이브러리 경로와 헤더 참조가 명확히 연결됨

▸ --pkg-config-flags="--static" 옵션과 충돌 없음

 

🔷 설치 확인 방법

설치가 완료되었으면 다음 명령으로 설치 버전이 제대로 인식되는지 확인합니다

$ pkg-config --modversion ffnvcodec
12.2.72.0

이와 같이 출력된다면, 이후 FFmpeg를 --enable-ffnvcodec --enable-nvenc --enable-nvdec 등의 옵션으로 빌드할 수 있습니다.

반응형

 

4. FFmpeg 7.1 빌드 설정: CUDA 가속 + 정적 링크

이 단계에서는 FFmpeg 7.1을 정적(static)으로 링크된 실행 파일로 빌드하고, 여기에 CUDA 기반 하드웨어 가속(NVENC/NVDEC) 기능을 포함시킵니다.

최종적으로 생성되는 ffmpeg.exe는 동적 DLL 의존성 없이 단독 실행 가능하며, GPU 인코딩을 지원하는 고성능 실행 파일이 됩니다.

 

✔️ FFmpeg 소스 디렉토리 이동

먼저 FFmpeg 소스 디렉토리로 이동합니다

$ cd /home/ubuntu/ffmpeg

이 위치는 사용자의 환경에 따라 다를 수 있으며, Git을 통해 소스를 클론 받은 루트 디렉토리를 기준으로 설정합니다.

 

✔️ configure 명령 실행

FFmpeg 빌드는 configure 스크립트를 실행해 빌드 옵션을 지정하고, 이후 make로 컴파일하는 구조입니다.
아래는 실무에서 많이 사용되는 구성 예시이며, 특히 CUDA 가속 + 정적 빌드라는 두 가지 목적을 함께 달성하도록 최적화된 옵션입니다:

$ ./configure --prefix=/home/ubuntu/dist \
  --arch=x86_64 --enable-static --disable-shared \
  --disable-debug --disable-doc \
  --enable-gpl --enable-version3 --enable-nonfree \
  --enable-libx264 --enable-libx265 --enable-libvpx \
  --enable-libfdk-aac --enable-libvorbis --enable-libopus \
  --enable-libmp3lame --enable-libwebp \
  --enable-openssl \
  --enable-ffnvcodec --enable-nvdec --enable-nvenc \
  --enable-cuda-llvm --enable-libnpp --enable-cuvid \
  --disable-libass --disable-iconv --disable-autodetect --disable-w32threads \
  --extra-cflags="-static -static-libgcc -static-libstdc++ -I/home/ubuntu/cuda_sdk" \
  --extra-ldflags="-static -static-libgcc -static-libstdc++ -L/home/ubuntu/cuda_sdk" \
  --pkg-config-flags="--static"

--enable-cuda-llvm, --enable-libnpp, --enable-cuvid는 CUDA Toolkit을 제대로 활용하기 위해 반드시 필요한 플래그입니다.

해당 기능들이 없으면 hevc_nvenc, h264_nvenc 등의 하드웨어 인코딩이 실패하거나 속도가 저하될 수 있습니다.

 

✔️ 빌드 및 설치

$ make -j$(nproc)
$ make install

빌드가 완료되면 /home/ubuntu/dist/bin/ffmpeg.exe 파일이 생성됩니다.

 

5. 빌드 완료 및 ffmpeg.exe 생성 확인

이제 앞 단계에서 make 및 make install이 완료되었다면, 우리가 원하는 최종 산출물인 ffmpeg.exe 실행 파일이 생성되어 있어야 합니다.

이번 단계에서는 해당 파일이 정적 링크(static linking)로 제대로 구성되었는지, 즉 외부 동적 라이브러리(DLL)에 의존하지 않고 독립적으로 실행 가능한 구조인지 확인합니다.

 

빌드 시 --prefix=/home/ubuntu/dist 옵션을 지정했기 때문에, 실행 파일은 다음 경로에 생성됩니다:

/home/ubuntu/dist/bin/ffmpeg.exe

정상적으로 빌드되었다면 위 경로에 ffmpeg.exe가 존재하며, 실행 속성상 윈도우에서 바로 실행 가능한 단일 바이너리입니다.

 

Linux 또는 MSYS2 환경에서는 ldd 명령을 통해 실행 파일이 어떤 공유 라이브러리(DLL)를 참조하는지 확인할 수 있습니다.

$ ldd /home/ubuntu/dist/bin/ffmpeg.exe

ldd /home/ubuntu/dist/bin/ffmpeg.exe 실행 결과 화면 예시
ldd /home/ubuntu/dist/bin/ffmpeg.exe 실행 결과 화면 예시

 

6. CUDA 인코딩 테스트: HEVC_NVENC 실습 예제

정적으로 빌드된 ffmpeg.exe 파일이 실제로 CUDA GPU 인코딩 기능을 사용하는지 확인하려면, 실시간 스트림을 입력으로 받아 NVIDIA NVENC 기반 H.265 인코딩을 수행하는 테스트를 실행하는 것이 가장 효과적입니다.

 

이 섹션에서는 RTSP 영상을 입력으로 받아 GPU 가속 인코딩, 간단한 필터링, 해상도 조정을 거쳐 .mp4 파일로 출력하는 과정을 실습합니다.

 

테스트 명령어 예시: RTSP 수신 → HEVC 인코딩

ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
  -i "rtsp://your_stream_address" \
  -t 10 -c:v hevc_nvenc -sn -an \
  -vf "boxblur=10:1,scale=640:480" output.mp4

RTSP 수신 → HEVC 인코딩 테스트 화면 예시
RTSP 수신 → HEVC 인코딩 테스트 화면 예시

 

결과물인 output.mp4는 GPU 가속으로 처리된 영상이며, 재생 시 hevc_nvenc 코덱 사용 여부를 확인할 수 있습니다.

hevc_nvenc 코덱 확인 화면 예시
hevc_nvenc 코덱 확인 화면 예시

 

NVENC를 활용하면 CPU 인코딩 대비 10배 이상의 처리 속도 향상을 기대할 수 있으며, 실시간 스트리밍, 대용량 영상 인코딩 파이프라인에서의 GPU 활용 여부를 조기에 판단할 수 있는 기준이 됩니다.

 

✔ 마무리

이번 실습을 통해 FFmpeg 7.1을 MinGW64 환경에서 정적으로 빌드하고, CUDA 가속까지 적용하는 과정을 직접 구성해 보았습니다.

정적 링크 방식은 배포가 간편하고, 외부 라이브러리 의존 없이 실행 가능하다는 장점이 있으며, CUDA를 통한 NVENC 인코딩은 고해상도 영상 처리 성능을 크게 향상합니다.


실무에서는 이 빌드 결과물을 활용해 GPU 기반 인코딩 자동화, RTSP 스트림 녹화 시스템, 클라이언트 없는 서버 전용 툴 등 다양한 형태로 적용할 수 있습니다.


구성 과정을 직접 관리하면 버전 충돌이나 라이브러리 문제를 사전에 제어할 수 있어, 실무 개발 환경에 보다 안정적인 인프라를 제공할 수 있습니다.

 

 

👉 관련 글 링크

1. [FFmpeg] Windows 환경에서 FFmpeg 7.1 정적 빌드하기 – MinGW64 + H.264 인코딩 지원

2. [FFmpeg] FFmpeg 7.1 + H.265(libx265) 지원 정적 빌드 – 기존 MinGW64 환경 확장

3. [FFmpeg] CUDA 가속 포함 FFmpeg 7.1 정적 빌드 – MinGW64 + libx264/x265 + NVENC

4. [FFmpeg] SHA-256 Digest 인증 대응 FFmpeg 7.1 정적 빌드 – MinGW64 + CUDA + 인증 로직 패치

5. [FFmpeg] RTSP 스트림을 fMP4로 변환해 초저지연 TCP 전송하기

6. [FFmpeg] 인코딩 실습: CPU(libx264)와 CUDA(h264_nvenc) 비교

 

반응형

※ 게시된 글 및 이미지 중 일부는 AI 도구의 도움을 받아 생성되거나 다듬어졌습니다.

반응형