Bearbeiten von Videos in MPC mithilfe von Shadern

Es gibt eine Aufgabe: Ändern Sie das Video während der Wiedergabe „on the fly“ - tauschen Sie den rechten und den linken Teil aus. Nicht reflektieren, nämlich ändern, d.h. Schneiden Sie das Bild in zwei Teile und tauschen Sie sie aus. Natürlich können Sie dies mit einem Frame-Server wie AviSynth tun, aber es ist nicht mehr ganz "on the fly" - Sie müssen für jede Videodatei ein Skript schreiben. Ich möchte es schnell und ohne Anstrengung tun.

Auf einer Feige? Um die Vorlesung über maschinelles Lernen von Yandex bequemer zu gestalten. Der Vortragende zeigt live auf die Punkte der Präsentation, und Sie müssen ständig mit Ihren Augen über den Bildschirm springen, um zu verstehen, worum es geht:

Bild

Lösung


Wir verwenden das in Media Player Classic verfügbare Shader-Tool. Im Standard-Kit sind mehrere vorgefertigte Shader zum Bearbeiten von Bildern enthalten - "Prägen", "Graustufen", "16-235 bis 0-255" und dergleichen. Wir brauchen es dort nicht, also erstellen wir einen neuen Shader (ein kleines Programm in der HLSL- Sprache):

sampler s0 : register(s0); float4 main(float2 tex : TEXCOORD0) : COLOR { // swapLine 0.5 = in the middle float swapLine = 1082.0 / 1920.0; tex.x = (tex.x + swapLine) % 1.0; float4 c0 = tex2D(s0, tex); return c0; } 

Wir speichern es im Ordner \ Shaders des Media Players (z. B. C: \ Programme \ MPC-HC \ Shaders) unter dem Namen Shift.hlsl . Wechseln Sie als Nächstes zu den Media Player Classic-Einstellungen ( Optionen / Wiedergabe / Shader ) und fügen Sie den neuen Shader-Shader zur Liste der aktiven Shader vor der Größenänderung hinzu .

Diese Methode der Videoverarbeitung lädt die CPU nicht, da die gesamte Arbeit von der Grafikkarte erledigt wird, auf jeden Fall, wenn sie real und nicht emuliert ist.

Was ist es, Barimore?


Dies ist ein Pixel-Shader, der die Farbe eines Punktes abhängig von den Koordinaten ausgeben soll, die durch den tex- Parameter geleitet werden. Die Variable s0 enthält die Textur mit dem aktuellen Frame des Videos.

Die neue horizontale Koordinate wird als Rest des Teilungsmoduls 1 der Summe der aktuellen Koordinate und der SwapLine- Verschiebung berechnet . Daher verschieben wir den Punkt nach rechts und ordnen ihn nach links um, wenn er über die Abmessungen hinausgeht.

Schließlich gibt der Befehl tex2D (s0, tex) die Farbe des Punktes mit der gewünschten Koordinate aus dem ursprünglichen Rahmen zurück.

PS


Source: https://habr.com/ru/post/de434856/


All Articles