리눅스에 직접 설치한 Plex Media Server 에서 한글 자막이 보이지 않는 문제와, 내장 GPU 로 트랜스코딩을 돌리는 설정을 정리한다. 두 가지는 얽혀 있다. 자막을 영상에 태워 내보내는 경로(burn-in) 는 트랜스코더를 거치므로, 하드웨어 가속 설정이 자막 표시에 영향을 준다.
| 유형 | 증상 |
|---|---|
| 인코딩 | 자막이 깨져 보이거나 아예 무시된다 |
| 폰트 | 자막 자리는 잡히는데 글자가 안 보이거나 네모로 나온다 |
| 트랜스코더 | 자막 트랙은 목록에 있는데 화면에 아무것도 안 나온다 |
순서대로 배제해 나간다.
Plex 는 UTF-8 을 기준으로 다룬다. 윈도우에서 받은 자막은 CP949 인 경우가 많다.
file -i movie.ko.srt
charset=iso-8859-1 이나 unknown-8bit 로 나오면 변환한다.
iconv -f cp949 -t utf-8 movie.ko.srt -o movie.ko.utf8.srt
mv movie.ko.utf8.srt movie.ko.srt
이미 charset=utf-8 이면 인코딩은 원인이 아니다. 다음으로 넘어간다.
Plex 는 자막을 영상 위에 그려 넣을 때 시스템 폰트를 쓴다. CJK 폰트가 하나도 없으면 한글이 렌더링되지 않는다.
Rocky · RHEL 9 계열에서는 패키지 이름이 배포판마다 달라 그대로 붙여 넣으면 찾지 못하는 경우가 많다. 먼저 검색해서 실제 이름을 확인한다.
dnf search noto | grep -i cjk
dnf search nanum
일반적으로 다음이 있다.
dnf install -y google-noto-sans-cjk-ttc-fonts fontconfig
나눔 폰트는 EPEL 에 있는 경우가 많다.
dnf install -y epel-release
dnf install -y naver-nanum-gothic-fonts
저장소에 없으면 직접 넣는다. 배포 파일을 받아 시스템 폰트 디렉터리에 풀고 캐시를 갱신한다.
mkdir -p /usr/share/fonts/nanum
unzip -q NanumFont_TTF_ALL.zip -d /usr/share/fonts/nanum
fc-cache -fv
fc-list | grep -i nanum
fc-list 에 나오지 않으면 폰트가 설치된 것이 아니다. 경로와 권한을 확인한다.
폰트도 있고 인코딩도 맞는데 자막이 안 보이면 트랜스코딩 경로를 본다. 로그를 먼저 읽는다.
LOG="/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Logs/Plex Media Server.log"
grep -i subtitle "$LOG" | tail -n 30
grep -i transcode "$LOG" | tail -n 30
하드웨어 가속 경로가 자막 오버레이를 처리하지 못해 실패하는 경우가 있다. 확인 방법은 간단하다. Plex 웹 UI 의 설정 → 트랜스코더에서 하드웨어 가속을 잠시 끄고 같은 영상을 다시 재생한다. 자막이 나오면 원인이 확정된다.
설정은 웹 UI 에서 바꾼다. Preferences.xml 을 직접 편집하는 방법이 돌아다니지만, Plex 가 실행 중일 때 고치면 종료하면서 덮어써 버린다. 굳이 편집해야 한다면 서비스를 완전히 멈춘 뒤에 한다.
systemctl stop plexmediaserver
# 편집
systemctl start plexmediaserver
SMI 는 태그 구조가 느슨해 파일마다 편차가 크다. UTF-8 이어도 Plex 가 파싱하지 못하는 경우가 있다.
grep -i -m 5 "<sync" movie.ko.smi
정상적인 형태는 다음과 같다.
<SYNC Start=0><P Class=KRCC>첫 줄</P></SYNC>
<SYNC Start=3000><P Class=KRCC>둘째 줄</P></SYNC>
<P> 가 빠져 있거나 닫히지 않은 파일이 흔하다. 가장 확실한 해결은 SRT 로 변환하는 것이다. Plex 는 SRT 를 가장 안정적으로 다룬다.
ffmpeg -sub_charenc UTF-8 -i movie.ko.smi movie.ko.srt
변환이 실패하면 SMI 전용 변환 도구를 쓰거나, 태그가 깨진 줄을 찾아 고친다.
파일 이름 규칙도 지켜야 Plex 가 자막을 영상에 붙인다. 영상 파일 이름과 같게 하고 언어 코드를 붙인다.
Movie.Name.S01E01.mkv
Movie.Name.S01E01.ko.srt
Ryzen 의 내장 Radeon 그래픽은 VAAPI 로 트랜스코딩을 넘길 수 있다. CPU 부하가 크게 줄어든다.
드라이버와 확인 도구를 설치한다.
dnf install -y mesa-va-drivers libva-utils
vainfo
vainfo 출력에 VAProfileH264* 항목이 보이면 H.264 디코드와 인코드를 지원한다. HEVC 는 VAProfileHEVCMain 이다. 세대에 따라 지원 코덱이 다르고, AV1 인코딩은 대체로 지원하지 않는다.
렌더 노드 접근 권한이 필요하다.
ls -l /dev/dri/
usermod -aG video,render plex
systemctl restart plexmediaserver
Plex 는 하드웨어 가속이 Plex Pass 구독 기능이다. 구독이 없으면 설정 화면에 항목이 나오지 않거나 켜도 소프트웨어로 돈다.
전송 중인 세션이 실제로 하드웨어를 쓰는지는 대시보드에서 확인한다. 세션 정보에 (hw) 표시가 붙는다.