Natron Python 脚本开发入门:插件路径、启动脚本、命令行执行与对象体系全解析
音视频视频处理图形学桌面应用【免费下载链接】NatronOpen-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.项目地址https://gitcode.com/gh_mirrors/na/Natron点击查看免费下载导读Natron 是一款基于节点图的开源视频合成软件其强大之处不仅在于图形界面更在于内置了完整的 Python 脚本接口NatronEngine/NatronGui两个模块允许用户通过脚本自动化建图、批量转码、定制界面甚至编写 PyPlug 插件。本文以官方开发者文档《Introduction》为骨架系统讲解 Natron 的 Python 插件搜索路径、脚本名script-name与标签label的区别、init.py/initGui.py启动脚本机制、三种命令行执行模式项目渲染、脚本渲染、交互式解释器以及核心对象层次并结合仓库源码与示例文件给出可复现的实战方案。读完本文你将能够在命令行下完成序列转码、批量修改参数、编写自定义启动回调并正确理解app1、app、natron等自动声明变量的含义。一、Natron 的 Python 插件搜索路径1.1 搜索顺序当 Natron 查找启动脚本或 Python 组插件PyPlugs时会按以下顺序遍历搜索路径详见 natronpath.rst随安装包自带的插件路径bundled plug-insOpenFX 插件位于安装目录的Plugins/OFX/NatronPyPlugs 位于Plugins/PyPlugs。用户级标准路径非 OpenFX 插件即 PyPlugsWindowsC:\Users\username\.NatronmacOS 与 Linux~/.Natron系统级标准路径WindowsC:\Program Files\Common Files\Natron\PluginsmacOS/Library/Application Support/Natron/PluginsLinux/usr/share/Natron/PluginsNATRON_PLUGIN_PATH环境变量指定的所有路径多个路径之间用;分隔例如NATRON_PLUGIN_PATH/home/username/NatronPluginsA;/home/username/NatronPluginsBPreferences 中 Plug-ins 选项卡里用户自定义的额外搜索路径对应设置项为PyPlugs search path/groupPluginsSearchPath。上述逻辑在源码中得到了精确实现AppManager.cpp 的AppManager::getAllNonOFXPluginsPaths()依次压入当「Prefer bundled plug-ins over system-wide plug-ins」preferBundledPlugins为真且「Use bundled plug-ins」useBundledPlugins开启时优先压入捆绑路径再压入~/.Natron用户路径、系统全局路径AppManager.cpp 中的getPyPlugsGlobalPath()、NATRON_PLUGIN_PATH拆分出的目录以及 Preferences 中的额外路径若「Prefer bundled plug-ins」未勾选则捆绑路径被放到最后。1.2 两条关键 Preferences 设置在 Preferences → Plug-ins 选项卡中实现见 Settings.cppUse bundled plug-insuseBundledPlugins勾选时加载随二进制发行版捆绑的插件取消勾选则完全不加载捆绑插件。Prefer bundled plug-ins over system-wide plug-inspreferBundledPlugins勾选时捆绑插件优先于系统级插件当两者内部 ID 相同时捆绑版本优先默认值为true见 Settings.cpp未勾选时捆绑插件在搜索顺序中排在最后。实战要点在init.py中可以用natron.appendToNatronPath(path)动态追加 PyPlug 搜索路径Python 侧封装见 PyGlobalFunctions.h也可以直接设置NATRON_PLUGIN_PATH环境变量或在 Preferences 中配置三者等价。需要注意的是源码在加载完init.py/initGui.py后会重新计算一次搜索路径AppManager.cpp以便init.py中新增的路径立即生效——这正是「在启动脚本里扩展 PyPlug 路径」这一做法的底层支撑。二、Python 自动声明变量Script-name 与 Label2.1 什么是自动声明变量Natron 在创建特定对象时会自动向 Python 声明一批预置变量覆盖以下对象类型详见 scriptvslabel.rstNatronEngine.Effect节点NatronEngine.Param参数NatronEngine.Layer图层NatronEngine.BezierCurve贝塞尔曲线NatronEngine.App应用实例/项目NatronEngine.TrackTracker 轨道NatronEngine.PyCoreApplicationNatronGui.PyTabWidget、NatronGui.PyViewer、NatronGui.PyPanel设计意图很明确直接用简单变量访问对象比调用一长串查询函数更简洁。例如node app1.Blur1 # 直接通过自动声明变量访问 node app1.getNode(app1.Blur1) # 等价但繁琐的写法2.2 为什么要有两个名字Python 语法要求变量名只能包含字母数字且不能以数字开头。为了让自动声明变量合法Natron 为每个对象维护两个名字Script-name脚本名用于向 Python 自动声明变量的名字。一旦对象被创建即固定不可更改只含字母数字字符且不以数字开头。整个应用内一个 script-name 只能对应唯一一个对象实例。Label标签显示在图形界面上的名字例如节点图中显示的节点标签可以包含任意字符且多个对象可以共用同一个 label。例如my variable 2在 Python 中是非法语法而myVariable 2合法——script-name 的设计就是为了保证自动声明的变量名始终是合法的 Python 标识符。实用规则任何接受对象名字作为参数的函数传入的永远是该对象的script-name。例如Effect.getParam(name)需要参数名即参数的 script-name而非界面标签。2.3 如何在界面上查到各类对象的 script-name文档给出了多种查看 script-name 的途径配套截图位于 Documentation/source/devel 目录节点将鼠标悬停在节点图节点标签的编辑控件上tooltip 中会显示 script-name见 nodeScriptName.png。参数在节点设置面板中将鼠标悬停在参数上tooltip 中加粗显示的就是参数的 script-name见 paramScriptName.png。Roto 节点中的条目在 roto 节点设置面板中悬停条目标签即可看到。Tracker 节点的轨道在 tracker 节点设置面板中悬停 label 列即可看到。标签页pane将鼠标悬停在面板左上角「Manage layout」按钮上即可看到 script-name。Viewer其 script-name 即与其关联节点如Viewer1的 script-name完整路径形如app1.pane1.Viewer1。PyPanel通过类方法getPanelScriptName()获取。命令行或 Script Editor 中也可以直接调用getScriptName()获取节点见Effect.getScriptName()实现于 EffectInstance.cpp其本质是返回底层节点的getScriptName()参数见Param.getScriptName()Roto 条目见ItemBase.getScriptName()轨道见Track.getScriptName()。源码印证脚本名唯一性约束体现在多处例如命令行参数解析在接收-w/-i指定的节点名时会先用makeNameScriptFriendlyWithDots()校验其必须是合法 Python 标识符CLArgs.cpp节点在 Python 中自动注册的属性访问也依赖该命名约束Knob.cpp 生成thisNode ...形式的脚本片段。三、启动脚本init.py 与 initGui.py3.1 两种脚本的分工Natron 启动时会按搜索路径顺序执行两类初始化脚本详见 startupscripts.rst脚本执行时机职责init.py总是执行GUI 与后台模式均执行只初始化非 GUI内容如各类回调callbacks、格式列表、默认参数值等。不能用它创建菜单、窗口initGui.py仅 GUI 模式执行初始化 GUI 专属内容如新菜单、新窗口、自定义面板搜索路径中所有同名脚本会按路径优先级依次全部执行。源码实现在 AppManager.cppfindAllScriptsRecursive()在每个搜索目录中查找init.py且仅在非后台模式!appPTR-isBackground()下查找initGui.py随后在 AppManager.cpp 中按路径顺序执行。两个重要警告两个脚本的文件名必须是init.py和initGui.py否则不会被加载。这些脚本的执行远早于任何应用实例项目的创建。因此不要在脚本顶层直接调用依赖app/app1变量的函数但可以自由定义类与函数留待项目创建后再由回调调用。3.2 官方示例init.py仓库自带完整示例 init.py演示了三个典型用途——添加格式、修改节点参数默认值、扩展 PyPlug 搜索路径# 导入全局变量 natron import NatronEngine # 1) 为项目添加自定义格式 def addFormats(app): app.addFormat(720p 1280x720 1.0) app.addFormat(2k_185 2048x1108 1.0) # 2) 在节点创建后回调中修改默认参数值 def afterNodeCreatedCallback(thisNode, app, userEdited): # 新建 Grade 节点时关闭 Clamp black if thisNode.getPluginID() net.sf.openfx.GradePlugin: thisNode.clampBlack.setDefaultValue(False) # 新建 CImgBlur 节点时把模糊尺寸默认设为 (3,3) elif thisNode.getPluginID() net.sf.cimg.CImgBlur: thisNode.size.setDefaultValue(3, 0) thisNode.size.setDefaultValue(3, 1) def setNodeDefaults(app): app.afterNodeCreated.set(afterNodeCreatedCallback) # 3) 设置项目级默认值输出格式、帧率、帧范围等 def setProjectDefaults(app): app.getProjectParam(autoPreviews).setValue(False) app.getProjectParam(outputFormat).setValue(2k_185) app.getProjectParam(frameRate).setValue(24) app.getProjectParam(frameRange).setValue(1, 0) app.getProjectParam(frameRange).setValue(30, 1) app.getProjectParam(lockRange).setValue(True) def myCallback(app): addFormats(app) setNodeDefaults(app) setProjectDefaults(app) # 注册项目创建/加载回调回调字符串格式为 模块名.函数名 NatronEngine.natron.setOnProjectCreatedCallback(init.myCallback) NatronEngine.natron.setOnProjectLoadedCallback(init.myCallback) # 4) 追加 PyPlug 搜索路径等价于 NATRON_PLUGIN_PATH 或 Preferences 配置 NatronEngine.natron.appendToNatronPath(/Library/Natron/PyPlugs)回调注册的源码依据setOnProjectCreatedCallback/setOnProjectLoadedCallback在 Python 侧封装于 PyGlobalFunctions.hC 实现在 AppManager.cpp。对应地Preferences → Python 选项卡中也提供「After project created」afterProjectCreated、「Default after project loaded」defOnProjectLoaded等设置项Settings.cpp两种途径最终走的是同一套回调机制。3.3 官方示例initGui.py仓库自带的 initGui.py 是一个完整的 GUI 初始化示例演示了自定义 PyPanel 的创建、Qt 信号/槽连接、菜单命令注册定义一个PyPanel子类IconViewer用QtCore.Signal()声明自定义信号用QtCore.Slot()装饰槽函数并在__init__中调用NatronGui.PyPanel.__init__(self, scriptName, label, False, app)文档强调必须先初始化基类否则信号/槽不工作用createButtonParam、createStringParam在面板上建控件用app.pane2.appendTab(panel)把面板加入标签页用app.registerPythonPanel(panel, createMyPlayer)注册以随项目布局保存通过natron.addMenuCommand(Inria/Scripts/IconViewer, createIconViewer, QtCore.Qt.Key.Key_L, QtCore.Qt.KeyboardModifier.ShiftModifier)注册带快捷键的菜单命令通过onProjectCreatedCallback(app)在项目创建时自动创建这些面板该回调需要在 Preferences → Python 的「After project created callback」中登记或按示例通过natron.setOnProjectCreatedCallback(...)注册。四、Natron 命令行执行全解4.1 三种执行模式Natron 支持三种执行模式详见 natronexecution.rst命令行解析与帮助文本实现见 CLArgs.cpp执行 Natron 项目.ntpNatron project file path执行包含 Natron 命令的 Python 脚本Natron Python script path交互式解释器模式Natron -t [可选 Python script path]4.2 通用选项选项说明--background/-b启用后台渲染模式不显示图形界面。使用NatronRenderer或-t时该参数是隐式的无需手动指定若不指定且使用 GUI 版 Natron则项目会像从文件菜单打开一样加载--interpreter/-t[可选]python script file path启用 Python 解释器模式可实时输入 Python 命令。可传入脚本路径在解释器可用前先 source。注意此模式下 Natron不会自动开始渲染被 source 脚本中的 Write 节点必须显式启动。NatronRenderer与Natron在此模式下行为一致且只加载init.py此外从源码帮助文本CLArgs.cpp还可以看到以下常用选项--clear-cache启动时清除图像缓存--clear-openfx-cache启动时清除 OpenFX 插件缓存--no-settings不从磁盘恢复 Preferences使用默认设置--setting namevalue在加载设置后、执行 Python 命令或加载项目前设置指定设置项的值例如--setting enableOpenGLRenderingenabled--opengl choice显式控制 OpenGL 渲染取值为enabled/disabled/foreground实现中会转成设置命令写入enableOpenGLRendering见 CLArgs.cpp。4.3 渲染 Natron 项目.ntp的选项Natron project file path选项说明--writer/-wWriter 节点 script-name[可选filename] [可选frameRange]指定要渲染的 Write 节点。后台模式下只渲染命令行指定的节点若项目中不存在该节点则进程中止。不带-w时会尝试渲染项目中所有 Write 节点。可多次使用-w指定多个 Write 节点若指定了帧范围则所有Write 节点共用同一帧范围--reader/-ireader 节点 script-namefilename为给定 Reader 节点指定要加载的输入文件/序列/视频找不到节点则中止--onload/-lpython script file path在项目创建或加载后执行的 Python 脚本执行顺序在onProjectLoaded/onProjectCreated回调之后适用规则与普通 Python 脚本执行相同--render-stats/-s为每一帧生成渲染统计文件存放在 Writer 节点输出图像旁边同名且扩展名为-stats.txt内容包含各节点渲染耗时等。适合调试或验证渲染正确性。注意写视频文件时无效警告-i 只接受绝对路径以下写法不会生效NatronRenderer -i MyReader ~/pictures.png -w MyWriter rendered###.exr必须使用绝对路径NatronRenderer -i MyReader /Users/me/Images/pictures.png -w MyWriter /Users/me/Images/rendered###.exr帧范围语法源码级补充除了文档给出的firstFrame-lastFrame如10-40解析器tryParseFrameRange/tryParseMultipleFrameRangesCLArgs.cpp还支持更丰富的格式单帧57连续区间10-40带步进1-10:2渲染 1、3、5、7、9逗号分隔多个区间1-10:1,20-30:2,40-50、1329,2450,123,1-10:2项目渲染典型用法Natron /Users/Me/MyNatronProjects/MyProject.ntp Natron -b -w MyWriter /Users/Me/MyNatronProjects/MyProject.ntp NatronRenderer -w MyWriter /Users/Me/MyNatronProjects/MyProject.ntp NatronRenderer -w MyWriter /FastDisk/Pictures/sequence###.exr 1-100 /Users/Me/MyNatronProjects/MyProject.ntp NatronRenderer -w MyWriter -w MySecondWriter 1-10 /Users/Me/MyNatronProjects/MyProject.ntp NatronRenderer -w MyWriter 1-10 -l /Users/Me/Scripts/onProjectLoaded.py /Users/Me/MyNatronProjects/MyProject.ntp--onload脚本示例在加载/创建项目时创建一个 Write 节点import NatronEngine # 项目加载/创建时创建 Write 节点 writer app.createNode(fr.inria.openfx.WriteOIIO)4.4 执行 Python 脚本的选项Natron Python script path脚本参数可以是 GUI 中导出的 Group 脚本、导出的项目或手写的脚本。执行规则Natron 首先查找签名为def createInstance(app, group):的函数。若找到脚本将作为模块导入并执行此时脚本不能访问Natron 自动声明的外部变量只能使用传给createInstance的参数。若未找到该函数整个脚本内容将像直接交给原生 Python 一样逐行执行此时脚本可以访问Natron 声明的外部变量。无论哪种情况变量app始终被定义并指向正确的应用实例。GUI 模式下Natron 在创建图形界面之前source 脚本且不自动开始渲染。后台模式-b或NatronRenderer下必须通过-w或-o指定要渲染的节点若什么都不指定则渲染脚本中创建的所有 Write 节点。如何区分 PyPlug 与普通脚本源码级细节加载 Python 文件时Natron 通过以下标志识别 PyPlugAppManager.cpp文件包含 Natron 生成的标记行、定义了def createInstance(、定义了def getIsToolSet(或包含 PyPlug 魔法行。-o/--output选项将脚本中名为Output1的 Output 节点替换为 Write 节点类似 GUI 中创建 Write 节点需指定输出文件名若此前未指定帧范围则必须一并指定。多个 Output 节点用带序号的变体--output1/-o1查找Output1--output2/-o2查找Output2以此类推-c/--cmdPythonCommand在参数中传入的 Python 脚本执行之前先执行给定的自定义 Python 代码。该选项可多次使用各命令按命令行中的顺序依次执行。脚本渲染典型用法Natron /Users/Me/MyNatronScripts/MyScript.py Natron -b -w MyWriter /Users/Me/MyNatronScripts/MyScript.py NatronRenderer -w MyWriter /Users/Me/MyNatronScripts/MyScript.py NatronRenderer -o /FastDisk/Pictures/sequence###.exr 1-100 /Users/Me/MyNatronScripts/MyScript.py NatronRenderer -o1 /FastDisk/Pictures/sequence###.exr -o2 /FastDisk/Pictures/test###.exr 1-100 /Users/Me/MyNatronScripts/MyScript.py NatronRenderer -w MyWriter -o /FastDisk/Pictures/sequence###.exr 1-100 /Users/Me/MyNatronScripts/MyScript.py4.5 交互式解释器模式Natron -t [可选] Python script pathNatron 先 source 参数中的脚本若有然后把控制权交还用户用户可自由输入由 Natron 内置 Python 解释器执行的命令Natron -t NatronRenderer -t NatronRenderer -t /Users/Me/MyNatronScripts/MyScript.py4.6 实战案例命令行序列转码文档给出了一个完整场景——把图像序列转成另一种格式可用项目文件或脚本两种方式实现。方式一用 Python 脚本推荐灵活编写myStartupScript.py# This is the content of myStartupScript.py reader app.createReader(/Users/Toto/Sequences/Sequence__####.exr) writer app.createWriter(/Users/Toto/Sequences/Sequence.mov) # 设置 script-name使其能从命令行参数引用 # 之后节点可通过 app.MyWriter / app.MyReader 访问 writer.setScriptName(MyWriter) reader.setScriptName(MyReader) # 把 Write 节点的 formatType 设为 Input Stream Format (0) # 使输出视频尺寸跟随输入图像而非项目尺寸 formatType writer.getParam(formatType) formatType.setValue(0) # 连接 Writer 的输入 0 到 Reader writer.connectInput(0, reader) # GUI 版 Natron 需要显式请求渲染 # app.render(writer, 10, 20) # 而 NatronRenderer 或 Natron -b 会根据命令行参数自动开始渲染后台启动NatronRenderer /path/to/myStartupScript.py -w MyWriter 10-20如果不希望每次修改脚本中的文件名可以用-i/-w覆盖输入输出NatronRenderer /path/to/myStartupScript.py -i MyReader /Users/Toto/Sequences/AnotherSequence__####.exr -w MyWriter /Users/Toto/Sequences/mySequence.mov 10-20借助-c注入任意参数例如帧率无法用专用命令行参数指定可用-c注入 Python 代码NatronRenderer /path/to/myStartupScript.py -c fpsValue60 -w MyWriter 10-20脚本相应改为MyWriter.getParam(fps).set(fpsValue)同理可一次性注入多个变量NatronRenderer /path/to/myStartupScript.py -c fpsValue60; readFileName\/Users/Toto/Sequences/AnotherSequence__####.exr\; writeFileName\/Users/Toto/Sequences/mySequence.mov\脚本相应改为reader app.createReader(readFileName) writer app.createWriter(writeFileName)-c可重复出现命令按顺序依次执行。注意文档示例中app.createNode(writeFileName)应为app.createWriter(...)的笔误实际创建 Write 节点应使用createWriter与createReader对称。方式二用 Natron 项目.ntp文件假设已在 GUI 中搭好MyReader---MyWriter直接渲染NatronRenderer /path/to/myProject.ntp -w MyWriter 10-20用命令行参数替换输入输出文件NatronRenderer /path/to/myProject.ntp -i MyReader /Users/Toto/Sequences/AnotherSequence__####.exr -w MyWriter /Users/Toto/Sequences/mySequence.mov 10-20五、对象层次概览NatronEngine 与 NatronGui5.1 两大内部模块Natron 运行时划分为两个内部模块详见 natronobjects.rstNatronEngine核心引擎模块后台模式也可用NatronGuiGUI 模块仅在 GUI 模式下可用。全局可通过NatronEngine.natron或NatronGui.natron访问进程级对象NatronEngine.natron类型为PyCoreApplicationNatronGui.natron类型为PyGuiApplication二者均为单例整个进程生命周期内只存在一个实例使用NatronGui.natron时除核心功能外还额外获得 GUI 功能命令行模式下只能使用NatronEngine.natron。小技巧可以用from NatronEngine import *后直接使用natron省去模块前缀。但文档提醒这会增加读者理解代码的歧义不清楚用的是哪个版本的natron。natron对象负责管理应用级信息——插件、环境、应用设置AppSettings等——同时可持有一个或多个应用实例即打开的多个项目通过全局变量暴露app1 # 第一个应用实例第一个打开的项目 app2 # 第二个项目 ...在后台命令行模式下永远只有一个打开的项目因此 Natron 自动完成赋值app app1。警告在Script Editor中运行时应用处于 GUI 模式因此app变量不会自动声明Script Editor 里应显式使用app1等变量或自行赋值app app1这一点在 initGui.py 的注释中也有明确提示。5.2 对象层级关系App对象负责管理单个项目的全部信息所有节点Effect、项目设置与渲染控制。节点的创建与控制可参考开发者文档中的节点创建章节creatingNode.rst位于 Documentation/source/devel。每个节点拥有若干参数Param即节点设置面板中的控件。同一个Param类也被用于项目设置和应用设置Preferences——因此项目参数通过app.getProjectParam(...)访问而设置项通过natron.getSettings().getParam(...)访问后者在--setting、--opengl选项的实现中直接生成并执行见 CLArgs.cpp。从源码实现看PyCoreApplication的 Python 侧封装定义在 PyGlobalFunctions.h它提供了getPluginIDs、getNatronPath、appendToNatronPath、getInstance、getActiveInstance、getSettings、setOnProjectCreatedCallback、setOnProjectLoadedCallback、isBackground、getNumCpus等全局能力这些正是init.py中常用 API 的实现来源。六、开发实践建议合理规划 script-name由于 script-name 一旦创建即固定且全局唯一编写会被命令行引用的脚本时务必在脚本内用setScriptName(...)显式命名 Reader / Writer如MyReader/MyWriter否则命令行-i/-w无法定位节点。区分回调执行时机init.py中只定义回调与类、注册全局状态不直接操作app项目级回调onProjectCreatedCallback/onProjectLoadedCallback才在项目创建后执行可安全使用app。善用-c与--setting批量转码、参数扫描等场景下通过-c注入 Python 变量、通过--setting覆盖 Preferences可避免频繁修改脚本与项目文件。用-s验证渲染需要确认渲染正确性或排查耗时瓶颈时启用--render-stats获取逐节点统计注意视频输出时无效。启动脚本命名初始化脚本只能叫init.py/initGui.py否则不会加载同名脚本会按搜索路径顺序全部执行注意避免重复注册回调造成副作用。延伸阅读插件搜索路径与启动脚本natronpath.rst、startupscripts.rst脚本名与标签详解scriptvslabel.rst命令行模式完整说明natronexecution.rst对象层次概览natronobjects.rst可直接运行的官方示例init.py 与 initGui.py命令行参数解析源码Engine/CLArgs.cpp搜索路径与启动脚本加载源码Engine/AppManager.cpp赞分享音视频视频处理图形学桌面应用【免费下载链接】NatronOpen-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.项目地址https://gitcode.com/gh_mirrors/na/Natron点击查看免费下载相关推荐Zphisher启动脚本CMD命令执行机制深度解析Zphisher启动脚本CMD命令执行机制深度解析 概述 Zphisher作为一款自动化网络钓鱼工具其核心功能依赖于精心设计的BashBourne Aga渗透测试网络安全CLIAlcatraz命令行脚本开发Bash自动化插件安装Alcatraz命令行脚本开发Bash自动化插件安装 你是否还在手动管理Xcode插件面对繁琐的安装步骤和版本兼容性问题感到头疼本文将通过解析Alcatr开发工具superfile脚本集成外部脚本与命令的执行superfile脚本集成外部脚本与命令的执行 概述 在现代终端文件管理器中与外部脚本和命令的无缝集成是提升工作效率的关键特性。superfile作为一款现CLI开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LitePan 故障排查清单:部署与网盘接入 10 个常见问题速查

LitePan 故障排查清单:部署与网盘接入 10 个常见问题速查

【免费下载链接】LitePan LitePan - 多网盘聚合挂载,支持 WebDAV、STRM、媒体整理、本地挂载、串联任务 项目地址: https://gitcode.com/gh_mirrors/li/LitePan 点击查看 免费下载 LitePan 是一款多网盘聚合挂载工具,支持 WebDAV、STRM 播放…

2026/10/12 21:19:05 阅读更多 →
TobudOS 智能灯小程序开发快速指南:基于腾讯云 IoT Explorer 的双模式小程序接入实战

TobudOS 智能灯小程序开发快速指南:基于腾讯云 IoT Explorer 的双模式小程序接入实战

【免费下载链接】TobudOS TobudOS 是面向物联网领域开发的实时操作系统,早期版本基于腾讯自研的物联网操作系统TencentOS Tiny,2020年由腾讯捐赠到开放原子开源基金会进行孵化,2023年正式更名为TobudOS,TobudOS具有低功耗&#xf…

2026/10/12 21:19:05 阅读更多 →
趣博思 AI 格式排版|为什么你的论文 “明明写好了“,却在格式上反复返工?

趣博思 AI 格式排版|为什么你的论文 “明明写好了“,却在格式上反复返工?

写过毕业论文的人,大概率都有过这样一个瞬间:明明自己熬夜把内容写完了,论文也查过重、改过错别字,觉得万事俱备,结果提交上去,收到的反馈却是 ——“格式不规范,请修改”。 那一瞬间&#xff…

2026/10/12 21:18:04 阅读更多 →

最新新闻

MAS v3.12 免费激活 Windows 与 Office 快速教程:一条命令去掉未激活水印

MAS v3.12 免费激活 Windows 与 Office 快速教程:一条命令去掉未激活水印

MAS v3.12 免费激活 Windows 与 Office 快速教程:一条命令去掉未激活水印 【免费下载链接】Microsoft-Activation-Scripts Open-source Windows and Office activator featuring HWID, Ohook, TSforge, and Online KMS activation methods, along with advanced tro…

2026/10/13 2:16:27 阅读更多 →
STM32与W5500以太网芯片MQTT接入阿里云物联网平台实战

STM32与W5500以太网芯片MQTT接入阿里云物联网平台实战

1. 项目缘起与整体设计思路嵌入式设备联网这件事,说简单也简单,说坑也多。早些年做数据采集终端,想让一块STM32把传感器数据传到云端,方案无非就那么几种:串口接4G模块、WiFi模组透传、或者直接上以太网。串口方案开发…

2026/10/13 2:16:27 阅读更多 →
Mavros深度解析:ROS与Ardupilot可靠通信的七层机制

Mavros深度解析:ROS与Ardupilot可靠通信的七层机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 2:16:27 阅读更多 →
mmap直挂模型权重:从30秒到1.2秒的底层原理与落地实践

mmap直挂模型权重:从30秒到1.2秒的底层原理与落地实践

做推理优化的朋友大概率见过这一幕:同一个 70 亿参数的权重文件,同事的脚本从启动到模型 ready 只要一秒出头,而你的进程还在各种初始化日志里打转,三十秒后才看到 first token。我第一次看到 1.2 秒这个数字时也不信,…

2026/10/13 2:16:27 阅读更多 →
AI日报制作全流程:信息筛选、内容写作与效率优化实战

AI日报制作全流程:信息筛选、内容写作与效率优化实战

1. 一份“AI日报”到底在记录什么每天早上花十五分钟翻一遍行业动态,把值得关注的信息筛出来、理清楚、写明白,这件事我坚持了快两年。很多人觉得“日报”就是流水账,把新闻标题复制粘贴一遍完事,但真正做过内容的人知道&#xff…

2026/10/13 2:16:27 阅读更多 →
Label Studio:两条 Docker 命令完成第一次数据标注并导出模型训练格式

Label Studio:两条 Docker 命令完成第一次数据标注并导出模型训练格式

Label Studio:两条 Docker 命令完成第一次数据标注并导出模型训练格式 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/la/labe…

2026/10/13 2:15:26 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →