Digital Eliteboard - Das Digitale Technik Forum

Registriere dich noch heute kostenloses um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereiche, welche für Gäste verwehrt bleiben

FFMPEG HWACCEL Transcoding

Registriert
11. Juni 2010
Beiträge
4.077
Reaktionspunkte
2.854
Punkte
373
Hallo Zusammen,

nach langer Zeit und einigen Anfragen habe ich hier ein neues Tutorial für euch.
In diesem Tutorial geht es darum, eine durch NVIDIAs GPU gepowertes Transcoding laufen zu lassen.
Darüber hinaus zeige ich euch, wie Ihr Filme ganz Easy und schnell nach MP4 transcoded könnt um Maßig Storage ohne Qualitätseinbußen des Videos zu sparen.

Die Anforderungen:
- Mind. einen Core i5 Prozessor, vergleichsweise AMD
- Mind. 8 GB RAM
- Eine HDD mit genug Kapazität
- eine NVIDIA GPU: GTX 1060 3GB / 6GB, GTX 1070, 1080, Quadro P2000 etc. unter dem würde ich nicht anfangen.
- Installation von Ubuntu Server 18.04 als Grundsystem wird vorausgesetzt.

Schritt 1:
Nach der Installation des Grundsystems und dem installieren der aktuellen Updates installieren wir das CUDA Toolkit und die notwendigen Requirements.

Du musst dich Anmelden oder Registrieren um diesen Inhalt sichtbar zu machen!

Schritt 2:
Nachdem die Installation von CUDA ein paar Minuten gedauert hat, bauen wir uns FFMPEG.

Du musst dich Anmelden oder Registrieren um diesen Inhalt sichtbar zu machen!

Nun checkt eure ffmpeg Version:

Code:
Du musst dich Anmelden oder Registrieren um den Inhalt der Codes zu sehen!

Schritt 3:
Da nun das Grundgerüst zum Transcoding steht, können anfangen zum Beispiel einen Film von MKV nach MP4 zu transcoden.
Mit der Variable $f definiere ich das File, welches transcoded wird und mit $name den Output. Im nächsten Schritt wird CUDA initiiert und das Inputfile gelesen.
Hier beginnt dann nun das eigentlich transcoding. Der hwdownload lädt die Frame in den GPU RAM, ändert das Pixel Format zu nv12 und Uploaded Frames
für das weitere processing. Hier wird mit -c:v:0 der Video Stream 0 nun selektiert und vom Codec H264 (zum Beispiel) mit dem Profil Main und der Geschwindigkeit Slow bei mittlerer
Qualität qmin bis qmax ins Format YUV420P transcoded. Parallel dazu werden die Audio Streams mit deutscher Sprache selektiert und in den Codec LIBFDK_AAC umgewandelt. Hier ist zu beachten, dass der Audiostream 0 Stereo bei 48kbit/s und der Audiostream 1 bei 5.1 mit 384kbit/s umgewandelt wird.

Das folgende Script könnt Ihr als transcode in /usr/local/bin speichern.
Bitte vergesst nicht dem Script entsprechende Rechte zum Ausführen zu geben wie etwa chmod 777 /usr/local/bin/transcode

Du musst dich Anmelden oder Registrieren um diesen Inhalt sichtbar zu machen!
Ausführungsbeispiel:
Wir haben unter /mnt/share/ unseren Film Avatar.264.DEB.mkv liegen.
Dieser Film ist in etwas 10GB groß.

Du musst dich Anmelden oder Registrieren um diesen Inhalt sichtbar zu machen!
Nach etwa 10-15 Minuten ist das Transcoding abgeschlossen.
Nun könnt Ihr mittels ls- l --block-size=m prüfen wie groß das Outputfile Avatar.HVENC.Peters.Release.mp4 ist.
Ihr werdet feststellen, dass der Output am Ende nur noch 2...maximal 3,5GB sein wird ohne das Ihr Qualität am Bildmaterial verloren habt.
Ihr könnt gerne mit dem qmin und qmax etwas experimentieren. Für mich sind dies aber ganz gute Werte gemessen daran, wie die Qualität beim Inputfile ist. Bei qmin und qmax gilt:
Je niedriger der Wert, umso höher die Bitrate --> je Höher die Bitrate umso besser das Bild --> Umso besser das Bild --> Je größer wird das File. Also kann es im Extremfall am Ende auch 30GB groß sein, statt ursprünglich 10GB...nur tut man so nichts gewinnen.

Um den ganzen hier noch etwas Würze zu geben, lege ich noch mein UHD Script ontop.
Ich habe hier wirklich starke Erfolge eingefahren für mich. Ich habe einen guten alten Klassiker mit 49GB MKV auf knapp 8.9GB transcoded. Und ganz ehrlich....wenn ich nicht gerade mit einer Lupe vorm Fernseher sitze, sehe ich keinen Unterschied.


Der Unterschied hier ist zum einen das Pixel Format yuv420p10le, sowie der Color Space color_primaries bt2020 -color_trc smpte2084 -colorspace bt2020nc.
Sind die Settings nicht vorhanden, gehen die Farbtöne verloren und werden durch Weiss ersetzt. In diesem Script sind auch die Metadaten gesetzt, wie die Audiostreams benannt sind.

Du musst dich Anmelden oder Registrieren um diesen Inhalt sichtbar zu machen!

Kleine Info noch zum Abschluss:
Über ein paar kleinere Anpassungen lassen sich damit auch ts Streams erstellen und Livestreamen.
 
Du musst dich Anmelden oder Registrieren um den Inhalt der Angebote zu sehen!
Ich habe damit rumgespielt, sehr interessant!
ich bekomme Errors wenn z.B. ein stream 0:1 oder 0:2 drin ist mit z.B 7.1 Ton

Ausserdem welche Änderungen würdest du vorschlagen wenn das Ausgangmaterial 30fps hat und man möchte egentlich 25fps
Desweiteren welche Änderungen würdest du vorschlagen wenn du mpeg-ts als Ziel hast
 
Zurück
Oben