https://jellyfin.org/docs/general/administration/hardware-acceleration/

 

Hardware Acceleration | Jellyfin

Jellyfin supports hardware acceleration (HWA) of video encoding/decoding using FFMpeg.

jellyfin.org

4k영상이 재생이 안되길래 젤리핀에 하드웨어 가속을 지원하기 위해 위 페이지를 찾았다.

원래 오래된 nvidia모델을 사용하고 있었는데 nvenc는 지원되지 않았다.

그래서 인텔 3세대 내장그래픽의 va-api를 사용하려는데 잘 되지 않았다.

그래서 gtx1050시리즈를 중고로 구매했다.

처음에는 삑 소리만 나고 진행이 안되었는데 메인보드 개발사는 홈페이지가 사려져서

예전에 받아둔 바이오스를 설치하니 되었다.

윈도우즈 정품인증이 없어질까봐 걱정했는데 계정을 연결해두었더니 없어졌다가 자동으로 재인증되었다.

위의 페이지의 설명엔 우분투에서 직접 nvenc를 적용하는 방법이 나오지 않았다.

그래서 docker를 깔아보고 lxc도 알아보았다.

리눅스에서도 docker를 사용해보고 윈도우 wsl2에도 docker를 사용해보았는데 잘 안되었다.

 

물론 아래 페이지를 링크해두었지만 다른 부분에는 설명이 있어 설명을 찾아보다 삽질을 한 것이다.

https://trac.ffmpeg.org/wiki/HWAccelIntro

 

HWAccelIntro – FFmpeg

Many platforms offer access to dedicated hardware to perform a range of video-related tasks. Using such hardware allows some operations like decoding, encoding or filtering to be completed faster or using less of other resources (particularly CPU), but may

trac.ffmpeg.org

 

https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new

 

Video Encode and Decode GPU Support Matrix

Find the related video encoding and decoding support for all NVIDIA GPU products.

developer.nvidia.com

자신의 gpu가 nvenc nvdec를 지원하는지 알고 싶다면 위의 링크를 찾아보자

 

처음에는 개발환경을 우분투 서버로 했었다.

하지만 개발해보면서 여러가지 문제점이 보였다.

그래픽 드라이버를 설치하면 cli에서 잘 되지 않는 문제가 있었다.

nomodeset을 적용하면 사용할 순 있지만 nomodeset상태에서

드라이버가 제대로 작동하는지 모르겠어서 그냥 desktop을 설치했다.

그랬더니 부팅이 잘 되었다.

하지만 일부러 cli모드로 변경하면 역시 잘 나오지 않고 nomodeset을 추가 해주어야 했다.

nomodeset 상태에서도 nvenc는 잘 작동되었고 jellyfin 하드웨어 가속도 잘 되었다.

 

우분트 데스크탑을 깔때 리눅스 상에서 추천해주는 드라이버를 사용했었는데 nvenc가 작동하지 않았다.

리눅스 상에서 기본적으로 지원해주는 드라이버를 받지 말고 최신의 nvidia linux 드라이버를 설치해야 한다.

 

그리고 기본적으로 설치되는 nouveau 드라이버를 블랙리스트에 추가해주었다. 이건 필수적인지 아닌지 모르겠다.

이걸 하기전에 오류가 발생했는데 한 뒤로 오류가 안 생겼다. 안정성을 위해 해주는게 좋을 것 같다.

sudo nano /etc/modprobe.d/blacklist-nouveau.conf

아래 두 줄을 입력해주고 ctrl+o로 저장하고 엔터 ctrl+x로 종료한다.

blacklist nouveau
options nouveau modeset=0
update-initramfs -u
reboot

jellyfin을 사용하다보니 알게 되었는데 jellyfin 자체에 ffmpeg를 내장하고 있었다.

아래 명령어를 실행해보니 에러가 나면서 중단되었다.

아무래도 ffmpeg 컴파일 과정은 필수적인거 같다.

ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4

위의 HWAccelIntro 링크에서 nvidia설명대로 해주었다.

 

먼저 nvidia의 cuda/nvenc/nvdec를 사용할 수 있도록 헤더를 받아서 메이크하고 인스톨 한다.

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
make
sudo make install

https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

 

CompilationGuide/Ubuntu – FFmpeg

Compile FFmpeg for Ubuntu, Debian, or Mint This guide for standard support releases of Ubuntu, Debian, and Linux Mint and will provide a local, non-system installation of FFmpeg with several external libraries. You may also refer to the Generic Compilation

trac.ffmpeg.org

나머지는 항목이 길어서 위의 링크에 써져있는 내용대로 차례대로 실행해주면 된다.

중간중간 문제가 있었다.

bin 폴더를 ffmpeg_build의 서브폴더로 지정하라는게 있어서 몇 군데 수정해주었다.

우분투 20.04에서 실행하라는 내용도 실행해야 오류가 안생긴다.

그 외에도 libaom이 불안정하다고 해서 설치안했더니 에러가 났는데

선택해서 할거면 설치안한 항목은 enable->disable로 바꿔주자.

 

/home/username/bin폴더에 ffmpeg_build/bin에 있던 파일들을 복사해준다.

여기서 username은 사용자 계정명으로 바꿔주야 한다.

그리고 ffmpeg_source/ffmpeg 에 bin 폴더의 파일들과 아이콘이 같은 항목들도 복사해준다.

그리고 ffmpeg의 마지막 명령어를 다시 실행한다.

 

그리고 제대로 설치 되었는지 확인하려면 아래 명령어를 쳐서 나오는 코덱이 있는지 확인하자

ffmpeg -encoders 2>/dev/null | grep nvenc
ffmpeg -decoders

위의 명령어를 치면 지원되는 디코더가 전부 나오는데 설명에 cupid가 있는 것이 하드웨어 가속을 지원한다.

 

하드웨어 가속이 정상적으로 작동하는지 보려면 다음 명령어를 치면 된다.

ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4

여기서 input.mp4를 자신이 가지고 있는 파일로 수정해주어야 한다.

변환작업을 하게 되니 재생시간이 짧은 파일을 사용하는 것이 좋다.

 

jellyfin 에서 설정은 로그인한후에 세줄을 누르고 dashboard playback에서 nvenc로 해주고 부가설정도 해주면 된다.

 

이젠 4k h264 h265 hevc는 재생이 가능하다

nvenc에 없는 vp9은 끊김이 발생한다.

하드웨어 가속 없이는 fhd가 최고인것 같다.

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

https://blog.wise-leader.com/transmission_server/

 

Good Daddy의 Ubuntu 리눅스 NAS - 트랜미션 서버 설치하기 - 굿대디의 지식공유 일기

Good Daddy의 Ubuntu 리눅스 NAS - 트랜미션 서버 설치하기 굿대디의 지식공유 일기 %

blog.wise-leader.com

을 참고하였습니다. 

 

트랜스미션 저장소를 추가해준다.

sudo add-apt-repository ppa:transmissionbt/ppa

설치할 수 있는 것을 업데이트 하고 트랜스미션 관련항목들을 설치해준다.

sudo apt-get update
sudo apt-get install transmission-cli transmission-common transmission-daemon

트랜스미션을 설정한다.

sudo vi /etc/transmission-daemon/settings.json

아래 항목들을 수정해준다.

"download-dir": "/transmission/download",     #다운로드 디렉토리이다.
"incomplete-dir": "/transmission/incomplete", #incomplete 디렉토리이다.
"incomplete-dir-enabled": true,				  #incomplete 디렉토리를 사용할 여부이다.
"rpc-bind-address": "0.0.0.0",                #WEB-Interface으로 접근가능한 주소이다. 0.0.0.0는 모두 접속가능하다. 
"rpc-authentication-required": true,          #계정과 비밀번호를 입력해야 하는지 설정이다 false로 설정할시에 그냥 접속할수있다.
"rpc-enabled": true,                          #당연하지만 외부에서 접속이 가능하게 활성화가 필요하다.
"rpc-password": "passwd",                 	  #외부앱에서 접속시 사용자 비밀번호
"rpc-username": "user",                    	  #외부앱에서 접속시 사용자 계정명
"rpc-whitelist": "trans.example.com",         #외부 접속이 가능한 사이트 명이나 IP 를 적어준다.
"rpc-whitelist-enabled": false,         	  #이걸 false로 해야 외부에서 접속이 가능하다.
"rpc-port": 9091,                             #원격으로 접속하는 WEB-Interface의 포트번호이다.

버그인지 설정을 저장하고 재시작(restart)을 했을때 초기화 되는 현상이 발생했다. restart대신에 reload를 해주자.

sudo service transmission-daemon reload

트랜스미션 서버를 시작한다.

sudo service transmission-daemon start

재부팅되어도 트랜스미션이 시작되도록 설정을 추가한다.

sudo vi /etc/systemd/system/transmission-daemon.service

아래 항목을 넣어준다.

[Unit]
Description=transmission-daemon

[Service]
User=debian-transmission
ExecStart = /usr/bin/transmission-daemon -f --config-dir /var/lib/transmission-daemon/info
Restart = always
RestartSec = 240
IOSchedulingClass = best-effort
IOSchedulingPriority = 7
Nice = 10
CPUSchedulingPolicy = idle

[Install]
WantedBy=multi-user.target

추가한 설정을 적용해 준다.

sudo systemctl --system daemon-reload
sudo systemctl enable transmission-daemon.service
sudo systemctl start transmission-daemon.service

이제 localhost:9091 이나 외부 도메인을 통해 접속이 가능해졌다.

파일 쓰기 권한을 위해 아래와 같이 추가해준다.

sudo usermod -aG username debian-transmission
sudo chown username:username -R transmission/
sudo chmod 775 -R transmission/

 

그리고 설정 파일이 바뀌지 않았는지 확인해준다.

sudo vi /etc/transmission-daemon/settings.json

바뀐게 있다면 다시 제대로 설정해주자.

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

우분투 서버에서는 기본적으로 영어와 유사한 언어만 설치가 된다.

때문에 한글을 입력하려면 한글을 추가로 설치해 주어야 하는 것 같다.

먼저 gui환경을 설치해야한다.

우분투 서버에 gui환경 설치하기

gui가 설치되면 settings 앱에서 region & language를 선택해준다.

manage installed languages를 클릭해준다.

install/remove languages를 클릭해준다.

korean을 찾아서 체크하고 apply를 클릭해준다.

korean이 보일텐데 이를 위에 위치하면 한글로 보이게 해준다.

그런데 cli환경에선 글자가 깨지기 때문에 영어가 위에 있게 해준다.

그리고 우분투를 로그아웃 한 뒤에 다시 로그인해준다.

그러면 적용이 되어 있을 것이다.

 

터미널에서 아래를 실행한다.

ibus-setup

input method 탭을 클릭해준다.

add 를 클릭하고 ...을 눌러 korean을 검색해서 찾아준다. korean을 클릭하고 상단의 hangul을 선택해준다.

add를 클릭한다.

 

settings앱에서 keyboard를 선택한다.

input sources에서 +를 클릭한다.

...을 눌러 korean을 검색해서 찾아준다.

korean을 선택하고 korean (hangul)을 선택하고 add를 클릭한다.

기존에 깔려있던 korean에서 ...을 눌러 remove를 클릭해준다.

 

korean(hangul)에서 ...을 눌러 preferences를 클릭해준다.

hangul toggle key를 모두 remove시켜주고 add로 한영전환 키를 입력한다.

나는 한영키로는 전환이 안되어 shift+space를 이용하고 있다.

ok를 눌러 적용한다.

 

우분투를 재시작한다.

shift+space로 한영이 전환된다.

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,