Editando vídeo no MPC usando sombreadores

Existe uma tarefa: alterar o vídeo "on the fly" durante a reprodução - troque as partes direita e esquerda. Não reflita, a saber, mudança, ou seja, corte a imagem em duas partes e troque-as. Obviamente, você pode fazer isso usando um servidor de quadros como o AviSynth , mas não é mais tão rápido - é necessário escrever um script para cada arquivo de vídeo. Eu quero fazê-lo rapidamente e sem esforço.

Em um figo? Para tornar o curso de palestras sobre aprendizado de máquina do Yandex mais conveniente para visualização. O palestrante aponta para os pontos da apresentação ao vivo e você precisa pular constantemente a tela com os olhos para entender do que se trata:

imagem

Solução


Usamos a ferramenta shader disponível no Media Player Classic . No kit padrão, existem vários shaders prontos para edição de imagens - “Emboss”, “Grayscale”, “16-235 to 0-255” e similares. Como não precisamos dele, criamos um novo sombreador (um pequeno programa na linguagem 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; } 

Nós o salvamos na pasta \ Shaders do media player (por exemplo, C: \ Arquivos de Programas \ MPC-HC \ Shaders) sob o nome Shift.hlsl . Em seguida, vá para as configurações do Media Player Classic ( Opções / Reprodução / Shaders ) e adicione o novo shader à lista de shaders de pré-redimensionamento ativo .

Este método de processamento de vídeo não carrega a CPU, pois todo o trabalho é feito pela placa gráfica, em qualquer caso, se for real e não emulado.

O que é isso, Barimore?


Esse é um sombreador de pixels que deve gerar a cor de um ponto, dependendo das coordenadas que são passadas pelo parâmetro tex . A variável s0 contém a textura com o quadro atual do vídeo.

A nova coordenada horizontal é calculada como o restante do módulo de divisão 1 da soma da coordenada atual e do deslocamento swapLine . Assim, movemos o ponto para a direita e o reorganizamos para o lado esquerdo quando ele ultrapassa as dimensões.

Finalmente, o comando tex2D (s0, tex) retorna a cor do ponto com a coordenada desejada no quadro original.

PS


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


All Articles