ubuntuusers.de

h265 encoding CLI mit nvdec

Status: Ungelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

4dlab

Avatar von 4dlab

Anmeldungsdatum:
14. März 2010

Beiträge: 100

Wohnort: Schaffhausen

Moin zusammen

Ich muss jetzt noch mal einen Anlauf nehmen. Das ganz lässt mir keine Ruhe.

Problemstellung. Ich habe einen Server mit verdammt viel DVB Mitschnitten die grösstenteils schon bereinigt und als h264 im mkv container liegen. Das ist wenig platzsparend und soll alles in h265 konvertiert werden. Das alles mit GUI auf dem Mac via Netzwerk zu machen ist keine Option da der Server unten ne alte aber recht fette Karte (NVidia HP 2000) drin hat und das herlich allein ohne machen können sollte.

Endziel: Ein Script der einen beliebeigen Ordner durchforstete nach Material das nich tin h265 codiert ist. Einen gleichlautenden Ordnerpfad in einem Zielpfad anlegt und in dieses hinen encodiert.

Aktuelles Problem: handbrakeCLI meint ich hätte das Thema nvdec nicht beim compiling mit eingeschlossen.

Ich habe damit vor geraumer Zeit schon mal recht umfangreich herumgespielt und bin nicht auf nen grünen Zeig gekommen. Mag bitte wer so nett sein und mich durch dieses Tal führen bitte. Ich wills verstehen, laufe aber wie in einem Irrgarten permanent von einer unmöglichen Abhängigikeit in die nächste.

NACHTRAG: Vebaut ist eine HP P2000 Quadro NVidia. Die läuft soweit auch. Zumindest mit dem auch auf dieser Maschine instalierten Plex Server. Ich kann es allein in der Serverlast sehen das er die Karte benutzt statt der CPUs

HandBrakeCLI  -e nvenc_h265 --multi-pass -T -q 22 —vfr --enable-hw-decoding nvdec --keep-display-aspect -f av_mkv -i test_h264.mkv -o test_h265.mkv
[17:28:19] Compile-time hardening features are enabled
[17:28:19] nvenc: version 13.0 is available
[17:28:19] nvdec: is not compiled into this build
[17:28:20] CUDA Version: 6.1
[17:28:20] qsv: not available on this system
[17:28:20] hb_init: starting libhb thread
[17:28:20] thread 7d50fbfff6c0 started ("libhb")
HandBrake 1.7.2 (2024040100) - Linux x86_64 - https://handbrake.fr
48 CPUs detected
Opening test_h264.mkv...
[17:28:20] CPU: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz
[17:28:20]  - Intel microarchitecture Ivy Bridge
[17:28:20]  - logical processor count: 48
[17:28:20] Intel Quick Sync Video support: no
[17:28:20] hb_scan: path=test_h264.mkv, title_index=1
Input #0, matroska,webm, from 'test_h264.mkv':
  Metadata:
    encoder         : libebml v1.4.5 + libmatroska v1.7.1
    creation_time   : 2025-05-18T05:06:19.000000Z
  Duration: 01:31:07.35, start: 0.000000, bitrate: 4723 kb/s
  Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 59.94 fps, 59.94 tbr, 1k tbn (default)
    Metadata:
      BPS             : 4335833
      DURATION        : 01:31:06.394000000
      NUMBER_OF_FRAMES: 327656
      NUMBER_OF_BYTES : 2962671537
      _STATISTICS_WRITING_APP: mkvmerge v92.0 ('Everglow') 64-bit
      _STATISTICS_WRITING_DATE_UTC: 2025-05-18 05:06:19
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:1(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s (default)
    Metadata:
      BPS             : 384014
      DURATION        : 01:31:07.352000000
      NUMBER_OF_FRAMES: 170861
      NUMBER_OF_BYTES : 262442496
      _STATISTICS_WRITING_APP: mkvmerge v92.0 ('Everglow') 64-bit
      _STATISTICS_WRITING_DATE_UTC: 2025-05-18 05:06:19
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
[17:28:20] scan: decoding previews for title 1
[17:28:20] scan: audio 0x1: ac3, rate=48000Hz, bitrate=384000 English (AC3, 5.1 ch, 384 kbps)
Scanning title 1 of 1, preview 7, 70.00 %[17:28:20] using container PAR 1:1
[17:28:20] scan: 10 previews, 1280x720, 59.940 fps, autocrop = 0/0/0/0, aspect 16:9, PAR 1:1, color profile: 1-1-1, chroma location: left
[17:28:20] libhb: scan thread found 1 valid title(s)
+ Using preset: CLI Default
+ title 1:
  + stream: test_h264.mkv
  + duration: 01:31:07
  + size: 1280x720, pixel aspect: 1/1, display aspect: 1.78, 59.940 fps
  + autocrop: 0/0/0/0
  + chapters:
    + 1: duration 01:31:07
  + audio tracks:
    + 1, English (AC3, 5.1 ch, 384 kbps) (iso639-2: eng), 48000Hz, 384000bps
  + subtitle tracks:
    + 1, English, Closed Caption [CC608]
[17:28:20] Starting work at: Mon Dec 15 17:28:20 2025

[17:28:20] 1 job(s) to process
[17:28:20] json job:
{
    "Audio": {
        "AudioList": [
            {
                "Bitrate": 128,
                "CompressionLevel": -1.0,
                "DRC": 0.0,
                "DitherMethod": "auto",
                "Encoder": "av_aac",
                "Gain": 0.0,
                "Mixdown": "dpl2",
                "NormalizeMixLevel": false,
                "PresetEncoder": "av_aac",
                "Quality": -3.0,
                "Samplerate": 0,
                "Track": 0
            }
        ],
        "CopyMask": [
            "copy:aac",
            "copy:ac3",
            "copy:eac3",
            "copy:dtshd",
            "copy:dts",
            "copy:mp3",
            "copy:truehd",
            "copy:flac"
        ],
        "FallbackEncoder": "av_aac"
    },
    "Destination": {
        "AlignAVStart": false,
        "ChapterList": [
            {
                "Duration": {
                    "Hours": 1,
                    "Minutes": 31,
                    "Seconds": 7,
                    "Ticks": 492061680
                },
                "Name": ""
            }
        ],
        "ChapterMarkers": false,
        "File": "test_h265.mkv",
        "InlineParameterSets": false,
        "Mux": "mkv",
        "Options": {
            "IpodAtom": false,
            "Optimize": false
        }
    },
    "Filters": {
        "FilterList": [
            {
                "ID": 10,
                "Settings": {
                    "mode": 0
                }
            },
            {
                "ID": 19,
                "Settings": {
                    "crop-bottom": 0,
                    "crop-left": 0,
                    "crop-right": 0,
                    "crop-top": 0,
                    "height": 720,
                    "width": 1280
                }
            }
        ]
    },
    "Metadata": {},
    "PAR": {
        "Den": 1,
        "Num": 1
    },
    "SequenceID": 0,
    "Source": {
        "Angle": 0,
        "HWDecode": 0,
        "Path": "test_h264.mkv",
        "Range": {
            "End": 1,
            "Start": 1,
            "Type": "chapter"
        },
        "Title": 1
    },
    "Subtitle": {
        "Search": {
            "Burn": true,
            "Default": false,
            "Enable": false,
            "Forced": false
        },
        "SubtitleList": []
    },
    "Video": {
        "ChromaLocation": 1,
        "ColorInputFormat": 0,
        "ColorMatrix": 1,
        "ColorOutputFormat": 0,
        "ColorPrimaries": 1,
        "ColorRange": 1,
        "ColorTransfer": 1,
        "Encoder": "nvenc_h265",
        "HardwareDecode": 4,
        "MultiPass": false,
        "QSV": {
            "AdapterIndex": 0,
            "AsyncDepth": 0,
            "Decode": false
        },
        "Quality": 22.0,
        "Turbo": false
    }
}
[17:28:20] Starting Task: Encoding Pass
[17:28:20] work: skipping crop/scale filter
[17:28:20] job configuration:
[17:28:20]  * source
[17:28:20]    + test_h264.mkv
[17:28:20]    + title 1, chapter(s) 1 to 1
[17:28:20]    + container: matroska,webm
[17:28:20]    + data rate: 4723 kbps
[17:28:20]  * destination
[17:28:20]    + test_h265.mkv
[17:28:20]    + container: Matroska (libavformat)
[17:28:20]  * video track
[17:28:20]    + decoder: h264 8-bit (yuv420p)
[17:28:20]    + filter
[17:28:20]      + Framerate Shaper (mode=0)
[17:28:20]        + frame rate: same as source (around 59.940 fps)
[17:28:20]    + Output geometry
[17:28:20]      + storage dimensions: 1280 x 720
[17:28:20]      + pixel aspect ratio: 1 : 1
[17:28:20]      + display dimensions: 1280 x 720
[17:28:20]    + encoder: H.265 (NVEnc)
[17:28:20]      + quality: 22.00 (CQ)
[17:28:20]      + color profile: 1-1-1
[17:28:20]      + chroma location: left
[17:28:20]  * audio track 1
[17:28:20]    + decoder: English (AC3, 5.1 ch, 384 kbps) (track 1, id 0x1)
[17:28:20]      + bitrate: 384 kbps, samplerate: 48000 Hz
[17:28:20]    + mixdown: Dolby Pro Logic II
[17:28:20]    + encoder: AAC (libavcodec)
[17:28:20]      + bitrate: 128 kbps, samplerate: 48000 Hz
[17:28:20] sync: expecting 327713 video frames
[17:28:20] encavcodecInit: H.265 (Nvidia NVENC)
[17:28:20] encavcodec: encoding at rc=vbr, 22.00
[17:28:20] encavcodec: encoding with stored aspect 1/1
[hevc_nvenc @ 0x7d50ed71b380] OpenEncodeSessionEx failed: unsupported device (2): (no details)
Encoding: task 1 of 1, 0.00 %[hevc_nvenc @ 0x7d50ed71b380] No capable devices found
[17:28:21] encavcodecInit: avcodec_open failed
ERROR: Failure to initialise thread 'FFMPEG encoder (libavcodec)'
[17:28:21] vfr: 0 frames output, 0 dropped
[17:28:21] vfr: lost time: 0 (0 frames)
[17:28:21] vfr: gained time: 0 (0 frames) (0 not accounted for)
[17:28:21] ac3-decoder done: 0 frames, 0 decoder errors
[17:28:21] h264-decoder done: 0 frames, 0 decoder errors
[17:28:21] sync: got 0 frames, 327713 expected
[17:28:21] Finished work at: Mon Dec 15 17:28:21 2025

[17:28:21] libhb: work result = 3

Encode failed (error 3).

HandBrake has exited.

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 5645

Was ist den da für ein Treiber für die Nvidia P2000 Quadro GPU installiert?

Der zur Zeit aktuellste Nvidia Treiber für eine GPU mit Pascal Architektur wäre dieser:

Die letzte CUDA Toolkit Version, die noch die Nvidia GPU Architkturen Maxwell 2 und Pascal unterstüzte, ist CUDA 12.9.

Das, was das eigentliche produzieren oder umwandeln von Videos macht, ist FFmpeg.

Möchte man einen optimalen FFmpeg haben, der auf die Hard- und Software abgestimmt ist, so kann man sich den FFmpeg selbst bauen.

Im Terminal oder Skripten bietet es sich auch gleich an, den FFmpeg direkt zu benutzen, ohne Umwege oder Overhead durch Handbrake.

Als Startpunkt für eine FFmpeg Formel für den hevc_nvenc noch das hier:

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 6874

4dlab

(Themenstarter)
Avatar von 4dlab

Anmeldungsdatum:
14. März 2010

Beiträge: 100

Wohnort: Schaffhausen

schwarzheit schrieb:

Gelöst? was ist die Lösung?

>> Richtig fragen (Abschnitt „Veroeffentliche-abschliessend-Deine-Loesung“) <<

Gelöst weil ich, steht oben im Nachtrag, gemerkt habe das die GPU kein h265 encode kann. Daher habe ich meinen Lösung nicht öffentlich gemacht weil es ja faktisch nicht gelöst ist. Nur umgangen. Im Deutsch Unterreicht hättte man gesagt... am Ziel angekommen aber Thema verfehlt. Also mein Ansatz der vollends Falsche.

Aber ich habs dann jetzt via CPU am laufen.. nich schön aber macht seinen Dienst.

Hier der Skript dazu

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/bin/bash

# ============================
# Any non-H.265 Video zu H.265 Batch Encoder (mit verbose Option)
# ============================

# Prüfen, ob Quell- und Zielpfad angegeben wurden
if [ "$#" -lt 2 ]; then
    echo "Usage: $0 <source_folder> <target_folder> [preset] [rf] [verbose]"
    echo "Example: $0 /mnt/source /mnt/target fast 22 yes"
    exit 1
fi

SOURCE="$1"
TARGET="$2"

# Optional: Preset, RF, verbose
PRESET="${3:-ultrafast}"  # default ultrafast
RF="${4:-22}"             # default 22
VERBOSE="${5:-no}"        # default "no"

# Prüfen, ob mediainfo und HandBrakeCLI installiert sind
command -v mediainfo >/dev/null 2>&1 || { echo >&2 "mediainfo is required but not installed. Aborting."; exit 1; }
command -v HandBrakeCLI >/dev/null 2>&1 || { echo >&2 "HandBrakeCLI is required but not installed. Aborting."; exit 1; }

echo "Source: $SOURCE"
echo "Target: $TARGET"
echo "Preset: $PRESET"
echo "RF: $RF"
echo "Verbose: $VERBOSE"

# Rekursiv alle Video-Dateien durchsuchen, natürliche Sortierung
find "$SOURCE" -type f \( -iname "*.mkv" -o -iname "*.mp4" -o -iname "*.mov" iname "*.avi" -o \) | sort -V | while read -r FILE; do

    # Codec des Videostreams ermitteln
    VIDEO_CODEC=$(mediainfo --Inform="Video;%Format%" "$FILE" | tr '[:upper:]' '[:lower:]')

    if [[ "$VIDEO_CODEC" != "hevc" ]]; then
        # Pfad relativ zum SOURCE
        REL_PATH="${FILE#$SOURCE/}"
        REL_DIR=$(dirname "$REL_PATH")

        # Zielverzeichnis erstellen
        mkdir -p "$TARGET/$REL_DIR"

        # Ziel-Dateiname (.mkv)
        OUTPUT="$TARGET/$REL_DIR/$(basename "${FILE%.*}").mkv"

        if [[ "$VERBOSE" == "yes" ]]; then
            echo "------------------------------------------"
            echo "Encoding $FILE -> $OUTPUT"
            echo "Detected codec: $VIDEO_CODEC"
            echo "------------------------------------------"
            HandBrakeCLI \
            -i "$FILE" \
            -o "$OUTPUT" \
            -e x265 \
            -q "$RF" \
            --encoder-preset "$PRESET" \
            --vfr \
            --keep-display-aspect \
            -f av_mkv \
            --all-audio \
            --all-subtitles
        else
            echo -n "Encoding $FILE -> $OUTPUT ... "
            HandBrakeCLI \
            -i "$FILE" \
            -o "$OUTPUT" \
            -e x265 \
            -q "$RF" \
            --encoder-preset "$PRESET" \
            --vfr \
            --keep-display-aspect \
            -f av_mkv \
            --all-audio \
            --all-subtitles \
            >/dev/null 2>&1
            echo "Done"
        fi

    else
        if [[ "$VERBOSE" == "yes" ]]; then
            echo "Skipping $FILE (already H.265)"
        else
            echo "$FILE -> already H.265, skipped"
        fi
    fi
done

echo "All done!"

Muss gestehen.. ich habe dazu ChatGPT benutzt. Und bin erschrocken wie gut das geht. Aber auch vollends bestürzt wie wenig man dann noch selber durch eigenen Recherche dazu lernt. Ich selber bingeneration präGoogle und man hat das damals auch schon beim aufkommen von Suchmaschinen und Wikipedia gesagt.. aber das ist ein ganz ein anderes Level. Wenn ich nicht selbst aus der Software entwicklung kommen würde, würd ich da rein schauen wie Schwein ins Uhrwerk, würde nix verstehen und nix lernen... die AI nimmt einem da alles ab... scarry!

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 5645

4dlab schrieb:

Gelöst weil ich, steht oben im Nachtrag, gemerkt habe das die GPU kein h265 encode kann.

Nanu? Die GPU sollte das doch eigentlich™ können. Mein Alteisen, genauer eine Maxwell 2.0 GPU (gm204), die in einer GTX 970 steckt, kann es. Da sollte es die neuere GPU Generation Pascal erst recht können.

Ich verwende das in meinem KDE Service Menü. Rechtsklick im Dolphin Dateimanager auf die gewünschte Datei, und los gehts.

Das isses, mein Fickel, läuft bei mir hier: $HOME/.local/share/kio/servicemenus/video_convert_nvenc.desktop

[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=video/3gpp;video/3gpp2;video/mp4;video/mpeg;video/ogg;video/x-matroska;video/x-mjpeg;video/wmp;video/wmv;video/x-msvideo;video/x-flic;video/x-flv;video/x-sgi-movie;video/quicktime;video/webm;video/mp2t;
Actions=01_video_to_mp4;02_video_to_mkv;03_video_to_avi;04_video_to_mov;05_video_to_webm;06_video_to_x265_mkv;07_video_rotate_upside_down_mp4;08_video_rotate_90_degrees_clockwise_mp4;09_video_rotate_90_degrees_counter_clockwise_mp4;10_video_mirror_vertically_mp4;11_video_mirror_horizontally_mp4;12_video_to_hevc_mp4;Action;13_video_to_hevc_mkv;
X-KDE-Submenu= Video convert ==>
X-KDE-Submenu[de]=Video umwandeln ==>
Icon=smplayer

[Desktop Action 01_video_to_mp4]
Icon=smplayer
Name=Video convert to mp4
Name[de]=Video umwandeln zu mp4
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/mp4/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/mp4/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/mp4/I`" ] && notify-send -i media-playback-start.png "video to mp4! :-)" "`echo "%f" | xargs basename` video to mp4 Running..." && yes | ffmpeg -y -hide_banner -hwaccel cuda -i "%f" -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac  "`echo "%f" | sed -e s/[^.]*$/mp4/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "video to mp4: `echo "%f" | sed -e s/[^.]*$/mp4/I | xargs basename` Ready!"

[Desktop Action 02_video_to_mkv]
Icon=smplayer
Name=Video convert to mkv
Name[de]=Video umwandeln zu mkv
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/mkv/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/mkv/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/mkv/I`" ] && notify-send -i media-playback-start.png "video to mkv! :-)" "`echo "%f" | xargs basename` video to mkv Running..." && yes | ffmpeg -y -hide_banner -hwaccel cuda -i "%f" -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac  "`echo "%f" | sed -e s/[^.]*$/mkv/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "video to mkv: `echo "%f" | sed -e s/[^.]*$/mkv/I | xargs basename` Ready!"

[Desktop Action 03_video_to_avi]
Icon=smplayer
Name=Video convert to avi
Name[de]=Video umwandeln zu avi
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/avi/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/avi/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/avi/I`" ] && notify-send -i media-playback-start.png "video to avi! :-)" "`echo "%f" | xargs basename` video to avi Running..." && yes | ffmpeg -y  -hide_banner -hwaccel cuda -i "%f" -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac "`echo "%f" | sed -e s/[^.]*$/avi/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "video to avi: `echo "%f" | sed -e s/[^.]*$/avi/I | xargs basename` Ready!"

[Desktop Action 04_video_to_mov]
Icon=smplayer
Name=Video convert to mov
Name[de]=Video umwandeln zu mov
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/mov/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/mov/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/mov/I`" ] && notify-send -i media-playback-start.png "video to mov! :-)" "`echo "%f" | xargs basename` video to mov Running..." && yes | ffmpeg -y  -hide_banner -hwaccel cuda -i "%f" -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac "`echo "%f" | sed -e s/[^.]*$/mov/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "video to mov: `echo "%f" | sed -e s/[^.]*$/mov/I | xargs basename` Ready!"

[Desktop Action 05_video_to_webm]
Icon=smplayer
Name=Video convert to webm
Name[de]=Video umwandeln zu webm
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/webm/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/webm/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/webm/I`" ] && notify-send -i media-playback-start.png "video to webm! :-)" "`echo "%f" | xargs basename` video to webm Running..." &&  yes | ffmpeg -y -hide_banner -threads `nproc` -hwaccel cuda  -i "%f" -c:v libvpx-vp9  -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -pass 1 -an -passlogfile "%f" -f webm /dev/null && yes | ffmpeg -y -hide_banner -threads `nproc` -hwaccel cuda -i "%f" -c:v libvpx-vp9 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -pass 2 -passlogfile "%f" "`echo "%f" | sed -e s/[^.]*$/webm/I`" && rm "%f"-0.log && notify-send -i dialog-ok-apply.png "Ready! :-)" "video to webm: `echo "%f" | sed -e s/[^.]*$/webm/I | xargs basename` Ready!"

[Desktop Action 06_video_to_x265_mkv]
Icon=smplayer
Name=Video convert to x265 mkv
Name[de]=Video umwandeln zu x265 mkv
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/mkv/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/mkv/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/mkv/I`" ] && notify-send -i media-playback-start.png "video to mkv! :-)" "`echo "%f" | xargs basename` video to mkv Running..." &&  yes | ffmpeg -y -hide_banner -threads `nproc` -hwaccel cuda  -i "%f" -c:v libx265  -tag:v hvc1 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -x265-params pass=1 -an -f null /dev/null && yes | ffmpeg -y -hide_banner -threads `nproc` -hwaccel cuda -i "%f" -c:v libx265 -tag:v hvc1 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -x265-params pass=2 -c:a aac "`echo "%f" | sed -e s/[^.]*$/mkv/I`" && rm x265_2pass.log x265_2pass.log.cutree && notify-send -i dialog-ok-apply.png "Ready! :-)" "video to mkv: `echo "%f" | sed -e s/[^.]*$/mkv/I | xargs basename` Ready!"

[Desktop Action 07_video_rotate_upside_down_mp4]
Icon=smplayer
Name=Video Rotation rotation upside down mp4
Name[de]=Video Drehung kopfüber mp4
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ] && notify-send -i media-playback-start.png "Rotates the Video orientation :-)" "`echo "%f" | xargs basename` mp4 turn Running..." && ffmpeg -y -hwaccel cuda -i "%f" -vf "transpose=2,transpose=2" -strict experimental -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "Rotated `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename` Ready!"

[Desktop Action 08_video_rotate_90_degrees_clockwise_mp4]
Icon=smplayer
Name=Video Rotation 90_degrees clockwise mp4
Name[de]=Video Drehung 90 Grad im Uhrzeigersinn mp4
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ] && notify-send -i media-playback-start.png "Rotates the Video orientation :-)" "`echo "%f" | xargs basename` mp4 turn Running..." && ffmpeg -y -hwaccel cuda -i "%f" -vf "transpose=1" -strict experimental -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "Rotated `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename` Ready!"

[Desktop Action 09_video_rotate_90_degrees_counter_clockwise_mp4]
Icon=smplayer
Name=Video Rotation 90_degrees counter clockwise mp4
Name[de]=Video Drehung 90 Grad gegen Uhrzeigersinn mp4
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ] && notify-send -i media-playback-start.png "Rotates the Video orientation :-)" "`echo "%f" | xargs basename` mp4 turn Running..." && ffmpeg -y -hwaccel cuda -i "%f" -vf "transpose=2" -strict experimental -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac  "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "Rotated `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename` Ready!"

[Desktop Action 10_video_mirror_vertically_mp4]
Icon=smplayer
Name=Video mirror_vertically mp4
Name[de]=Video spiegeln vertikal mp4
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ] && notify-send -i media-playback-start.png "Rotates the Video orientation :-)" "`echo "%f" | xargs basename` mp4 turn Running..." && ffmpeg -y -hwaccel cuda -i "%f" -vf "vflip" -strict experimental -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "Rotated `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename` Ready!"

[Desktop Action 11_video_mirror_horizontally_mp4]
Icon=smplayer
Name=Video mirror horizontally mp4
Name[de]=Video spiegeln horizontal mp4
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename`" ] && notify-send -i media-playback-start.png "Rotates the Video orientation :-)" "`echo "%f" | xargs basename` mp4 turn Running..." && ffmpeg -y -hwaccel cuda -i "%f" -vf "hflip" -strict experimental -c:v h264_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac "`echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "Rotated `echo "%f" | sed -e s/[^.]*$/_rotated.mp4/I | xargs basename` Ready!"

[Desktop Action 12_video_to_hevc_mp4]
Icon=smplayer
Name=Video convert to HEVC mp4
Name[de]=Video umwandeln zu HEVC mp4
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/mp4/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/mp4/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/mp4/I`" ] && notify-send -i media-playback-start.png "video to mp4! :-)" "`echo "%f" | xargs basename` video to mp4 Running..." && yes | ffmpeg -y -hide_banner -hwaccel cuda -i "%f" -c:v hevc_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac  "`echo "%f" | sed -e s/[^.]*$/mp4/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "video to mp4: `echo "%f" | sed -e s/[^.]*$/mp4/I | xargs basename` Ready!"

[Desktop Action 13_video_to_hevc_mkv]
Icon=smplayer
Name=Video convert to HEVC mkv
Name[de]=Video umwandeln zu HEVC mkv
Exec=[ -f "`echo "%f" | sed -e s/[^.]*$/mkv/I`" ] && notify-send -i window-close.png "STOP! File exists! `echo "%f" | sed -e s/[^.]*$/mkv/I | xargs basename`" ; [ ! -f "`echo "%f" | sed -e s/[^.]*$/mkv/I`" ] && notify-send -i media-playback-start.png "video to mkv! :-)" "`echo "%f" | xargs basename` video to mkv Running..." && yes | ffmpeg -y -hide_banner -hwaccel cuda -i "%f" -c:v hevc_nvenc -preset p6 -tune hq -rc-lookahead 20 -b:v "`mediainfo --ParseSpeed=1 --Inform="Video;%%BitRate%%" "%f" || mediainfo --ParseSpeed=1 --Inform="General;%%OverallBitRate%%" "%f"`" -c:a aac  "`echo "%f" | sed -e s/[^.]*$/mkv/I`" && notify-send -i dialog-ok-apply.png "Ready! :-)" "video to mkv: `echo "%f" | sed -e s/[^.]*$/mkv/I | xargs basename` Ready!"

4dlab

(Themenstarter)
Avatar von 4dlab

Anmeldungsdatum:
14. März 2010

Beiträge: 100

Wohnort: Schaffhausen

Okay... dann also wieder auf das Ding... dann bin ich quasi wieder auf Feld ein und habe das Problem das mit handbrake nicht mit nvenc compaliert ist. Ich weiss, historisch, das ich mir schier einen abgebrochen habe um das einzukompilieren aber immer wieder auf irgendwelche ungelösten Abhängigkeiten gestossen bin.

wie muss ich vorgehen um den nvenc mit einzubinden? Aber wart mal... ich wühle mich da grad mal noch rein und koe dann mit ner konkreten Anfrage

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 5645

Ich baue meinen FFmpeg zur Zeit auf Questing Quokka so:

alias ffmpegneu='INSTALLATIONSDISK=$HOME/Installationsdisk && \
                        NVIDIADIR=$HOME/Installationsdisk/Nvidia && \
                        FFMPEGSOURCE=$NVIDIADIR/ffmpeg && \
                        sudo apt-get install autoconf automake build-essential cmake git libass-dev libfreetype-dev libgnutls28-dev libmp3lame-dev libsdl2-dev libtool \
                        libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev meson ninja-build pkg-config texinfo wget yasm zlib1g-dev \
                        libunistring-dev libaom-dev libdav1d-dev libx265-dev libnuma-dev libx264-dev libvpx-dev libfdk-aac-dev libopus-dev libsvtav1enc-dev && \
                        echo "apt-get OK" || echo "apt-get Error" && \
                        [ ! -d $INSTALLATIONSDISK ] && mkdir -pv $INSTALLATIONSDISK || echo "$INSTALLATIONSDISK exists" && \
                        [ ! -d $NVIDIADIR ] && mkdir -pv $NVIDIADIR || echo "$NVIDIADIR exists" && \
                        [ ! -d $FFMPEGSOURCE ] && git clone https://git.ffmpeg.org/ffmpeg.git $FFMPEGSOURCE && \
                        printf "\n \033[45m\033[1;36m==> FFmpeg Sourcecode cloned. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" || \
                        printf "\n \033[45m\033[1;36m==> FFmpeg Sourcecode found. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        [ ! -d $NVIDIADIR/nv-codec-headers ] && git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git $NVIDIADIR/nv-codec-headers && \
                        printf "\n \033[45m\033[1;36m==> nv-codec-headers cloned. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" || \
                        printf "\n \033[45m\033[1;36m==> nv-codec-headers found. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        make clean -C $FFMPEGSOURCE 2>/dev/null && echo "$FFMPEGSOURCE cleaned" || echo "$FFMPEGSOURCE was clean" && \
                        printf "\n \033[45m\033[1;36m==> Update FFmpeg and nv-codec-headers Sourcecode. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        printf "\n \033[45m\033[1;36m==> git pull FFmpeg Sourcecode. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        [ -d $FFMPEGSOURCE/build ] && yes | rm -fr $FFMPEGSOURCE/build && echo "Builddir removed, OK" || echo "No need remove Builddir, OK." && \
                        git -C $FFMPEGSOURCE pull && echo "git pull done." || echo "No git pull." && \
                        printf "\n \033[45m\033[1;36m==> git pull nv-codec-headers Sourcecode. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        git -C $NVIDIADIR/nv-codec-headers/ pull && echo "git pull done." || echo "No git pull." && \
                        printf "\n \033[45m\033[1;36m==> Install fresh nv-codec-headers. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        sudo make -j $(nproc) install -C $NVIDIADIR/nv-codec-headers && echo "nv-codec-headers installed" || echo "nv-codec-headers install Error" && \
                        [ -d $FFMPEGSOURCE/build ] && yes | rm -fr $FFMPEGSOURCE/build && echo "Builddir removed, OK." || echo "No need remove Builddir, OK." && \
                        [ ! -d $FFMPEGSOURCE/build ] && mkdir -pv $FFMPEGSOURCE/build && echo "Have made fresh $FFMPEGSOURCE/build directory." || echo "$FFMPEGSOURCE/build directory exists." && \
                        [ -f $FFMPEGSOURCE/config.h ] && rm -fv $FFMPEGSOURCE/config.h && echo "$FFMPEGSOURCE/config.h cleaned" || echo "No $FFMPEGSOURCE/config.h to clean" && \
                        sudo mount -v tmpfs $FFMPEGSOURCE/build -t tmpfs -o mode=777 && \
                        cd $FFMPEGSOURCE/build && \
                        printf "\n \033[45m\033[1;36m==> Configure FFmpeg Sourcecode. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        $FFMPEGSOURCE/configure --prefix=/usr --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 \
                        --disable-debug --enable-stripping --enable-libvmaf --enable-gcrypt --enable-gmp --enable-libaribb24 --enable-libdavs2 \
                        --enable-libopenh264 --enable-librabbitmq --enable-librtmp --enable-libsrt --enable-libtesseract \
                        --enable-gpl --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca \
                        --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm \
                        --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse \
                        --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame \
                        --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libjxl \
                        --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 \
                        --enable-libplacebo --enable-libmodplug --enable-avisynth --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc \
                        --enable-lcms2 --enable-frei0r --enable-libx264 --disable-static --enable-shared --enable-nonfree --enable-nvenc --enable-nvdec --enable-libfdk-aac \
                        --enable-libdav1d --enable-libsvtav1 --enable-swresample --enable-cuda-llvm --enable-cuvid --enable-libkvazaar \
                        --enable-libglslang --enable-librav1e --enable-vulkan --enable-xlib --enable-libvpl --enable-vaapi --enable-vdpau --enable-libnpp --enable-pic \
                        --enable-libdvdnav --enable-libdvdread --enable-libvvenc --enable-libuavs3d --enable-chromaprint --enable-libsvtjpegxs \
                        --enable-libharfbuzz --extra-cflags="-march=native" --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --extra-libs="-lpthread" && \
                        printf "\n \033[45m\033[1;36m==> Configure FFmpeg successful. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        printf "\n \033[45m\033[1;36m==> Compile FFmpeg. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        time make -j $(nproc --all) -C $FFMPEGSOURCE/build ADDFLAGS=-march=native STRIP=true OPTFLAGS="-O3 -ftree-loop-vectorize -pie -aslr -flto=`nproc --all` \
                        -arch=sm_52 -gencode=arch=compute_52,code=sm_52" -Wno-dev && \
                        printf "\n \033[45m\033[1;36m==> Compile FFmpeg successful. \033[0m\033[42m\033[1;36m  ==> Done.\033[0m \n \n" && \
                        printf "\n \033[45m\033[1;36m==> Remove old libav Binaries. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        sudo rm -fv $(dpkg -S /usr/lib/x86_64-linux-gnu/libav* 2>&1 | awk '\''/dpkg-query/{print $--NF}'\'') \
                        $(dpkg -S /usr/lib/x86_64-linux-gnu/libsw* 2>&1 | awk '\''/dpkg-query/{print $--NF}'\'') \
                        $(dpkg -S /usr/lib/x86_64-linux-gnu/libpostproc* 2>&1 | awk '\''/dpkg-query/{print $--NF}'\'') && \
                        printf "\n \033[45m\033[1;36m==> Install fresh FFmpeg. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        sudo porg -lp ffmpeg "make -j $(nproc --all) install -C $FFMPEGSOURCE/build" && \
                        printf "\n \033[45m\033[1;36m==> Install FFmpeg successful. \033[0m\033[42m\033[1;36m  ==> Done.\033[0m \n \n" && \
                        printf "\n \033[45m\033[1;36m==> FFmpeg deinstall: \033[0m\033[43m\033[1;36m sudo porg -rv ffmpeg   <== \033[0m \n \n" || \
                        printf "\n \033[41m\033[1;36m==> Configure or install FFmpeg failed.\033[0m \n \n" | tee -a $HOME/buildfail.log ; \
                        cd $HOME && \
                        [ -d $FFMPEGSOURCE/build ] && yes | rm -fr $FFMPEGSOURCE/build/* && echo "Builddir cleaned." || echo "Builddir was clean." && \
                        sudo umount -fv $FFMPEGSOURCE/build && \
                        [ -d $FFMPEGSOURCE/build ] && yes | rm -fr $FFMPEGSOURCE/build && echo "Builddir removed." || echo "No Builddir found."'

Das gelb markierte ist speziell für meine Maxwell 2.0 (gm204) GPU. Also entweder weg lassen, oder selbst raus suchen, was für die eigene GPU das Optimum herauskitzelt.

Bei mir kommt immer wieder mal was neues hinzu, eventuell fällt auch mal was weg, was nicht mehr funktioniert. Das neuste ist zur Zeit:

Das musste ich dann natürlich gleich mal einbauen. 😎

alias svtjpegxsneu='INSTALLATIONSDISK=$HOME/Installationsdisk && \
                        SVT_JPEG_XS_BASE=$INSTALLATIONSDISK/SVT-JPEG-XS_BASE && \
                        SVT_JPEG_XS_SRC=$SVT_JPEG_XS_BASE/SVT-JPEG-XS && \
                        PREFIX=/usr && \
                        TMPFS_SIZE=0 && \
                        ID=$(id --user) && \
                        [ ! -d $INSTALLATIONSDISK ] && mkdir -pv $INSTALLATIONSDISK || echo "$INSTALLATIONSDISK exists" && \
                        [ ! -d $SVT_JPEG_XS_BASE ] && mkdir -pv $SVT_JPEG_XS_BASE || echo "$SVT_JPEG_XS_BASE exists" && \
                        [ -d $SVT_JPEG_XS_SRC ] && yes | sudo rm -rf $SVT_JPEG_XS_SRC && \
                        echo "Builddir cleaned." || echo "Builddir was clean." && \
                        [ ! -d $SVT_JPEG_XS_SRC ] && mkdir -pv $SVT_JPEG_XS_SRC || \
                        echo "$SVT_JPEG_XS_SRC exists. Ok." && \
                        sudo mount -v tmpfs $SVT_JPEG_XS_SRC -t tmpfs -o mode=777,size=$TMPFS_SIZE,uid=$ID && \
                        [ ! -d $SVT_JPEG_XS_SRC/.git ] && git clone https://github.com/OpenVisualCloud/SVT-JPEG-XS.git $SVT_JPEG_XS_SRC && \
                        printf "\n \033[45m\033[1;36m==> SVT-JPEG-XS Sourcecode cloned. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" || \
                        printf "\n \033[45m\033[1;36m==> SVT-JPEG-XS Sourcecode found. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        printf "\n \033[45m\033[1;36m==> Update SVT-JPEG-XS Sourcecode. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        git -C $SVT_JPEG_XS_SRC pull && echo "git pull done." || echo "No git pull." && \
                        printf "\n \033[45m\033[1;36m==> Config for SVT_JPEG_XS_SRC build. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=TRUE \
                        -DCMAKE_C_FLAGS="-march=native" -DCMAKE_CXX_FLAGS="-march=native" \
                        -Wno-deprecated -Wno-error=deprecated -Wno-dev \
                        -S $SVT_JPEG_XS_SRC -B $SVT_JPEG_XS_SRC/my_build -G Ninja && \
                        printf "\n \033[45m\033[1;36m==> Compile SVT-JPEG-XS. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        time ninja -j $(nproc --all) -C $SVT_JPEG_XS_SRC/my_build && \
                        printf "\n \033[45m\033[1;36m==> Install SPIRV-Tools. \033[0m\033[42m\033[1;36m  ==> ... \033[0m \n \n" && \
                        sudo porg -lp svtjpegxs "ninja -j $(nproc --all) -C $SVT_JPEG_XS_SRC/my_build install/strip" && \
                        printf "\n \033[45m\033[1;36m==> Install SVT-JPEG-XS successful. \033[0m\033[42m\033[1;36m  ==> Done.\033[0m \n \n" && \
                        printf "\n \033[45m\033[1;36m==> SVT-JPEG-XS deinstall: \033[0m\033[43m\033[1;36m sudo porg -rv svtjpegxs  <== \033[0m \n \n" || \
                        printf "\n \033[41m\033[1;36m==> Install SVT-JPEG-XS failed.\033[0m \n \n" | tee -a $HOME/buildfail.log ; \
                        cd $HOME ; \
                        sudo umount -fv $SVT_JPEG_XS_SRC ; \
                        [ -d $SVT_JPEG_XS_SRC ] && yes | sudo rm -rf $SVT_JPEG_XS_SRC && echo "Builddir cleaned." || echo "Builddir was clean." ; \
                        cd $HOME'

porg wird für die Verwaltung (Installation oder Deinstallaton) vom Eigenfrickel verwendet, im Wiki:

4dlab

(Themenstarter)
Avatar von 4dlab

Anmeldungsdatum:
14. März 2010

Beiträge: 100

Wohnort: Schaffhausen

So, ich breche jetzt hier ab für heute...

Aktueller Stand.. nach zig purges und neuen Versuchen HandBrake oder ffmeg zum laufen zu bekommen ist die leise Erkenntnis das meine P2000 Quadro nur NVENC API 12.2 unterstützt. Alles was ich an ffmpeg oder HandBrake installiere aber Version 13 voraussetzt. Ich muss also irgendwo eine ffmpeg oder Handbrake Version her bekommen die noch auf 12.3 jetzt.

@trollsportverein: Dein Beitrag ist aktuell noch ein vollends spanisches Dorf für mich.

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 6874

da gibts die älteren Versionen

https://github.com/HandBrake/HandBrake/releases

4dlab

(Themenstarter)
Avatar von 4dlab

Anmeldungsdatum:
14. März 2010

Beiträge: 100

Wohnort: Schaffhausen

ich hab es mal bewusst den alten installiert.

sudo apt install nvidia-driver-510 nvidia-utils-510

Vorher freilich alles entfernt.

Mich dann der vollständigkeit halber auch mal von HandBrake getrennt und es in ffmpeg allein probiert. Was die Sache ja eigentlich vereinfachen sollte. Leider

[hevc_nvenc @ 0x5560fb656a40] Driver does not support the required nvenc API version. Required: 13.0 Found: 12.2
[hevc_nvenc @ 0x5560fb656a40] The minimum required Nvidia driver for nvenc is 570.0 or newer
[vost#0:0/hevc_nvenc @ 0x5560fb6567c0] [enc:hevc_nvenc @ 0x5560fb63e140] Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.
[vf#0:0 @ 0x5560fb653e00] Error sending frames to consumers: Function not implemented
[vf#0:0 @ 0x5560fb653e00] Task finished with error code: -38 (Function not implemented)
[vf#0:0 @ 0x5560fb653e00] Terminating thread with return code -38 (Function not implemented)
[vost#0:0/hevc_nvenc @ 0x5560fb6567c0] [enc:hevc_nvenc @ 0x5560fb63e140] Could not open encoder before EOF
[vost#0:0/hevc_nvenc @ 0x5560fb6567c0] Task finished with error code: -22 (Invalid argument)
[vost#0:0/hevc_nvenc @ 0x5560fb6567c0] Terminating thread with return code -22 (Invalid argument)
[out#0/matroska @ 0x5560fb654b00] Nothing was written into output file, because at least one of its streams received no packets.
frame=    0 fps=0.0 q=0.0 Lsize=       0KiB time=N/A bitrate=N/A speed=N/A elapsed=0:00:00.08
[aac @ 0x5560fb916180] Qavg: 65536.000

Ich muss also denks schauen das ich zum alten Treiber auch noch eine alte ffmpeg Version finde die ⇐ meiner 12.2 arbeitswillig ist UND hevc_nvenc willig ist. Weil den Server jetzt umbauen und da ne aktuelle Karte rein werfen hab ich genausowenig Lust und widerstrebt mir auch schon vom Prinzip her!

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 5645

4dlab schrieb:

@trollsportverein: Dein Beitrag ist aktuell noch ein vollends spanisches Dorf für mich.

Das sind alias für die $HOME/.bashrc. Ich gebe dann einfach nur noch den alias im Terminal ein, wenn ich eine frische Version aus dem FFmpeg Git gebaut haben möchte, so etwa:

ffmpegneu

Wenn noch irgendwas fehlt, muss es nachinstalliert werden. Ich lege nicht die Hand dafür ins Feuer dass der integierte apt-get Aufruf im alias ffmpegneu wirklich alles rein zieht, was nötig ist für den Bau. Dafür ist mein Frickelsystem zu lange über die Jahre gewachsen, als dass ich noch weiß, was in einem jungfräulichem System per default dabei ist. Aber man sieht es ja, falls was fehlen sollte.

Steve_

Avatar von Steve_

Anmeldungsdatum:
10. März 2023

Beiträge: 620

Wohnort: Hannover

4dlab schrieb:

Das ist wenig platzsparend und soll alles in h265 konvertiert werden.

Moin 4dlab,

Platz ist relativ. Warum dieser H265 Auswand? H265 ist doch nur sinnvoll wenn es denn unbedingt die 4K oer gar 8K Aufloesung am Smart-TV sein muss. Ist hier nur eine Meinung aber 1080p oder selbst 720p H264 sind fuer mich persoenlich voellig ausreichend und da muss auch kein ffmpeg gefrickelt werden, sondern da nimmt man die stable, ebenfalls stable Handbrake.

Naja, aber das nur mal so.

Gruss, Steve

Kreuzschnabel

Anmeldungsdatum:
12. Dezember 2011

Beiträge: 2128

Steve_ schrieb:

H265 ist doch nur sinnvoll wenn es denn unbedingt die 4K oer gar 8K Aufloesung am Smart-TV sein muss.

Wieso das? H.265 kodiert generell effizienter als H.264, übern Daumen hast du vergleichbare Qualität bei 60–70% der Datenrate. Und ob auf eine 2-TB-Platte 2000 oder 1200 Filme passen, ist schon ein Unterschied ☺

720p H264 sind fuer mich persoenlich voellig ausreichend

Bei welcher Videobitrate? Mit H.265 reichen bei 720p in der Regel 1,3 bis 1,5 MBit/s aus, solange es sich nicht um alte körnige Filme handelt. Bei H.264 geh ich ungern unter 2,5 MBit/s. Alles Durchschnittswerte, ich kodiere mit CRF.

--ks

Bearbeitet von Berlin_1946:

Forensyntax korrigiert.

4dlab

(Themenstarter)
Avatar von 4dlab

Anmeldungsdatum:
14. März 2010

Beiträge: 100

Wohnort: Schaffhausen

So.. ich galub ich hab das ganze jetzt komplett entknotet. Meine Erkenntnisse und Lösung daraus wie folgt.

1.) Meine P2000 Grafikkarte kann h265 native encoden. Aber nur mit API Set 12.3

2.) Sowohl mit aktuellem Treiber 535 als auch mit dem "prä API13" Treiber 510 wollte das hinten und vorn nich laufen. Man bedenke.. die Karte habe ich in 2019 mal gekauft. Damas für nen Haufen Geld.. aber so iss nunmal das Leben.

3.) Bemerkt das Plex nun mit dem 510er Treiber nimmer die GPU benutzt. Das heisst sehr begrenzte Transcoding Optionen und massiv hohe CPU Last (selbst bei 48 Threads am HPDL 380 Gen8). Das war der Grund warum ich damals die P2000 eingebaut hatte, weil das CPU Seitig ein Krampf in Tüten ist!

Also wieder retour auf aktuellen NVIDIA Treiber. Die Option alter Treiber und alte encoding Software war spätestens beim Plex draussen. Aber auch davor hate ich da aus update Gründen wenig Bock drauf. Man stelle sich vor ich hab das endlich mühsam auf tönernen Füssen am laufen und aktualisieren dann "aus Versehen" das System in diesen kritischen Punkten wieder kaputt. Ne ne.. das keine Option es ist!

Also! Lösung wie folgt. Hardware: Eben in den Kleinanzeigen einen RTX3060Ti bestellt. Stomversorgung (8pin PCIe) werde ich via externen Netzteil sicherstellen. Iss nich toll aber den Server auch noch mit Risern und oder ggf. grad komplett zu ersätzen ist im Anbetracht des Abeitsansatzes auch keine Option.

Software: Alles wieder auf aktuellem Stand nur ohne Handbrake. Ich bleibe bei simplem ffmpeg. Skript nun wie folgt angepasst. Parameter Source: (wird nach aphabet durchsucht und via mediainfo ermitteln und ggf. encoden Traget: Zielpfad. Wird idnetisch zum Quellpfad angelegt. Somit können nach beendigung gesamte Pfade umkopiert werden. Dateiname bleibt gleich sodas Plex nicht merkt das die Datei neu ist und die History sauber erhaltn bleibt. Preset: die klassischen presentes.. ultrafast, fast, ... placebo RF: klassisch, default ist 22 Verbose: stille Herrscht, oder eben nicht Use GPU: Hier die Untescheidung ob nun GPU optimiert auf RTX3060 oder CPU genutzt werden soll Inplace: Hier denke ich an einen dauerhafte Schleife via CronJobs. Hier auf yes wird die Datei im Anschluss direkt wieder an den Quellort zurück gestellt und ersetzt die Originaldatei. Aus meiner Sicht sinnvoll um nicht das Zielverzeichnis sinnlos vollaufen zu lassen.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/bin/bash

# ============================
# Any non-H.265 Video zu H.265 Batch Encoder (FFmpeg Version, RTX3060Ti optimiert, safe inplace mit Dauercheck)
# ============================

# Prüfen, ob Quell- und Zielpfad angegeben wurden
if [ "$#" -lt 2 ]; then
    echo "Usage: $0 <source_folder> <target_folder> [preset] [rf] [verbose] [use_gpu] [inplace]"
    echo "Example: $0 /mnt/source /mnt/target fast 22 yes yes no"
    exit 1
fi

SOURCE="$1"
TARGET="$2"

# Optional: Preset, RF, verbose, GPU, Inplace
PRESET="${3:-fast}"      # default fast
RF="${4:-22}"            # default 22
VERBOSE="${5:-no}"       # default "no"
USE_GPU="${6:-yes}"      # default "yes"
INPLACE="${7:-no}"       # default "no"

# Prüfen, ob mediainfo, ffmpeg und ffprobe installiert sind
command -v mediainfo >/dev/null 2>&1 || { echo >&2 "mediainfo is required but not installed. Aborting."; exit 1; }
command -v ffmpeg >/dev/null 2>&1 || { echo >&2 "ffmpeg is required but not installed. Aborting."; exit 1; }
command -v ffprobe >/dev/null 2>&1 || { echo >&2 "ffprobe is required but not installed. Aborting."; exit 1; }

echo "Source: $SOURCE"
echo "Target: $TARGET"
echo "Preset: $PRESET"
echo "RF: $RF"
echo "Verbose: $VERBOSE"
echo "Use GPU: $USE_GPU"
echo "Inplace: $INPLACE"

# Rekursiv alle Video-Dateien durchsuchen, natürliche Sortierung
find "$SOURCE" -type f \( -iname "*.mkv" -o -iname "*.mp4" -o -iname "*.mov" -o -iname "*.avi" -o -iname "*.m2ts" \) | sort -V | while read -r FILE; do

    # Codec des Videostreams ermitteln
    VIDEO_CODEC=$(mediainfo --Inform="Video;%Format%" "$FILE" | tr '[:upper:]' '[:lower:]')

    if [[ "$VIDEO_CODEC" != "hevc" ]]; then

        # Pfad relativ zum SOURCE
        REL_PATH=$(realpath --relative-to="$SOURCE" "$FILE")
        REL_DIR=$(dirname "$REL_PATH")

        # Ziel-Dateiname bestimmen
        if [[ "$INPLACE" == "yes" ]]; then
            OUTPUT_TMP="${FILE%.*}.mkv.tmp"
        else
            OUTPUT_TMP="$TARGET/$REL_PATH"
            mkdir -p "$(dirname "$OUTPUT_TMP")"
            OUTPUT_TMP="${OUTPUT_TMP%.*}.mkv"
        fi

        # Safety-Check: Encoding nur überspringen, wenn Datei existiert UND Dauer >= 98%
        SKIP_ENCODE="no"
        if [[ -f "$OUTPUT_TMP" ]]; then
            SOURCE_DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$FILE")
            TARGET_DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$OUTPUT_TMP")
            DURATION_RATIO=$(echo "$TARGET_DURATION / $SOURCE_DURATION" | bc -l)
            if (( $(echo "$DURATION_RATIO >= 0.98" | bc -l) )); then
                SKIP_ENCODE="yes"
            fi
        fi

        if [[ "$SKIP_ENCODE" == "yes" ]]; then
            if [[ "$VERBOSE" == "yes" ]]; then
                echo "Skipping $FILE -> already encoded (duration >= 98%)"
            else
                echo "$FILE -> already encoded, skipped"
            fi
            continue
        fi

        # Encoder wählen
        if [[ "$USE_GPU" == "yes" ]]; then
            ENCODER="hevc_nvenc"
            VIDEO_OPTIONS="-preset $PRESET -rc vbr_hq -cq $RF -b:v 0"
        else
            ENCODER="libx265"
            VIDEO_OPTIONS="-preset $PRESET -x265-params crf=$RF"
        fi

        # Verbose Option
        if [[ "$VERBOSE" == "yes" ]]; then
            echo "------------------------------------------"
            echo "Encoding $FILE -> $OUTPUT_TMP"
            echo "Detected codec: $VIDEO_CODEC"
            echo "Encoder: $ENCODER"
            echo "Preset: $PRESET, RF: $RF"
            echo "------------------------------------------"
            ffmpeg -y -i "$FILE" \
                -map 0:v -c:v "$ENCODER" $VIDEO_OPTIONS \
                -map 0:a -c:a copy \
                -map 0:s? -c:s copy \
                "$OUTPUT_TMP"
        else
            echo -n "Encoding $FILE -> $OUTPUT_TMP ... "
            ffmpeg -y -i "$FILE" \
                -map 0:v -c:v "$ENCODER" $VIDEO_OPTIONS \
                -map 0:a -c:a copy \
                -map 0:s? -c:s copy \
                >/dev/null 2>&1
            echo "Done"
        fi

        # Nach erfolgreichem Encoding Original ersetzen, falls inplace=yes
        if [[ "$INPLACE" == "yes" ]]; then
            if [[ -f "$OUTPUT_TMP" ]]; then
                mv "$OUTPUT_TMP" "$FILE"
            else
                echo "Error: Temporary file $OUTPUT_TMP not found, original file not replaced!"
            fi
        fi

    else
        if [[ "$VERBOSE" == "yes" ]]; then
            echo "Skipping $FILE (already H.265)"
        else
            echo "$FILE -> already H.265, skipped"
        fi
    fi

done

echo "All done!"

Für Anregungen zum Script bin ich offen. Bin da kein Profi (meine Zeiten als Softwareentwickler waren 1996 → 2012) und hab mir hier und da auch helfen lassen.

NACHTRAG: Jetzt auch bemerkt das auch Plex mit der aktuellen P2000 Karte auch nur in h264 GPU encodet. Das war mir damals ja vollkommen in Ordnung, somit gar nich drüber nachgedacht.

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 5645

4dlab schrieb:

So.. ich galub ich hab das ganze jetzt komplett entknotet. Meine Erkenntnisse und Lösung daraus wie folgt.

1.) Meine P2000 Grafikkarte kann h265 native encoden. Aber nur mit API Set 12.3

Nein, das hast Du falsch verstanden. Der nvidia-driver darf neuer sein, als das CUDA Toolkit. Für Maxwell und Pascal GPUs gilt beim nvida-driver: maximal eine 580er Version. Das Toolkit darf auch nicht zu neu für die GPUs sein. Das CUDA Toolkit, bzw. der nvcc wird beim erstellen der FFmpeg Binaries benutzt. Für Maxwell und Pascal GPUs ist beim CUDA Toolkit bei 12.9 Schluss.

Schau dir mal die Version von meinem installiertem nvcc an:

nvcc --version

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2025 NVIDIA Corporation
Built on Tue_May_27_02:21:03_PDT_2025
Cuda compilation tools, release 12.9, V12.9.86
Build cuda_12.9.r12.9/compiler.36037853_0

3.) Bemerkt das Plex nun mit dem 510er Treiber nimmer die GPU benutzt. Das heisst sehr begrenzte Transcoding Optionen und massiv hohe CPU Last (selbst bei 48 Threads am HPDL 380 Gen8). Das war der Grund warum ich damals die P2000 eingebaut hatte, weil das CPU Seitig ein Krampf in Tüten ist!

Wegen Plex gibt es einen Patch, der aus dem nvidia-driver die festgelegte Beschränkung der maximalen Anzahl gleichzeitiger NVENC-Videokodierungssitzungen entfernt. Aber nur die Consumer Karten, wie etwa meine alte Nvidia GTX 970, sollten von Beschränkung der maximalen Anzahl gleichzeitiger NVENC-Videokodierungssitzungen betroffen sein.

Das CUDA Toolkit, oder wahlweise auch nur davon gezielt einzeln herausgepickte DEB-Pakete, um Platz auf dem Massenspeicher zu sparen, gibt es aus dem Nvidia eignen Repository für Ubuntu:

Um nicht bei der aktuellen 13er CUDA Toolkit Version zu landen, muss man APT-Pinning nutzen.
So etwa in:
/etc/apt/preferences.d/cuda-ubuntu2404

Package: nsight-compute
Pin: origin *ubuntu.com*
Pin-Priority: -1

Package: nsight-systems
Pin: origin *ubuntu.com*
Pin-Priority: -1

Package: *
Pin: release l=NVIDIA CUDAA
Pin-Priority: 1700

Package: cuda-*
Pin: version 12.9.*
Pin-Priority: 1800

Package: cuda-toolkit-config-common
Pin: version 12.9.79-1
Pin-Priority: 1800

Package: nvidia-settings
Pin: release l=NVIDIA CUDA
Pin-Priority: 1700
Antworten |