라즈베리파이3에서 그래픽가속을 이용해 1080p 60fps h264를 재생할 수 있는 FFmpeg와 mpv 빌드하기 by IngyeoSays

라즈베리파이에는 omxplayer가 기본으로 설치되어 있고 성능도 그럭저럭 쓸 만 하지만 srt자막만을 지원하는 불편함이 있기 때문에 smi자막들을 일일이 srt로 변환하는 작은 불편함을 극복하기 위해 오늘은 FFmpeg와 mpv를 직접 빌드해 사용해 보려 합니다.
이런 고생을 하지 않아도 kodi가 성능도 괜찮고 자막도 지원하지만 저는 동영상을 보기 위해 매번 kodi를 실행하기 싫어요.

저는 이 작업을 위해 여러 웹문서를 참고하여 시행착오를 겪었으며 그 중 제가 성공한 아래 링크의 내용을 기반으로 미세한 부분만 조금 수정하여 이 문서를 작성합니다. 
저는 설치 과정만을 단순히 서술하고, 각각 소프트웨어의 설치 이유라든지 긴 설명은 원문 링크를 참조하시면 되겠습니다.



1단계: 빌드 전 사전작업으로 라즈비안을 최신 상태로 업데이트 합니다.

sudo apt-get update
sudo apt-get dist-upgrade


2단계: 의존성 소프트웨어 설치

sudo apt-get install automake checkinstall libsdl2-dev libva-dev libluajit-5.1-dev libtool libvdpau-dev libxcb-shm0-dev texinfo libfontconfig1-dev libfribidi-dev python-docutils libbluray-dev libjpeg-dev libtheora-dev libvorbis-dev libgnutls28-dev linux-headers-rpi2 libomxil-bellagio-dev


3단계: 빌드 작업에 필요한 디렉토리를 만듭니다.

cd ~
mkdir FFmpeg_Build
sudo mkdir -p /usr/share/doc/lame


4단계: x264 VIDEO ENCODER 빌드하기

cd ~/FFmpeg_Build

wget https://download.videolan.org/x264/snapshots/x264-snapshot-20180125-2245-stable.tar.bz2

tar jxvf x264-snapshot-20180125-2245-stable.tar.bz2
cd x264-snapshot-20180125-2245-stable

./configure --prefix=/usr --enable-shared --disable-opencl --extra-cflags="-march=armv8-a+crc -mfpu=neon-fp-armv8 -mtune=cortex-a53"

*아래 명령은 바이너리를 빌드합니다. -j2 옵션은 코어를 2개 사용한다는 의미이며, -j4 옵션을 주면 코어 4개를 모두 사용할 수 있으나 작업 도중 발열이나 CPU과부하로 라즈베리파이가 멈출 수도 있으므로 저는 안전하게 두 개만 사용하는 것을 기준으로 작성합니다.
 
make -j2

*checkinstall 을 실행하면 질문에 순서대로 y, x264 입력, 이후 리스트 메뉴가 나오는데 3을 입력해 Version 옵션을 선택한 후 버전 넘버로 20180125를 입력하고 엔터,엔터.

sudo checkinstall make install

sudo ldconfig


5단계: fdk-aac AAC 오디오 인코더 빌드하기

cd ~/FFmpeg_Build

wget https://downloads.sourceforge.net/opencore-amr/fdk-aac-0.1.5.tar.gz

tar xzvf fdk-aac-0.1.5.tar.gz

cd fdk-aac-0.1.5

./autogen.sh

./configure --prefix=/usr --enable-shared

make -j2

*checkinstall 을 실행하면 질문에 순서대로 y, AAC-FDK, 엔터키 입력 
sudo checkinstall make install

sudo ldconfig


6단계: libvpx VP9비디오 인코더 빌드하기

cd ~/FFmpeg_Build

wget http://storage.googleapis.com/downloads.webmproject.org/releases/webm/libvpx-1.6.1.tar.bz2

tar jxvf libvpx-1.6.1.tar.bz2

cd libvpx-1.6.1

./configure --prefix=/usr --enable-shared --disable-examples --disable-unit-tests --enable-vp9-highbitdepth

make -j2

*checkinstall 을 실행하면 질문에 순서대로 y, VP9, 엔터 키 입력

sudo checkinstall make install

sudo ldconfig


7단계: opus 오디오 인코더 빌드하기

cd ~/FFmpeg_Build

wget https://archive.mozilla.org/pub/opus/opus-1.2.1.tar.gz

tar xzvf opus-1.2.1.tar.gz

cd opus-1.2.1

./configure --prefix=/usr --enable-shared

make -j2

*checkinstall 실행후 질문에 순서대로 y, Opus, 엔터 입력

sudo checkinstall make install

sudo ldconfig


8단계: lame mp3 오디오 인코더 빌드하기

cd ~/FFmpeg_Build

wget https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz

tar xzvf lame-3.100.tar.gz

cd lame-3.100

./configure --prefix=/usr --enable-shared

make -j2

*checkinstall 실행 후 순서대로 y, MP3-LAME, 엔터 키 입력

sudo checkinstall make install

sudo ldconfig


9단계: libass 자막 랜더러 빌드하기

cd ~/FFmpeg_Build

wget https://github.com/libass/libass/releases/download/0.13.7/libass-0.13.7.tar.gz

tar zxvf libass-0.13.7.tar.gz

cd libass-0.13.7

./configure --prefix=/usr --enable-shared

make -j2

*checkinstall 실행 후 질문에 순서대로 y, libass, 엔터 키 입력

sudo checkinstall make install

sudo ldconfig


10단계: FFmpeg빌드하기

cd ~/FFmpeg_Build

wget https://www.ffmpeg.org/releases/ffmpeg-3.4.1.tar.bz2

tar jxvf ffmpeg-3.4.1.tar.bz2

cd ffmpeg-3.4.1

./configure --prefix=/usr --enable-gpl --enable-nonfree --enable-static --enable-libx264 --enable-libfdk-aac --enable-libvpx --enable-libopus --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-omx --enable-omx-rpi --enable-mmal --enable-libxcb --enable-libfreetype --enable-libass --enable-gnutls --disable-opencl --extra-cflags="-march=armv8-a+crc -mfpu=neon-fp-armv8 -mtune=cortex-a53"

*이번 빌드 작업은 소스코드가 가장 방대하기 때문에 25분 이상의 시간이 걸립니다. 작업 도중 건드리지 말고 최대한 내버려두되 도중에 화면이 꺼져 상태를 확인하려거든 쉬프트 키를 눌러 모니터를 깨웁시다. 
혹시 작업 도중 라즈베리파이가 아예 멈춰 강제 재부팅을 해야 하는 경우 작업 폴더(ffmpeg-3.4.1)를 삭제한 후 10단계를 처음부터 다시 시작해야 합니다. 저는 make -j4로 작업하다 라즈베리파이가 과열로 뻗어서 한 번 재시도했습니다. 다른 모든 작업을 -j4로 했더라도 이 빌드작업만큼은 -j2옵션을 추천.
 
make -j2

*checkinstall 실행 후 순서대로 y, FFmpeg, 엔터 키 입력 

sudo checkinstall make install

sudo ldconfig


11단계: MPV 빌드하기

sudo wget -P /opt/vc/lib https://github.com/raspberrypi/firmware/raw/master/hardfp/opt/vc/lib/libEGL.so

sudo wget -P /opt/vc/lib https://github.com/raspberrypi/firmware/raw/master/hardfp/opt/vc/lib/libGLESv2.so

sudo wget -P /opt/vc/lib/pkgconfig https://github.com/raspberrypi/firmware/raw/master/hardfp/opt/vc/lib/pkgconfig/egl.pc

sudo wget -P /opt/vc/lib/pkgconfig https://github.com/raspberrypi/firmware/raw/master/hardfp/opt/vc/lib/pkgconfig/glesv2.pc

cd ~/FFmpeg_Build

wget https://github.com/mpv-player/mpv/archive/v0.27.0.tar.gz

tar zxvf v0.27.0.tar.gz

cd mpv-0.27.0

./bootstrap.py

다음은 방금 다운로드 받아 압축을 해제한 mpv-0.27.0 디렉토리 안의 wscript 파일을 수정해야 합니다.
vim 이나 nano, 혹은 GUI용 에디터를 써도 좋습니다.

wascript 파일을 열어 아래 내용을 찾습니다.

-------------------------------------------------------------
'name': '--rpi',
'desc': 'Raspberry Pi support',
'func': compose_checks(
check_cc(cflags="-isystem/opt/vc/include/ "+
"-isystem/opt/vc/include/interface/vcos/pthreads " +
"-isystem/opt/vc/include/interface/vmcs_host/linux " +
"-fgnu89-inline",
linkflags="-L/opt/vc/lib",
header_name="bcm_host.h",
lib=['mmal_core', 'mmal_util', 'mmal_vc_client', 'bcm_host']),
# We still need all OpenGL symbols, because the vo_opengl code is
# generic and supports anything from GLES2/OpenGL 2.1 to OpenGL 4 core.
check_cc(lib="EGL"),
check_cc(lib="GLESv2"),
-------------------------------------------------------------

여기서,

lib=['mmal_core', 'mmal_util', 'mmal_vc_client', 'bcm_host']),
# We still need all OpenGL symbols, because the vo_opengl code is
# generic and supports anything from GLES2/OpenGL 2.1 to OpenGL 4 core.
check_cc(lib="EGL"),

부분을 아래 내용으로 변경해 줍니다.

lib=['mmal_core', 'mmal_util', 'mmal_vc_client', 'bcm_host', 'vchostif']),
# We still need all OpenGL symbols, because the vo_opengl code is
# generic and supports anything from GLES2/OpenGL 2.1 to OpenGL 4 core.
check_cc(linkflags="-lbrcmGLESv2", lib="EGL"),

수정이 끝났으면 문서를 저장하고 터미널로.

export LIBRARY_PATH=/opt/vc/lib

export PKG_CONFIG_PATH=/opt/vc/lib/pkgconfig

export CPATH=/opt/vc/include

./waf configure --prefix=/usr --enable-rpi

./waf build -j2

*checkinstall 실행후 순서대로 y, mpv, 엔터 키 입력

sudo checkinstall ./waf install

sudo ldconfig

이제 mpv 설정파일을 생성합니다.

mkdir -p ~/.config/mpv
echo -e "--fullscreen\nrpi-background=yes\nsub-codepage=cp949" > ~/.config/mpv/mpv.conf

sudo chown -R $LOGNAME:$LOGNAME ~/.config/mpv

라즈베리파이의 메뉴->기본설정(Preferences)->Raspberry Pi Configuration-> Performance
에서 GPU Memory 를 160MB로 수정하고 재부팅


12단계: mpv를 기본 동영상 플레이어로 설정하고 동영상을 우클릭해서 "MPV로 열기"기능을 사용할 수 있도록 설정

동영상 파일을 우클릭해 "Open With..."를 선택
"Custom Command Line" 탭 클릭
"Command line to excute" 박스에 mpv %f 입력
"Excute in terminal emulator" 체크
"Keep terminal window open after command excution" 체크
"Application name" 박스에 MPV 입력 
"Set selected application as default action for this file type" 체크
OK 버튼을 누르고 동영상이 재생되기 시작하면 q를 눌러 재생을 종료
이 과정을 원하는 모든 동영상 확장자마다 실행해 주면 됩니다.


13단계: 마지막으로, 빌드한 프로그램들을 업데이트 되지 않도록 "Pinning"작업을 해야 합니다.

애써 빌드한 소중한 아이들을 실수로 업데이트하다 덮어씌워 버리지 앉도록 보호해야죠.

즐겨 쓰는 에디터를 이용해 /etc/apt/preferences 를 열어서 아래 내용을 복사해 붙여넣고 저장합니다.

Package: ffmpeg
Pin: version 3.4.1-1
Pin-Priority: 1001

Package: mpv
Pin: version 0.27.0-1
Pin-Priority: 1001

Package: libass
Pin: version 0.13.7-1
Pin-Priority: 1001

Package: x264-snapshot-20180125-2245
Pin: version 20180125-1
Pin-Priority: 1001

Package: fdk-aac
Pin: version 0.1.5-1
Pin-Priority: 1001

Package: libvpx
Pin: version 1.6.1-1
Pin-Priority: 1001

Package: opus
Pin: version 1.2.1-1
Pin-Priority: 1001

Package: lame
Pin: version 3.100-1
Pin-Priority: 1001

*mpv의 기본 단축키

f : 풀스크린 토글
스페이스바 : 재생/멈춤
좌우 방향키 : 건너뛰기(6초)
위아래 방향키 : 건너뛰기 (1분)
9,0 : 볼륨 다운, 업
o : OSD표시 토글
q : 종료

mpv를 이용해 동영상을 재생할 때에 터미널이 실행되는데 mpv의 단축키 입력을 터미널이 받기 때문에 터미널은 열려 있어야 하며, 다른 터미널이 열려 있으면 단축키 입력이 제대로 되지 않을 수 있습니다.
또한, 단축키 입력을 터미널로 받기 때문에, 다른 기기에서 ssh로 라즈베리파이에 접속해 원격으로 mpv를 실행해 동영상을 재생한 경우라면 단축키를 ssh클라이언트 쪽에서 입력해 리모콘처럼 사용할 수 있습니다. 



덧글

  • 셈숭 2018/08/19 16:24 # 삭제 답글

    자세한 설명 잘보고갑니다
    에러없이 잘 빌드되고 설치된거같아요
  • IngyeoSays 2018/08/19 21:44 #

    도움이 되었다니 다행입니다. 덧글 감사합니다. ^^
댓글 입력 영역