MPC Shader
Some shaders for Media Player Classic - BE.
为MPC-BE设计的若干个着色器(shader)。
事件一:竖屏转横屏
事件
由于竖屏视频和横屏屏幕长宽比不同,在不发生形变的前提下,为了避免黑边,我总结有这几种显示效果:
- 画幅裁切。放大画面,强制只显示和屏幕等宽的部分,超出的高度部分不显示。
- 横向复制画面。画幅裁切并垫底,添加模糊效果,上方居中叠加一层适应高度的画面。
- 当然还可以继续叠buff,在2的基础上,对叠加的一层画面进行放大,令中心的部分在高度方向做一定程度的裁切,从而提高主体部分占据屏幕的尺寸。
显然,无论是后期软件还是直播软件都能够做到这样的效果,但是播放器能不能直接做到呢?更进一步,如果视频文件是使用方法2、3强制把竖屏视频转为横屏的,有没有播放器能够一键切换效果,还原为竖屏尺寸呢?
方案
本仓库已经给出了解决方案。包含了如下几个shader:
参数
竖屏转横屏-阵列单行支持如下参数
#define screen_width 1920 // 播放器宽度
#define screen_height 1080 // 播放器高度
#define split_v 1 // 纵向阵列画面数量
#define black_border false // 阵列单行是否保留一定的黑边
事件二:摇摆器(镜头摇晃)
事件
很多视频、动图都有摇晃摄像机的效果,让原本的画面变得更加有感觉——就像你在现场,在移动视线一样,就像你在移动脚步一样。
在视频剪辑工具中,快速实现这种效果的功能称为摇摆器
。
那么如果原本的视频和图片是固定机位的,能不能在播放器里一键产生这样的效果呢?
方案
本仓库已经给出了解决方案。包含了如下几个shader:
镜头晃动-摇摆器1.hlsl
镜头晃动-摇摆器1.hlsl
镜头晃动-摇摆器1.hlsl
实际上他们的代码完全相同,只是预设了不同的参数,从而实现了越来越强的摇晃效果。
你也可以根据自己的需求修改其中的参数。
由于截图已经无法体现效果,见视频:https://www.bilibili.com/video/BV11T411g7XN?vd_source=e3dbb941e2013f112ce8c77e8e66b15a
参数
#define freq 2 // 摇晃的速度
#define amp_x 0.03 // 横向移动比例,应设置为0-0.5之间(实际上0.5已经把图像完全移动到播放器外了
#define amp_y 0.08 // 纵向移动比例,应设置为0-0.5之间(实际上0.5已经把图像完全移动到播放器外了
#define remove_border true // 是否通过放大画面来去除移动镜头产生的黑边
事件三:裁切伪横屏视频
事件
一些竖屏视频通过水平复制画面的方式强行制作为横屏视频,播放器能否还原原本的竖屏画面呢?事实上MPC-BE右键-视频画面-缩放以填满窗口,然后调整窗口尺寸即可。 但是能否在全屏播放的前提下,还原原本的竖屏画面呢?
方案
本仓库已经给出了解决方案:裁切伪横屏视频.hlsl
,** 注意此着色器需应用为预调整大小像素着色器**,,当输入视频宽高比大于1时,中心的一倍画面正常显示,其余部分显示为纯黑色。
参数
竖屏转横屏-阵列单行支持如下参数
#define split 3 // 画面水平切分为几份(即只显示原画面的几分之一)
其他:
红蓝通道分离
#define amp 5 // 通道偏离的像素数量
使用方法
-
由于MPC-BE的着色器无法变更输出的长宽尺寸,因此在应用竖屏转横屏模式的着色器之前,必须先通过快捷键或者菜单调整视频画面为拉升模式。
参考
中心强调使用的模糊算法来自 https://github.com/dinfinity/mpc-pixel-shaders