YohoYang / VSGUI

一款全新VapourSynth视频压制软件。A video encode GUI like MeGUI for VapourSynth.
GNU General Public License v3.0
133 stars 7 forks source link

增加了自定义设置Python环境为系统环境的选项 #11

Closed sdy623 closed 5 months ago

sdy623 commented 5 months ago

增加了自定义设置Python环境为系统环境的选项,让conda 环境用户也可以直接动用自己的环境压制,从而增加了此工具的灵活性。

YohoYang commented 5 months ago

conda环境没怎么了解过,看起来是一种虚拟py环境,vs也置于其中吧。 晚上我验证一下,不过可能不针对conda环境方面,检视代码没什么问题。同时补上最近发现的坑的修正后,发一个新的release。

sdy623 commented 5 months ago

这边代码刚发现一个vspipe有问题

YohoYang commented 5 months ago

这边代码刚发现一个vspipe有问题

是说你PR修改导致的还是我本身的

sdy623 commented 5 months ago

刚刚发现我这边有个问题 刚改好提交了,vspipe还有队列需要重点测试

sdy623 commented 5 months ago

还有 个人建议发布一个连同运行环境在一起的包 publish里的 Deploy mode 设置成 self-contained 导出100来MB单文件的那个 image

YohoYang commented 5 months ago

还有 个人建议发布一个连同运行环境在一起的包 publish里的 Deploy mode 设置成 self-contained 导出100来MB单文件的那个 image

这个主要是包体太大了,不利于自动更新策略,装一下net6环境也不碍事吧。 - -

sdy623 commented 5 months ago

OK 我自己

还有 个人建议发布一个连同运行环境在一起的包 publish里的 Deploy mode 设置成 self-contained 导出100来MB单文件的那个 image

这个主要是包体太大了,不利于自动更新策略,装一下net6环境也不碍事吧。 - -

确实是这样 我自己build 不含NET6的 只有2MB多 要是集成环境的话 就不单文件了 反倒是 ClickOnce的可以 一键安装到开始菜单 没有环境它会自动装

YohoYang commented 5 months ago

OK 我自己

还有 个人建议发布一个连同运行环境在一起的包 publish里的 Deploy mode 设置成 self-contained 导出100来MB单文件的那个 image

这个主要是包体太大了,不利于自动更新策略,装一下net6环境也不碍事吧。 - -

确实是这样 我自己build 不含NET6的 只有2MB多 要是集成环境的话 就不单文件了 反倒是 ClickOnce的可以 一键安装到开始菜单 没有环境它会自动装

不过如果你自己编译的话可能要把自动更新关了,或者我看看有没有办法把运行环境放到某个文件夹里面也能读取,那就也还不错

YohoYang commented 5 months ago

感觉改的有点乱,我明白你的需求,我会结合你的代码整体调整一下。 设计应当是整合“使用系统环境”,调整为“使用自定义环境”,然后在其内部可以直接选择切换是系统还是自定义。其余流程中的判断理论上都不需要,直接使用原有逻辑即可。

sdy623 commented 5 months ago

对了用自己的py环境 需要将vsedit 还有vspipe 这些都放在这个py环境的目录里,因为昨天发现不这样的话找不到库。还有原先的vspipe目录都是固定住的 都是写的内置环境,选用系统环境的肯定是自己安了一些vpy插件,而且vpy也比较特殊,用各种虚拟环境的也多,他们期待用新插件。

选完vpy加载的时候 会第一次调用preview,要是找不到库,这里就报错。

YohoYang commented 5 months ago

@sdy623 一开始设计之初,这个软件是主要为了提供开箱即用的功能,不过后来有人提issue说想要直接调用系统环境,我也有做支持。不过可能会有一些问题,比如preview时的一些容错处理没考虑到位,毕竟开箱即用的情况下,这些需要的软件如果没有可能就会导致报错。

在非安装到系统的环境下,也就相当于是portable环境下,路径都是依赖在同目录或子目录下,包括官方新版本R66的一键安装脚本也是如此运作,一键安装python和vapoursynth到同一个目录下。 我自己并不这样使用vapoursynth,所以需要你说明一下一些问题,以便进行开发:

  1. 如果vspipe可以不在与python同目录,那么他可以在哪,放在其他目录的话,vs要如何找到python。单纯的python目录应该没有办法定位vs,vs也没办法定位python,除非他们都是安装到系统,或者某一个安装到了系统,拥有了系统变量,可以直接运行。
  2. 如果如你所说,还有一些特殊的vpy插件可以另行安装,那么你说的这种插件可能并不放在vs的plugins目录中,这种情况下,vs要如何找到这些插件
  3. 不确定你说的conda环境还有什么特别之处,他与普通的portable版本,也就是解压即用有什么不同之处,他自身带有了另一个虚拟系统变量的功能?所以才能做到你说的自由放置在各个不同目录。我自己并不熟py,我只是vs的使用者
  4. 有没有什么办法获取到vs调用的插件(dll)路径及脚本(py)路径,像官方R66版本中更换了路径,但是参考vsrepo.py,他们也是写死在代码里的,看起来并没有接口可以获取
sdy623 commented 5 months ago
  1. 实际上,自行安装vapoursynth到自己的python环境时 vspipe就已经复制到和python环境一个目录了,目前找不到vspipe 直接fallback到工具自带的vspipe,应该改成如果检测不到vspipe 这个自定义环境不可用 就当是没安装好环境处理。
  2. 特殊的脚本插件可以这样安装 安装在 环境根目录 或者 环境目录的 lib 文件夹下,vsrepo 默认安装在环境根目录,今天测试的时候才发现的。
  3. conda 环境和其他虚拟环境应该没区别 这一点在我的commit message里没写清楚,但是这个 vaporsynth base环境(一些dll 还有whl) 还有插件 都可以打包成conda package。
  4. 目前还不清楚
sdy623 commented 5 months ago

关于 4 如果环境里面安装了 vsrepo 的话 执行环境内的 python -m vsrepo paths 就可以了,vsrepo没装好 处理逻辑改成环境不可用

YohoYang commented 5 months ago

@sdy623 OK,那整体听起来感觉没那么复杂

  1. 似乎没办法回落工具自带的vspipe,因为工具自带的vs使用的是同目录的python,似乎没有办法再调用指定的py。可以直接提示环境安装有问题,我觉得这是最简单的办法,总之不要闪退什么的,给个报错提示
  2. 根目录或者lib目录都是python可以识别到的目录,都是在python311._pth中定义的,所以并没有那么的自由,还是要放进这个目录内的,那就都能识别到,不会影响使用
  3. 只要安装都在目录内那就和portable(绿色版、便携版)无异
  4. 试了一下这个命令,甚至报错了( 官方也不给个获取路径的参数,怪麻烦的
sdy623 commented 5 months ago

如果 python -m vsrepo paths 报错 那在环境根目录执行 python -m vsrepo -p paths 试试 找dll插件的代码是 写死在 vapoursynth的 vscore.cppcorePluginPathglobalPluginPath 找脚本的是在里vsscript.dll 加载了这个python的dll 所以脚本查找顺序随python来

YohoYang commented 5 months ago

如果 python -m vsrepo paths 报错 那在环境根目录执行 python -m vsrepo -p paths 试试 找dll插件的代码是 写死在 vapoursynth的 vscore.cppcorePluginPathglobalPluginPath 找脚本的是在里vsscript.dll 加载了这个python的dll 所以脚本查找顺序随python来

这个确实可以返回了,有一点帮助

sdy623 commented 5 months ago

今天我这边刚把vapoursynth的conda 安装包做出来 R65版本 python 3.11

运行 conga install vapoursynth -c sdy623 就可以安装

YohoYang commented 5 months ago

今天我这边刚把vapoursynth的conda 安装包做出来 R65版本 python 3.11

运行 conga install vapoursynth -c sdy623 就可以安装

我用一个特定的文件夹来放环境应该也是一样的。最近比较忙,这周末前应该能搞定

YohoYang commented 5 months ago

@sdy623 更新了,看看你那边环境下用起来怎么样

sdy623 commented 5 months ago

@sdy623 更新了,看看你那边环境下用起来怎么样

脚本目录不对 不是 Scripts目录, 这个目录是放python环境下可以用的命令行工具的,脚本目录要么是Lib 要么是环境根目录。

sdy623 commented 5 months ago

@YohoYang 新版的队列压制在压制完视频后 对音频进行处理的过程中 报错了

System.FormatException: Input string was not in a correct format.
   at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type)
   at System.Int32.Parse(String s)
   at VSGUI.API.AudioApi.MakeAudioScript(Int32 audioencoderid, String cutstr, String fpsstr, String inputstr, String delay)
   at VSGUI.API.QueueApi.MakeScriptFile(String queueid)
   at VSGUI.MainWindow.<>c__DisplayClass34_0.<StartQueueJob>b__1()
   at System.Threading.Thread.StartHelper.Callback(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
YohoYang commented 5 months ago

@sdy623 更新了,看看你那边环境下用起来怎么样

脚本目录不对 不是 Scripts目录, 这个目录是放python环境下可以用的命令行工具的,脚本目录要么是Lib 要么是环境根目录。

也可以,那我直接改成根目录

YohoYang commented 5 months ago

@YohoYang 新版的队列压制在压制完视频后 对音频进行处理的过程中 报错了

System.FormatException: Input string was not in a correct format.
   at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type)
   at System.Int32.Parse(String s)
   at VSGUI.API.AudioApi.MakeAudioScript(Int32 audioencoderid, String cutstr, String fpsstr, String inputstr, String delay)
   at VSGUI.API.QueueApi.MakeScriptFile(String queueid)
   at VSGUI.MainWindow.<>c__DisplayClass34_0.<StartQueueJob>b__1()
   at System.Threading.Thread.StartHelper.Callback(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

我并没有复现出来,你的自定义环境目录可以打包直接给一个么,我测试一下。可以去掉一些用不到的dll和脚本。

sdy623 commented 5 months ago

@YohoYang 新版的队列压制在压制完视频后 对音频进行处理的过程中 报错了

System.FormatException: Input string was not in a correct format.
   at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type)
   at System.Int32.Parse(String s)
   at VSGUI.API.AudioApi.MakeAudioScript(Int32 audioencoderid, String cutstr, String fpsstr, String inputstr, String delay)
   at VSGUI.API.QueueApi.MakeScriptFile(String queueid)
   at VSGUI.MainWindow.<>c__DisplayClass34_0.<StartQueueJob>b__1()
   at System.Threading.Thread.StartHelper.Callback(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

我并没有复现出来,你的自定义环境目录可以打包直接给一个么,我测试一下。可以去掉一些用不到的dll和脚本。

我在截取帧数的时候 没有用 位置参数 而是把参数都打全了 软件识别的时候把 start 和 end 都识别进去了

音频压制的时候 vs环境应该不用了,只有视频才会用vs。

YohoYang commented 5 months ago

@YohoYang 新版的队列压制在压制完视频后 对音频进行处理的过程中 报错了

System.FormatException: Input string was not in a correct format.
   at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type)
   at System.Int32.Parse(String s)
   at VSGUI.API.AudioApi.MakeAudioScript(Int32 audioencoderid, String cutstr, String fpsstr, String inputstr, String delay)
   at VSGUI.API.QueueApi.MakeScriptFile(String queueid)
   at VSGUI.MainWindow.<>c__DisplayClass34_0.<StartQueueJob>b__1()
   at System.Threading.Thread.StartHelper.Callback(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

我并没有复现出来,你的自定义环境目录可以打包直接给一个么,我测试一下。可以去掉一些用不到的dll和脚本。

我在截取帧数的时候 没有用 位置参数 而是把参数都打全了 软件识别的时候把 start 和 end 都识别进去了

音频压制的时候 vs环境应该不用了,只有视频才会用vs。

是的,音频压制应该用不到vs,所以可能单纯是avs音频处理那边有别的BUG,一直都有的。 软件自动从vpy读取切割的写法写的很蠢,暂时我也没想到好的完美写法,主要是还有可能使用多个片源复合剪辑。 你可以给一下你的vpy写法,我看看针对的处理一下。顺带把音频那边的健壮性提一下