FFmpeg 는 영상 및 사운드 인코딩/디코딩 전문 라이브러리이다. 이 라이브러리 안에는 x264, x265, VP8, VP9 와 같은 저명한 알고리즘들이 들어있다. 화면을 녹화하거나 실시간으로 전송 해야 할 일이 있다면, 2022년 현재로써도 x264 코덱 말고는 마땅히 뾰족한 대안이 없다. 다른 코덱을 쓸 수야 있긴 하지만 인코딩 성능이 *아직은* 많이 부담된다. 예전 글에서도 VP9 인코딩 속도가 초당 5프레임도 안 나온다고 언급 한 바 있다. (라이브러리에서 하드웨어 가속을 못 받았기 때문이다. libvpx 에서 이를 지원 해주면 참 좋을텐데 참 아쉽다.)
아직까지도 수많은 기업들에게 이 MPEG 이라는 그룹은 골칫거리다. 자사 코덱을 배포한지 오래되어, 지원하는 하드웨어도 이미 많고, 당연히 하드웨어 가속을 애진작에 지원했으므로 속도도 가장 빠르고 품질도 좋기 때문에, 기술적으로는 가장 탁월한 선택이기 때문이다. 문제는 이것저것 특허깡패라 오만곳에 특허 침해의 소지가 있다. 로열티 내야된다 이말이다. 정확하게는 FFMPEG 는 그냥 GPL이 걸린 오픈소스일 뿐이고 (이 또한 감점 요소로 평가되기도 함), 이 안에서 사용되는 알고리즘들이 특허가 걸려있어서 굳이 FFMPEG이 아니어도 해당 코덱을 사용하는 라이브러리들은 전부 특허권에서 자유롭지 못하다. libx264 같은 라이브러리가 그렇다. x264 코덱 등에 사용되는 수학적인 방법론 그 자체의 핵심적인 파트에 온갖 특허는 다 걸려있다.
이렇게 복잡한 GPL/LGPL 라이센스와 특허 문제를 피하기 위해 구글과 어도비, 하여튼 당신이 알 만한 대부분의 기업이 libvpx, libaom 같은 차세대 코덱을 만들기 시작했다. 하지만 MPEG이 영상 압축에대한 핵심적인 알고리즘 자체에 특허를 다 걸어놔서, 작업이 쉽지는 않은 모양이다. 별로 놀랍지는 않지만 애플은 MPEG편인데, 아마 MPEG 특허권중 일부를 갖고 있어 이권을 유지하기 위함으로 보인다. 어쨋든 libvpx 를 빌드하는 방법을 알고 싶다면 아래 글을 참조 하자.
FFmpeg 라이브러리는 그럼에도 불구하고 많은 사랑을 받는 라이브러리기도 하다. 법인도 아니고, 대규모 서비스를 만들 일이 잘 없는 개인 입장에서는 갖다 쓰기도 쉽고 성능도 좋기 때문이다. 우선 빌드를 해보자. 아 ! Visual Studio 는 당연히 설치 되어 있어야 한다 !
여태 FFmpeg 빌드 방법을 알려주던 블로그 글이나 포럼 글들은 대부분은 도움이 안 됐고, 가장 크게 와닿고 실질적으로 큰 도움이 되었던 글은 바로 이것이었다. 이것저것 치덕치덕 설치해야되는게 별로 없어서 마음에 들었다.
https://stackoverflow.com/questions/41358478/is-it-possible-to-build-ffmpeg-x64-on-windows
이 질문의 답변자가 작성한 가이드를 한번 따라가보자.
우선 MSYS2(설치)와 yasm(단일 exe), 그리고 FFmpeg(이제 우리가 빌드할 소스) 부터 받아놓고 숨좀 돌리자. MinGW나 MSYS, Strawberry Perl 같은걸 설치해서 빌드하는 스타일은 정말 정말 싫어하지만, 그나마 FFmpeg 는 MSYS 하나만 설치하면 되기 때문에 부담이 적다. 그리고 이거 말고 마땅한 대안도 없다...
http://yasm.tortall.net/Download.html
https://github.com/FFmpeg/FFmpeg
1. 준비 되었다면 MSYS2 설치부터 하자. 나는 C:\ 바로 밑에 DEV 라는 폴더를 따로 만들어서 그 안에 설치 했다. 딱히 그래야만 되는건 아닌데, 그냥 나중에 관리하기 편할것 같아서 그렇게 만든것이니 편한대로 설치 하자. 그리고 받은 yasm어쩌구.exe 는 얌전하게 yasm.exe 라는 이름으로 바꿔서 MSYS가 설치된 경로에 같이 넣어준다. 이렇게.
2. 설치한 msys 폴더 안쪽에 usr\bin 에 들어가보면 link.exe 가 있다. 이 파일 이름을 아무거나 다른 이름으로 바꿔주자. 아니면 환경변수 우선순위를 조절 해줘도 되지만, 일단은 언급했던 스택오버플로 게시물을 따라보자.
3. MSYS 실행해서 pacman -S make gcc diffutils 명령 실행
다 됐으면, 이 MSYS 는 종료 해준다.
4. 비주얼스튜디오 프롬프트를 "관리자 모드" 로 실행한다. x64 빌드를 하고싶다면 프롬프트도 x64 를 실행해야한다. x86_64 크로스를 하고싶다면 마찬가지로 x86_64 프롬프트로 열면 된다.
그리고 이 프롬프트에서 MSYS를 실행하자. 그러면 MSYS도 관리자모드로 실행되어, 쉘에 $ 대신 #이 떨어진다. 굳이 프롬프트에서 다시 MSYS 를 실행 시키는 이유는, 비주얼스튜디오 개발 프롬프트가 가지고 있는 빌드 환경을 이 MSYS에 전달해주기 위함이다. 그래야 MSYS에서 gcc 를 실행할때 비주얼스튜디오의 컴파일러와 링커를 가져다 쓸테니까.
> <MSYS 설치경로>\msys2_shell.cmd -msys -use-full-path
ex : C:\DEV\msys64\msys2_shell.cmd -msys -use-full-path
이렇게 실행된 MSYS 쉘에 which cl 과 which link 를 쳤을때, 비주얼스튜디오의 컴파일러와 링커가 잡혀있어야 한다.
아까 link.exe 이름을 다른것으로 바꾼것은 MSYS 자체 링커를 못 찾게 해서, 비주얼스튜디오의 링커로 대체시키기 위한 조치였다.
5. 이제 이 MSYS 쉘에서 아까 받아둔 ffmpeg 소스 경로로 이동하자. (ex : cd /c/Users/nitwit/ffmpeg/)
> cd <ffmpeg 경로>
왠만한 오픈소스들이 다 그렇듯 configure 를 실행해서 make 환경을 구성해주면 된다.
./configure --help 를 쳐보면 이것저것 설명이 나오니까 추후에 세부 옵션 조정이 필요할때 천천히 둘러봐서 적당한 옵션을 켜고 끄면 된다. 나는 이렇게 실행했다.
> ./configure --toolchain=msvc --arch=x86_64 --enable-yasm --disable-x86asm --enable-asm --enable-shared --enable-w32threads --disable-programs --disable-doc --disable-static --prefix=/c/ffmpeg3.3/DLLS
경로가 C:\ 처럼 관리자 권한 있어야 접근 되는 경로일 경우, MSYS가 관리자모드로 실행중이지 않으면 당연히 에러가 난다. 당황하지 말고, 관리자모드로 다시 실행해주자.
시간이 조금 걸리는데, 정상적으로 실행 되고나면 이렇게 끝난다. 이제 make 해주면 된다.
> make -j <스레드 갯수>
VS의 컴파일러와 링커로 빌드가 시작된다. 빌드 중 warning 이 좀 보이긴 하지만, 큰 문제 없으므로 그냥 화면을 감상해주면 된다. 시간이 좀 걸린다.
마지막으로 make install 을 실행하면 빌드된 라이브러리들이 한데 모인다.
다 되고나면 configure 실행시 지정했던 --prefix 경로에 이쁘게 정리 된다.
bin 안쪽에는 빌드된 .lib 와 .dll 들이 있고, include 에는 ffmpeg의 헤더파일이 있다. 오픈소스 많이 쓰는 사람에게는 익숙한 구성일 것이다. 이제 개발 환경에 맞게 입맛대로 링크 해서 쓰면 된다.
이 모든 과정은 말 그대로 뻘짓이었다. 소스 하나 빌드 하려고 이렇게 까지 해야하는지 솔직히 잘 모르겠지만, 이게 그래도 내가 봤던 빌드 방법 중에 제일 뒤 탈 없고 깔끔하고 짧은 빌드 방법이다.
아무리 그래도 이건 너무 귀찮으므로 여기 그 결과물을 첨부 하니 받아서 사용 해도 좋다. 2022년 02월 08일 기준으로 빌드 되었으니, 시간이 지나 너무 오래 되었다 싶으면 새로 빌드해서 쓰도록 하자.
2022.02.22 : 이 빌드된 버전은 SSE, AVX 같은 CPU 가속 명령어를 사용하지 않는 것으로 빌드 되어 sws_scale 같은 함수도 많이 느리다. (초당 5프레임) soen.kr 의 ffmpeg 강좌를 보면 사이트 운영자가 업로드해둔 ffmpeg 라이브러리가 있는데, 그 빌드 버전은 CPU 가속이 지원되어 속도가 빠르다 (100-120 프레임)
시간이 되면, 관련 옵션을 다시 찾아보고 적용하여 CPU 가속이 되도록 빌드하여 다시 올릴 예정이다... 어? 그러고보니 libvpx도 느렸던 이유가 설마?
'뻘짓' 카테고리의 다른 글
유니코드 - UTF8 변환 코드 (0) | 2022.07.04 |
---|---|
디스어셈블 라이브러리 "Capstone" 빌드 및 사용법 (2) | 2022.04.28 |
[짧은글] 블루투스 페어링 : sspmode 0 (0) | 2021.12.10 |
와이파이 끊김이 심하다면 (2) | 2021.04.20 |
Raw소켓에 대해서... (1) | 2021.03.29 |