본문 바로가기
잡(job)기술/ffmpeg 라이브러리

remuxing.c 빌드하기

by 무니이구나 2022. 3. 28.

영상 혹은 음성 데이터를 처리하는 업무를 종종 하게 된다. ffmpeg 라이브러리 도움을 많이 받는다. 특정 포멧의 미디어 데이터를 입력으로 해서 다른 포멧의 미디어 데이터를 만들어내야 하는 기능이 필요한 상황이 발생했다. 소스 영상(H.264)의 코덱은 유지해도 되는 상황이라 이에 딱 맞게도 ffmpeg 소스에 remuxing.c 라는 예제가 있다. 이것을 실제로 빌드해서 실행해보는 과정을 정리한다.

우선 ffmpeg 라이브러리가 필요하다. 개발용 패키지를 받는 방법, 이미 빌드해서 배포하고 있는 바이너리를 이용하는 방법, 직접 소스를 받아 빌드하는 방법 등이 있지만, 직접 소스를 받아 빌드하되 이를 쉽게 할 수 있도록 해주는 vcpkg를 이용해서 빌드한다. vcpkg는 다음 링크에서 한글로도 친절하게 설명하고 있으니, 이를 참조해서 설치한다.

vcpkg 설치하기

https://github.com/microsoft/vcpkg/blob/master/README_ko_KR.md

 

GitHub - microsoft/vcpkg: C++ Library Manager for Windows, Linux, and MacOS

C++ Library Manager for Windows, Linux, and MacOS. Contribute to microsoft/vcpkg development by creating an account on GitHub.

github.com

 

vcpkg를 통해 ffmpeg 라이브러리 설치하기

vcpkg를 이용하면 ffmpeg 라이브러리를 소스 레벨에서 쉽게 빌드해서 사용할 수 있다.

vcpkg install ffmpeg

설치 중에 종속성이 있는 라이브러리가 있어서 오류가 날 수 있다. 필요로 하는 패키지를 vcpkg를 통해 같은 방법을 추가해주면 된다.

 

cmake용 프로젝트 구성하기

빌드용 툴로 cmake를 이용한다. CLion 과 같은 IDE를 이용하면 쉽게 만들 수 있다. 일반 테스트 편집기로 작성해도 괜찮다. 프로젝트용 디렉토리를 하나 만든 후, 우선 CMakeLists부터 작성한다.

cmake_minimum_required(VERSION 3.0)
project(remuxing)

set(CMAKE_CXX_STANDARD 17)

find_package(FFMPEG)

add_executable(remuxing remuxing.c)

target_include_directories(remuxing PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(remuxing PRIVATE ${FFMPEG_LIBRARIES})

add_executable 에 이미 설정했지만, remuxing.c 라는 파일은 ffmpeg 소스의 examples 에 포함되어 있는 코드이다. vcpkg에서 이미 빌드할 때 다운로드 받았을 것이기 때문에 이를 복사하도록 한다. 위치는 {vcpkg 설치 위치}/installed/x64-windows/share/ffmpeg/examples/ 이다.

 

빌드하기

cmake에서 vcpkg를 이용해서 빌드하도록 하려면, CMAKE_TOOLCHAIN_FILE 값에 vcpkg의 cmake용 설정 파일을 지정해줘야 한다. cmake로 빌드할 스크립트를 만들어줄 때 다음과 같이 명령을 실행한다.

cmake -S. -Bcmake-build-debug -DCMAKE_TOOLCHAIN_FILE={vcpkg 설치 위치}/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Debug

cmake-build-debug 빌드를 위한 스크립트가 생성된다. 실제 빌드하기 위해서는 다음을 실행하면 된다.

cd cmake-buld-debug
cmake --build .

정상적으로 빌드가 된다면, cmake-build-debug 디렉토리에 remuxing 이라는 실행 파일이 생성된다.

 

CMakeLists 좀 더 보기

find_package(FFMPEG) 이라는 명령은 {vcpkg 설치 위치}/installed/x64-windows/share/ffmpeg 에 FindFFMPEG.cmake를 이용하기 위함이다. vcpkg를 통해서 모듈을 설치하게 되면 {vcpkg 설치 위치}/installed/x64-windows/ 에 결과물이 설치된다. find_package()는 module과 config 방식으로 찾는 방식이 다른데, 기본으로 module 방식을 이용하며, 이 때 Find{module 이름}.cmake 파일을 찾아서 실행하게 된다. FFMPEG 이라고 파라메터로 넘겨줬기 때문에 FindFFMEPG.cmake 를 이용해서 빌드하게 된다.

target_include_directories()과 target_link_libraries() 에 뜬금없이 FFMPEG_INCLUDE_DIRSFFMPEG_LIBRARIES 값을 참조한다. 이것은 FindFFMPEG.cmake 에서 결과로 나오는 값이다. 실제로 이 파일을 열어보면 주석 부분에 참조할 수 있는 결과값이 명기되어 있다.

 

소스 저장소

작성한 코드는 깃헙에 업데이트한다.

https://github.com/moonyl/rtsp-to-web-live.git

 

moonyl/rtsp-to-web-live

Contribute to moonyl/rtsp-to-web-live development by creating an account on GitHub.

github.com