memories/go-vod/CUSTOMIZATION.md

4.2 KiB

Dependencies

Für die Ausführung von go-vod benötigen wir die Jellyfin-Version von FFmpeg. Die von Arch standardmäßig zur Verfügung gestellte Binary von FFmpeg funktioniert for VAAPI nicht.

Beispiele

In dieser Anwendung passieren keine speziellen oder komplexen Sachen! Im Grunde wird das Video nur herunterskaliert und dann in "Stücken" dem Client zurückgegeben. Mehr passiert nicht!

Ein Beispiel hierfür kann folgendermaßen aussehen.

ffmpeg/ffmpeg -loglevel warning \
	# Zu welcher Sekunde des Videos die Segmente starten sollen
	-ss 16.000000 -hwaccel \
	# VAAPI spezifische sachen
	vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
	-i ffmpeg/sample.mp4 -copyts \
	# Flags zum herunterskalieren
	-fflags +genpts -vf \ "format=nv12|vaapi,hwupload,scale_vaapi=force_original_aspect_ratio=decrease:format=nv12:w=1920:h=1080" \
	# Video und audio mappen
	-map "0:v:0" "-c:v" h264_vaapi -global_quality 23 -map "0:a:0?" "-c:a" aac -ac 1 -start_number 1 -avoid_negative_ts disabled \
	# Teile das Video in 4 Sekunden lange segmente
	-f hls -hls_flags split_by_time -hls_time 4 -hls_segment_type mpegts \
	# Und schreibe diese als Segmente weg
	-force_key_frames "expr:gte(t,n_forced*2)" -hls_segment_filename /home/ubuntugui/videos/1080p-%06d.ts -

# Zum kopieren
ffmpeg/ffmpeg -loglevel warning \
	-ss 16.000000 -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
	-i ffmpeg/sample.mp4 -copyts \
	-fflags +genpts -vf \ "format=nv12|vaapi,hwupload,scale_vaapi=force_original_aspect_ratio=decrease:format=nv12:w=1920:h=1080" \
	-map "0:v:0" -b:v 5M "-c:v" h264_vaapi -global_quality 23 -map "0:a:0?" "-c:a" aac -ac 1 -start_number 1 -avoid_negative_ts disabled \
	-f hls -hls_flags split_by_time -hls_time 4 -hls_segment_type mpegts \
	-force_key_frames "expr:gte(t,n_forced*2)" -hls_segment_filename /media/ubuntugui/videos/1080p-%06d.ts -
# Um die performance zu testen (ohne Segemente)
ffmpeg/ffmpeg -loglevel info \
	-ss 16.000000 -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
	-i ffmpeg/sample.mp4 -copyts \
	-fflags +genpts -vf \ "format=nv12|vaapi,hwupload,scale_vaapi=force_original_aspect_ratio=decrease:format=nv12:w=1920:h=1080" \
	-map "0:v:0" "-c:v" h264_vaapi -global_quality 23 -map "0:a:0?" "-c:a" aac -ac 1 -start_number 1 -avoid_negative_ts disabled \
	/media/ubuntugui/videos/1080p.ts -y
# Optimierte Variante
ffmpeg/ffmpeg -loglevel info \
	-ss 16.000000 -init_hw_device vaapi=dr:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_device dr -hwaccel_output_format vaapi -filter_hw_device dr \
	-i ffmpeg/sample.mp4 -copyts \
	-fflags +genpts -vf 'scale_vaapi=force_original_aspect_ratio=decrease:format=nv12:w=1920:h=1080' \
	-rc_mode VBR -qmax 30 -g 30 -b:v 5000k \
	-map "0:v:0" -b:v 5M "-c:v" h264_vaapi -global_quality 23 -map "0:a:0?" "-c:a" aac -ac 1 -start_number 1 -avoid_negative_ts disabled \
	/media/ubuntugui/videos/1080p.ts -y

# Quick Sync (Intel)
/media/ubuntugui/videos/ffmpeg -loglevel info  \
	-ss 16.000000 -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
	-i /media/ubuntugui/videos/PXL_20231230_122849503.mp4 -copyts \
	-fflags +genpts -vf "format=nv12|vaapi,hwupload,scale_vaapi=force_original_aspect_ratio=decrease:format=nv12:w=1920:h=1080" \
	-map "0:v:0" -b:v 5M  "-c:v" h264_vaapi -global_quality 23 -map "0:a:0?" "-c:a" aac -ac 1 -start_number 1 -avoid_negative_ts disabled \
	/media/ubuntugui/videos/1080p.ts -y

# Vulkan Tests (haben nicht so ganz funktoniert....) -> nur nützlich, wenn man Farbkonvertierungen macht (vaapi -> vulkan -> konvertierungen -> vaapi)
ffmpeg/ffmpeg -loglevel info  \
	-ss 16.000000 -init_hw_device drm=dr:/dev/dri/renderD128 -init_hw_device vulkan@dr -hwaccel vaapi -filter_hw_device dr -hwaccel_output_format vaapi  \
	-i ffmpeg/sample.mp4 \
	-vf "hwupload=derive_device=vulkan,scale_vulkan=w=1920:h=1080,hwmap=derive_device=vaapi,hwupload_vaapi" -autoscale 0 \
	"-c:v" h264_vaapi -b:v 5M "-c:a" aac -ac 1 \
	/media/ubuntugui/videos/1080p.ts -y

Ergebnis

Eine Intel IGPU ist ungefähr 1.8x so schnell wie eine dedizierte AMD Grafikkarte. Warum ist dies der Fall?

Ausführen

Folgende Befehle für das Ausführen / Bauen der Binary.

go run ./