Montage vidéo dans MPC à l'aide de shaders

Il y a une tâche: changer la vidéo «à la volée» pendant la lecture - permuter les parties droite et gauche. Ne reflètent pas, à savoir le changement, c.-à-d. couper l'image en deux parties et les échanger. Bien sûr, vous pouvez le faire en utilisant un serveur d'images comme AviSynth , mais ce n'est plus tout à fait à la volée - vous devez écrire un script pour chaque fichier vidéo. Je veux le faire rapidement et sans forcer.

Sur une figue? Pour rendre le cours magistral sur l'apprentissage automatique à partir de Yandex plus pratique pour la visualisation. Le conférencier pointe les points de la présentation en direct, et vous devez constamment sauter à travers l'écran avec vos yeux pour comprendre de quoi il s'agit:

image

Solution


Nous utilisons l'outil de shader disponible dans Media Player Classic . Dans le kit standard, il existe plusieurs shaders prêts à l'emploi pour l'édition d'images - "Emboss", "Niveaux de gris", "16-235 à 0-255" et similaires. Nous n'en avons pas besoin là-bas, nous créons donc un nouveau shader (un petit programme en langage HLSL ):

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; } 

Nous l'enregistrons dans le dossier \ Shaders du lecteur multimédia (par exemple, C: \ Program Files \ MPC-HC \ Shaders) sous le nom Shift.hlsl . Ensuite, accédez aux paramètres de Media Player Classic ( Options / Lecture / Shaders ) et ajoutez le nouveau shader Shader à la liste Active pre-Resize shaders .

Cette méthode de traitement vidéo ne charge pas le CPU, puisque tout le travail est effectué par la carte graphique, en tout cas, si elle est réelle et non émulée.

Qu'est-ce, Barimore?


Il s'agit d'un pixel shader qui devrait afficher la couleur d'un point en fonction des coordonnées transmises via le paramètre tex . La variable s0 contient la texture avec l'image actuelle de la vidéo.

La nouvelle coordonnée horizontale est calculée comme le reste de la division modulo 1 de la somme des coordonnées actuelles et du décalage swapLine . Ainsi, nous déplaçons le point vers la droite et le réorganisons vers la gauche lorsqu'il dépasse les dimensions.

Enfin, la commande tex2D (s0, tex) renvoie la couleur du point avec les coordonnées souhaitées à partir du cadre d'origine.

PS


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


All Articles