- 桌面应用
- 音视频
- 视频处理
【免费下载链接】openshot-qt
OpenShot Video Editor is an award-winning free and open-source video editor for Linux, Mac, and Windows, and is dedicated to delivering high quality video editing and animation solutions to the world.
导读:转场(Transition)是视频剪辑中连接两个片段、实现平滑视觉过渡的核心工具。本文以 OpenShot Video Editor 官方文档
doc/transitions.rst为骨架,完整讲解转场的创建、方向控制、透明度处理、裁剪、遮罩(Mask)与自定义转场,并结合当前仓库源码(转场模型扫描、关键帧反转、时间线渲染等)深入剖析其底层实现。读完你将掌握:如何用蓝色圆角转场条实现淡入淡出与擦除效果、如何把任意灰度图变成自定义转场/遮罩、以及转场属性(Brightness、Contrast、Mask 系列等)每一项的真实含义与动画用法。
转场是什么:在时间线上如何工作
转场(Transition)用于在两个片段图像之间逐步淡出(cross dissolve / crossfade)或擦除(wipe)。在 OpenShot 中,转场在时间线上表现为蓝色圆角矩形:
- 当你重叠两个片段时,OpenShot 会自动创建转场;
- 也可以从Transitions(转场)面板手动拖拽一个转场到时间线上;
- 转场必须放置在某个片段的上方(与其重叠),最常见的位置是片段的开始或结尾处。
重要提示:转场不会影响音频!如果想让片段的音量淡入淡出,必须调整片段的
volume(音量)属性,详见 doc/clips.rst 中的 Clip Properties 章节。
下图展示了时间线上两个片段与自动生成的转场之间的关系(图片来自官方文档 doc/images/clip-overview.jpg):
| # | 名称 | 说明 |
|---|---|---|
| 1 | Clip 1 | 一个视频片段 |
| 2 | Transition | 两个片段图像之间的渐变转场,由重叠片段自动创建(不影响音频) |
| 3 | Clip 2 | 一个图像片段 |
转场面板与内置转场资源
在 OpenShot 主界面的Transitions 面板中,可以浏览、筛选并拖拽转场。从源码 src/windows/models/transition_model.py 可以看到,转场模型会扫描三类目录:
info.PATH/transitions/common—— 常用转场(如 Fade In / Fade Out);info.PATH/transitions/extra—— 扩展转场资源(库内置的数百种灰度转场图,如溶解、光线、波纹、擦除等,实际资源位于 src/transitions 目录);- 用户自定义目录
info.TRANSITIONS_PATH(即~/.openshot_qt/transitions/),若存在则追加为user分组。
模型会为每个转场生成缩略图(调用 libopenshot 的Clip/Reader读取第 0 帧并Thumbnail(...)保存到缓存目录),并支持“仅显示常用转场”过滤(actionTransitionsShowCommon)。面板同时提供树状视图与列表视图,两个视图的选择状态会双向同步。当转场被拖拽到时间线时,拖拽数据以 JSON 文本承载转场图片的绝对路径,并附带"transition"标识。
转场方向:正向与反向
转场通过调节被转场覆盖片段的 alpha/透明度来实现效果,既可以从不透明淡到透明,也可以从透明淡到不透明(同样不影响音频)。
- 反向操作:在时间线上的转场上右键单击,选择 :guilabel:
Reverse Transition(反转转场)即可改变淡入淡出的方向; - 手动微调:也可以直接编辑Brightness(亮度)曲线,按任何你希望的方式动画化这个视觉淡变效果。
反向转场的源码实现
Reverse Transition菜单项在 src/windows/views/timeline.py#L4964-L4966 中注册,触发后调用Reverse_Transition_Triggered(src/windows/views/timeline.py#L4812-L4838),其实现逻辑是:
- 遍历所有选中的转场,读取其 JSON 数据;
- 根据项目 FPS(
fps["num"] / fps["den"])与转场时长end - start计算总帧数; - 对
brightness、contrast两个属性调用_reverse_keyframes(src/windows/views/timeline.py#L1136-L1170):- 将所有关键帧点的 X 坐标围绕
min_x + max_x枢轴做镜像翻转; - 同时交换每个点的
handle_left/handle_right贝塞尔手柄;
- 将所有关键帧点的 X 坐标围绕
- 写回内存数据并通过
update_transition_data持久化到项目文件。
也就是说,“反转转场”在底层就是翻转 Brightness/Contrast 关键帧曲线的时间方向,这也是为什么它只对基于静态灰度图的转场有意义。另外,当你把转场拖到片段的左边缘时,OpenShot 还会通过_auto_orient_transition_keyframes(src/windows/views/timeline.py#L1254-L1308)自动推断当前亮度曲线的首尾值方向,并自动翻转,使左边缘放置的转场默认呈现淡入朝向——但若方向无法明确推断(如自定义的非单调曲线),则不会擅自改写你的曲线。
透明度:带 Alpha 通道的素材要小心
如果转场用在本身带有透明通道(alpha channel)的图像或视频上,会出现问题:由于 OpenShot 的转场系统期望第 2 个片段完全覆盖第 1 个片段,一旦第 2 个片段未完全覆盖(例如它含有透明区域),原始片段就会突然消失(popping out of existence),过渡不再平滑。
此时正确的做法是:
- 改用第 1 个片段的
alpha属性,在需要的地方让它自己淡出——所有可编辑的片段属性请参考 doc/clips.rst 的 Clip Properties 表(其中Alpha是关键帧类型曲线,取值范围 1 到 0); - 或者参考 Clip Presets(片段预设)文档;
- 也可以组合使用转场与
alpha淡变:让透明素材既通过转场过渡、又通过 alpha 曲线淡出,从而在两个透明片段之间更平滑地切换。
裁剪与切片:调整转场的起止位置
OpenShot 提供了多种调整转场起止裁切位置(cutting / trimming)的方法:
- 最常用:直接抓住转场的左(或右)边缘并拖动,即可改变其起止位置;
- 拖拽时若多个选中的片段/转场共享最左或最右边缘,一次拖拽可以同时裁切它们;
- 更完整的切片方法与快捷键清单,请参考 doc/clips.rst 的Trimming & Slicing章节与 doc/main_window.rst 的Keyboard Shortcuts章节。
常用切片快捷键速查(详见上述文档):在播放头与多个片段重叠时,右键播放头选 :guilabel:Slice All,或用Ctrl+Shift+K(保留两侧)、Ctrl+Shift+J(保留左侧)、Ctrl+Shift+L(保留右侧);对选中片段使用 :guilabel:Slice,对应Ctrl+K/Ctrl+J/Ctrl+L;W/Q可对选中片段做带波纹(Ripple)的左右侧保留切片。
遮罩(Mask):把转场变成动态遮罩
在视频编辑中,遮罩是一种强大的工具,可以让你有选择地显示视频片段的特定区域,与图像编辑中的蒙版类似:遮罩定义了一个“受影响的区域”,区域之外的内容保持不变。
- 遮罩的形态:可以看作勾勒目标区域的形状或路径,常用形状包括矩形、圆形和自由路径;被遮罩覆盖的区域称为“masked region”。
- 遮罩可以动画化:随时间改变形状或位置,从而实现动态效果,例如揭示隐藏元素、或在不同视觉状态之间转换。
- 在 OpenShot 中把转场变成遮罩:通过自定义Brightness 关键帧曲线来实现。保持亮度值恒定不变(不随时间变化),就得到一个位置固定的静态遮罩;再配合自定义转场图像、甚至自定义图像序列,就能创造出动画化、复杂的遮罩。
静态遮罩与动画遮罩的默认值差异
从源码 src/windows/views/timeline.py#L1106-L1134(_set_transition_mask_defaults)可以看出 OpenShot 区分两种遮罩源并设置不同默认曲线:
- 静态遮罩(单张图像,
has_single_image为真):将start归零,end保留时长,亮度曲线默认从1.0线性衰减到-1.0,对比度默认3.0; - 动画遮罩(视频或图像序列):保留原有
start/end,亮度、对比度默认恒为0.0,由Mask: Time Mode、Mask: Loop等属性决定取哪一帧作为当前遮罩源。
当你编辑转场的基础属性(only_basic_props=True)时,源码会保留原有的 brightness/contrast 关键帧,并在时长变化时按新旧帧数比例缩放关键帧、锚定端点关键帧(_scale_keyframes/_anchor_transition_endpoint_keyframes),避免遮罩动画被意外破坏——这说明 Brightness 曲线在转场系统里承担着“遮罩通道”的核心职责。
自定义转场:任意灰度图都能用
任何灰度图像都可以作为转场(或遮罩)使用,方法如下:
- 将图片文件放入你的
~/.openshot_qt/transitions/文件夹; - 给文件起一个易于辨认的名字;
- 重启 OpenShot。
重启后,你的自定义转场/遮罩就会出现在转场列表中。从源码看,用户目录info.TRANSITIONS_PATH定义为USER_PATH/transitions(见 src/classes/info.py#L63),与文档中的~/.openshot_qt/transitions/一致;转场模型会把它作为第三个user分组加载(src/windows/models/transition_model.py)。
文件名命名方面,模型会把文件名中的下划线转换为空格并首字母大写作为显示名称;若文件名以_数字结尾,还会把数字提取为占位符(如wipe_1→ “Wipe 1”)。另外,隐藏文件(以.开头)以及thumbs.db会被跳过。
还有一个值得知道的实现细节:保存项目文件时,src/classes/json_data.py#L312-L321 会把位于info.PATH/transitions目录内的转场路径转换为可移植的相对路径@transitions/<category>/<file>(例如@transitions/common/fade_in.jpg),这样项目文件跨机器打开时仍能正确定位内置转场。
转场属性详解
查看转场属性:在转场上右键单击,选择 :guilabel:Properties,属性编辑器会出现。以下属性中大部分可以随时间动画化:
注意:请密切留意播放头(红色播放线)的位置——关键帧会在当前播放位置自动创建,这是快速制作动画的关键。另外再次强调:转场不影响音频,音频淡入淡出请调整片段的
volume属性(见 doc/clips.rst)。
| 转场属性名 | 类型 | 说明 |
|---|---|---|
| Brightness | Key-frame | 转场图像的亮度曲线,决定淡入淡出/擦除的效果(范围 -1 到 1) |
| Contrast | Key-frame | 转场图像的对比度曲线,决定淡入淡出/擦除的柔和度或硬度(范围 0 到 20) |
| Duration | Float | 转场时长(秒)。只读属性。 |
| End | Float | 转场结束处的裁切位置(秒)。 |
| ID | String | 随机生成的 GUID(全局唯一标识符),创建时自动分配。只读属性。 |
| Mask: Invert | Bool | 反转遮罩源:亮区变暗区、暗区变亮区。 |
| Mask: Loop | Bool | 当转场比遮罩源更长时,循环播放动画遮罩源。 |
| Mask: Source | Reader | 作为转场灰度遮罩源的图像、图像序列或视频。 |
| Mask: Time Mode | Enum | 控制 OpenShot 如何将转场时间映射到动画遮罩源的帧。 |
| Parent | String | 此转场的父对象,使众多关键帧值初始化为父值。 |
| Position | Float | 转场在时间线上的位置(秒)。 |
| Replace Image | Bool | 调试用:显示转场图像本身(而不是变成透明度)。 |
| Start | Float | 转场开始处的裁切位置(秒)。 |
| Track | Int | 承载转场的轨道层级(更高的轨道渲染在更低的轨道之上)。 |
Duration(时长)
Duration是表示转场长度(秒)的浮点值,只读,计算公式为:End - Start。要修改时长,必须编辑Start和/或End属性。
- 使用示例:检查转场时长,确保它适配项目中某个特定时间槽。
- 技巧:需要匹配对话或场景等特定时间间隔的转场,请善用 Duration 属性来核对。
End(结束点)
End定义转场结束处的裁切点(秒),控制转场在时间线上可见多少内容。修改它会影响Duration。
- 使用示例:裁掉转场结尾不需要的部分,或让转场终点与其他片段对齐。
- 技巧:组合使用
Start与End可精确控制转场的可见区间。
ID(标识符)
ID是每个转场创建时随机生成的 GUID(全局唯一标识符),只读,确保其唯一性。
- 使用示例:在自定义脚本或自动化任务中引用特定转场。
- 技巧:虽然通常由系统在幕后管理,但理解转场 ID 有助于高级项目定制。
Mask 系列属性
Mask: Source、Mask: Time Mode、Mask: Loop、Mask: Invert共同控制转场使用的灰度遮罩:
静态遮罩使用单张图像;
动画遮罩可以使用视频或图像序列,由时间映射(Time Mode)与循环(Loop)选项决定转场中每一时刻使用遮罩源的哪一帧。
使用示例:当自定义遮罩的可见/隐藏区域反了时,使用
Mask: Invert一键翻转。技巧:使用动画遮罩时,务必先仔细裁剪好遮罩源,再启用循环行为(Loop)。
Track(轨道层级)
Track是表示转场所在层级的整数。更高轨道上的转场渲染在更低轨道之上。
- 使用示例:将转场安排在不同图层,创造视觉深度与复杂度。
- 技巧:像文字叠加或图形这类需要显示在其他元素之上的内容,使用更高的轨道。
转场在时间线上的几何计算
从渲染层源码 src/windows/views/timeline_backend/geometry/transition.py 可以看到,时间线会把每个转场转换为QRectF矩形:水平位置 =track_name_width + position * pixels_per_second,宽度 =(end - start) * pixels_per_second,垂直位置由轨道层级(layer)决定,然后按水平起点排序并记录每个条目的右侧最大延伸,用于后续的命中检测、选择与绘制。绘制层 src/windows/views/timeline_backend/paint/transition.py 则负责把转场画成蓝色圆角矩形(默认不透明度 0.75、选中 0.88,锁定轨道再乘以 0.8),顶部带有标题与下拉菜单按钮,并使用像素图缓存提升滚动性能——这就是“蓝色圆角矩形”这一视觉形态的代码来源。
相关文档导航
- 转场完整说明:doc/transitions.rst
- 片段属性(
alpha、volume等)与裁剪/切片指南:doc/clips.rst - 全部键盘快捷键:doc/main_window.rst
- 转场面板与模型实现:src/windows/models/transition_model.py
- 反向转场与遮罩默认值实现:src/windows/views/timeline.py
- 转场几何与渲染:src/windows/views/timeline_backend/geometry/transition.py、src/windows/views/timeline_backend/paint/transition.py
- 桌面应用
- 音视频
- 视频处理
【免费下载链接】openshot-qt
OpenShot Video Editor is an award-winning free and open-source video editor for Linux, Mac, and Windows, and is dedicated to delivering high quality video editing and animation solutions to the world.
相关推荐
Passwordless性能优化技巧:提升认证速度的7个方法
Passwordless性能优化技巧:提升认证速度的7个方法 Passwordless作为一款流行的Node.js/Express无密码认证模块,其性能直接影响
后端应用安全react-native-reanimated 布局过渡(Layout Transitions)完全指南:从预置过渡到自定义动画
react native reanimated 布局过渡(Layout Transitions)完全指南:从预置过渡到自定义动画 布局动画(Layout Ani
移动开发前端.NET MAUI动画系统详解:从属性动画到自定义转场
.NET MAUI动画系统详解:从属性动画到自定义转场 动画系统核心架构 .NET MAUI Multi platform App UI 提供了统一的跨平台动画
前端移动开发桌面应用跨平台UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考