- 桌面应用
- 音视频
- 视频处理
【免费下载链接】FFmpegFreeUI
3FUI 是 ffmpeg 在 Windows 上的轻度专业交互外壳,收录大量参数,界面美观,交互友好。此项目面向国内使用环境,让普通人也能够轻松压制视频和转换格式。
本篇指南以 FFmpegFreeUI(3FUI)仓库中的 Linux 使用文档 为主体,讲清三件实事:如何通过 Wine/Proton 等兼容层在 Linux 上启动这个基于 WinForms 的图形界面、如何用"转译模式"三个设置项把任务真正交给 Linux 原生的ffmpeg,以及界面乱码、高分屏缩放、Wine 路径转换等高频问题的解决办法。读完后你可以独立搭建一套"3FUI 图形参数 + 原生 FFmpeg 执行"的跨平台工作流。
前置条件:一个正常工作的兼容层
FFmpegFreeUI 使用了非跨平台的 UI 框架 WinForms,因此在 Linux 上必须通过兼容层运行。前置条件有两点:
- 正常工作的 Wine(或基于 Wine 的兼容层):可以是原版 Wine,也可以是 Proton 等基于 Wine 的衍生环境。各发行版的安装配置方法差异较大,建议先掌握 Wine 的基础知识,尤其是
WINEPREFIX的作用——它决定了 Wine 使用哪个虚拟C:盘目录。 - 耐心与包容心:兼容层环境下各类场景都可能出现问题,有些是操作失误,有些是系统 Bug。无法覆盖所有问题,遇到问题先对照本文排查。
文档给出两条重要提示:
- 若计划原生调用 Linux 版本的 ffmpeg(而非转译后的
ffmpeg.exe),推荐使用原版 Wine以获得最好的支持;Proton 或 Wine Staging 等其他兼容层可能会遇到各种问题。- 仓库提供了一键脚本入口,可自动处理字体、脚本、
WINEPREFIX等一系列问题。
简单使用方法:兼容层内直接跑 Windows 版 ffmpeg
如果没有特殊需求,最省心的方案是让 FFmpegFreeUI 和 Windows 版ffmpeg.exe一起运行在兼容层内。步骤如下:
- 下载 Windows 版本的 ffmpeg 发行版;
- 将
ffmpeg.exe和ffprobe.exe放置于FFmpegFreeUI.exe的同级目录; - 使用兼容层启动
FFmpegFreeUI.exe。
如果想把 Windows 版 ffmpeg 放在其他特定目录,可以在设置中填入 ffmpeg.exe 的完整 DOS 路径(如Z:\home\username\Downloads\ffmpeg-win\ffmpeg.exe)或相对路径。这里对应的正是源码中"替代进程文件名"设置项的解析逻辑。
在 设置_v6.vb 中可以看到这三个设置项的定义与解析:
Public Property 替代进程文件名 As String = "" Public Property 覆盖参数传递 As String = "" Public Property 转译模式 As Boolean = False Public Shared Function 获取FFmpeg进程文件名() As String Dim custom = If(实例对象?.替代进程文件名, "").Trim() Return 解析工作目录进程文件(If(custom <> "", custom, "ffmpeg.exe")) End Function从源码结构看,获取FFmpeg进程文件名()的优先级是:若"替代进程文件名"非空则使用它,否则回退到默认的ffmpeg.exe;且相对路径会先尝试在"有效工作目录"下解析(设置_v6.vb)。
调用原生 FFmpeg:完整脚本方案
注意:本节方案仅在 Wine 环境经过测试,在其他兼容层(如 Steam 的 Proton Experimental / Proton Hotfix 或 Wine Staging)中不保证可用。
思路是:让 FFmpegFreeUI 启动的不是 ffmpeg,而是一个批处理脚本;脚本再启动一个 Python 脚本去调用系统 PATH 中的原生ffmpeg,并把日志、退出码通过临时文件回传给批处理,由批处理转发给 FFmpegFreeUI 的进程输出流。共需准备三个脚本。
1. wait-exit.bat:暴露给 FFmpegFreeUI 的最外层脚本
负责调用run-ffmpeg.py、等待 ffmpeg 进程结束、并转发其日志:
@echo off setlocal enabledelayedexpansion set "log_file=Z:\tmp\3fui_ffmpeg.log" set "ret_file=Z:\tmp\3fui_ffmpeg.ret" set "finish_sign=Z:\tmp\3fui_ffmpeg_finish" set "log_file_tail=Z:\tmp\3fui_ffmpeg.log.tail" del "%log_file%" del "%ret_file%" del "%finish_sign%" del "%log_file_tail%" set "delay_script=%1" shift set "run-ffmpeg=%1" set "args=" :loop shift if "%~1"=="" goto after_args set args=!args! "%~1" goto loop :after_args REM start "" %run-ffmpeg% %args% :check if exist "%finish_sign%" ( set /p ret=<"%ret_file%" if not defined ret ( set ret=1 ) type "%log_file%" 1>&2 exit /b !ret! ) else ( if exist "%log_file_tail%" ( type "%log_file_tail%" 1>&2 ) cscript %delay_script% 2>nul goto check ) endlocal2. run-ffmpeg.py:实际调用 ffmpeg 的脚本
将 ffmpeg 的 stderr(ffmpeg 的进度与报错都输出到 stderr)逐行重定向到日志文件,同时维护一个"尾行"文件供外层轮询展示最新进度:
#!/bin/env python3 import sys import subprocess LOG_FILE = "/tmp/3fui_ffmpeg.log" LOG_TAIL_FILE = "/tmp/3fui_ffmpeg.log.tail" RET_FILE = "/tmp/3fui_ffmpeg.ret" FINISH_SIGN = "/tmp/3fui_ffmpeg_finish" def main(): try: ffmpeg_cmd = ['ffmpeg'] + sys.argv[1:] with open(LOG_FILE, 'w') as log_file, open(LOG_TAIL_FILE, 'w') as tail_file: process = subprocess.Popen( ffmpeg_cmd, stderr=subprocess.PIPE, stdout=subprocess.DEVNULL, text=True, bufsize=1 ) if not process or not process.stderr: return for line in process.stderr: tail_file.seek(0) tail_file.write(line) tail_file.truncate() tail_file.flush() log_file.write(line) log_file.flush() return_code = process.wait() with open(RET_FILE, 'w') as ret_file: ret_file.write(str(return_code) + '\n') except Exception as e: with open(RET_FILE, 'w') as ret_file: ret_file.write("1\n") finally: with open(FINISH_SIGN, 'w') as f: f.write("") if __name__ == "__main__": main()3. delay.vbs:延时工具脚本
在wait-exit.bat的轮询循环中实现 1 秒延时:
WScript.Sleep 10004. 配置 FFmpegFreeUI
- 在
设置的"替代进程的文件名"设置项(linux.md 中写作"替代 Process 的 FileName")中填入wait-exit.bat的完整 DOS 路径或相对路径(引号可选)。如:"Z:\path\to\wait-exit.bat" - 在
设置的"覆盖参数传递"设置项中依次填入delay.vbs和run-ffmpeg.py的完整 DOS 路径或相对路径(引号可选)与占位符<args>,以空格分隔。如:"Z:\path\to\delay.vbs" "Z:\path\to\run-ffmpeg.py" <args> - 勾选
设置中的"转译模式",即可正常添加文件进行编码。
源码层验证:这两个设置项如何生效
任务执行时,编码任务_v6.vb 的运行步骤Async是这样组装Process的:
process.StartInfo.FileName = If(stepItem.阶段 = 预设数据_v6.命令行阶段.FFprobe获取时长, 设置_v6.获取FFprobe进程文件名(), 设置_v6.获取FFmpeg进程文件名()) process.StartInfo.WorkingDirectory = 设置_v6.获取有效工作目录() process.StartInfo.Arguments = If(stepItem.阶段 = 预设数据_v6.命令行阶段.FFprobe获取时长 OrElse 设置_v6.实例对象.覆盖参数传递 = "", stepItem.命令行, 设置_v6.实例对象.覆盖参数传递.Replace("<args>", stepItem.命令行))也就是说:StartInfo.FileName完全由"替代进程文件名"决定(这正是把入口换成wait-exit.bat的原理);而 ffmpeg 的真实命令行会替换进"覆盖参数传递"模板中的<args>位置。这与文档中脚本参数顺序delay.vbs run-ffmpeg.py <args>的约定一一对应。
"转译模式"开关的作用则由 Module1.vb 的转译模式处理路径实现——它把 DOS 风格路径转成 Unix 风格(去掉盘符根、\替换为/、确保以/开头):
Public Function 转译模式处理路径(p As String) As String Dim a = p Dim root As String = Path.GetPathRoot(a) If Not String.IsNullOrEmpty(root) Then a = a.Substring(root.Length) End If a = a.Replace("\", "/").Replace("//", "/") If Not a.StartsWith("/"c) Then a = "/" & a Return a End Function在 编码队列_v6.vb 中,开启转译模式后,输入文件路径在传入命令行前都会经过该函数转换。这解释了为什么wait-exit.bat中使用的临时文件路径写的是Z:\tmp\...(DOS 形式,供 Windows 侧批处理使用),而run-ffmpeg.py中写的是/tmp/...(Unix 形式,供 Linux 侧 Python 使用)——同一份/tmp目录在两侧的映射不同。
替代方案 A:只把 3FUI 当参数生成器
如果不需要进度更新与报错回显,最简单的做法是:仅勾选设置->转译模式,开始任务后忽略软件的报错信息,在编码队列界面点击复制命令行,然后自行在终端中运行。复制命令行按钮在 Form_v6_编码队列.vb 中有对应的实现,复制出的即完整 ffmpeg 命令行。
替代方案 B:用 start /unix 直接拉起原生 ffmpeg
如果不在乎进度和报错,只想让 3FUI 直接启动系统里的原生 ffmpeg,可以:
- 在
设置->替代进程的文件名中填入start; - 在
设置->覆盖参数传递中填入/unix /path/to/ffmpeg <args>,把路径替换为你想使用的 ffmpeg 可执行文件的完整 Unix 路径,如/usr/bin/ffmpeg; - 勾选
设置->转译模式。
此时开始编码任务后,对应任务会显示"错误"(因为start立刻返回),但 ffmpeg 会在后台持续运行直至完成,其 stderr 输出可以在启动 wine 的终端中看到。
为什么不用
start /wait?因为start /wait对于start /unix启动的进程不生效。
一键脚本:3fui-linux-scripts
不想手写上述脚本与配置的话,3fui-linux-scripts项目提供了一键运行脚本:
- 包含调用原生 ffmpeg 所需的全部脚本与设置,可一键配置、一键启动;
- 支持一键安装中文字体,解决界面乱码问题;
- 其中的
prepare.sh也演示了"注册表伪装中文字体"的做法,可作字体问题的参考实现。
常见问题排查
界面口口口乱码
3FUI 提供了字体设置选项,目前位于设置->全局字体,选择支持中文显示的字体并确认即可。若希望在首次启动前就配好字体(或找不到该设置项),可在FFmpegFreeUI.exe同级目录中新建Settings.json:
{ "字体": "some font" }将some font替换为系统上实际安装的中文字体(可用fc-list : family查看系统字体列表)。
设置全局字体后仍可能在某些位置出现乱码,可任选其一处理:
- 通过 winetricks 安装
fakechinese; - 将微软雅黑字体
msyh.ttc放入 FFmpegFreeUI 运行时相同的WINEPREFIX中的C:\windows\Fonts\文件夹; - 把你喜欢的中文字体文件放入同一
WINEPREFIX的C:\windows\Fonts\,并手动修改注册表伪装中文字体(可参照 3fui-linux-scripts 仓库prepare.sh中的做法)。
高分辨率屏幕界面过小
- 将环境变量
$WINEPREFIX设为 FFmpegFreeUI 运行时相同的WINEPREFIX,通过winecfg打开 Wine 配置界面; - 在"显示"选项卡中调整"屏幕分辨率"里的 DPI,高分辨率情况下推荐144。
Wine 下的路径转换
以下操作均需保持与 FFmpegFreeUI 运行时相同的
$WINEPREFIX;如果不了解这个概念,默认值是$HOME/.wine,不用管。
使用
winepath -w /unix/path将 Unix 路径转换为 DOS 路径,winepath -u Z:\dos\path将 DOS 路径转换为 Unix 路径;或者在
winecfg的Drivers选项卡下查看所有盘符映射位置;或者查看
$WINEPREFIX/dosdevices下的符号链接,例如ls -l $WINEPREFIX/dosdevices的输出:lrwxrwxrwx 1 username username 10 Jan 01 00:00 c: -> ../drive_c lrwxrwxrwx 1 username username 1 Jan 01 00:00 z: -> /这表示
C:\映射到$WINEPREFIX/drive_c/,Z:\映射到系统根/。
经验规律:Wine 通常把
Z:\映射为系统根目录/,Proton 还会把X:\映射为用户家目录/home/username/。但这只是经验规律,建议按上述方法在实际环境中自行确认。
小结:三条路线如何选择
| 场景 | 方案 | 特点 |
|---|---|---|
| 不关心跨平台细节 | 简单使用:ffmpeg.exe与 3FUI 同在兼容层内 | 最省心,但编码器为 Windows 版 |
| 想用系统 ffmpeg 且要进度/报错回显 | 完整方案:wait-exit.bat+run-ffmpeg.py+delay.vbs三脚本 | 需要手写/一键脚本配置,功能完整 |
| 只生成参数 | 勾选转译模式 + 复制命令行到终端执行 | 零脚本成本 |
| 只需 3FUI 拉起原生 ffmpeg | start /unix /usr/bin/ffmpeg <args> | 任务显示"错误"属正常现象 |
无论选哪条路线,"替代进程文件名"、"覆盖参数传递"、"转译模式"这三个设置项(定义于 设置_v6.vb,界面实现在 Form_v6_设置_转译辅助.vb)都是其背后的统一机制:前者改写Process.StartInfo.FileName,中间者改写Arguments模板,后者改写路径形态。理解这一机制后,本文所有方案都能自行推导与迁移。
- 桌面应用
- 音视频
- 视频处理
【免费下载链接】FFmpegFreeUI
3FUI 是 ffmpeg 在 Windows 上的轻度专业交互外壳,收录大量参数,界面美观,交互友好。此项目面向国内使用环境,让普通人也能够轻松压制视频和转换格式。
相关推荐
Vision-Agents 实时视频风格迁移实操教程:3 步把摄像头画面变成任意画风
Vision Agents 实时视频风格迁移实操教程:3 步把摄像头画面变成任意画风 实时视频风格迁移过去常被卡在"先拍后处理"上——录完、上传、渲染、下载,一
Agent 框架音视频计算机视觉iSH兼容层终极指南:在iOS设备上运行完整Linux系统的完整教程
iSH兼容层终极指南:在iOS设备上运行完整Linux系统的完整教程 iSH是一个革命性的开源项目,让你能够在iOS设备上运行完整的Linux shell环境。
操作系统虚拟化CLIWine跨平台兼容技术:让Windows程序在Linux上原生运行的终极方案
你是否曾经遇到过这样的困境:工作中需要使用某个Windows专属软件,但又不想放弃Linux系统的稳定性和高效性?🤔 现在,通过Wine这一革命性的兼容层技术
虚拟化系统编程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考