78 lines
4.2 KiB
Markdown
78 lines
4.2 KiB
Markdown
## Dependencies
|
|
|
|
Für die Ausführung von *go-vod* benötigen wir die [Jellyfin-Version](https://github.com/jellyfin/jellyfin-ffmpeg/releases) 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.
|
|
|
|
```sh
|
|
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.
|
|
|
|
```sh
|
|
go run ./
|
|
``` |