No copy
Forward
Back
reload
;Message
首页
💼工作
🔧机械 ♑ 液压
✈ 航空相关
📏仪表及电气
⏳ 阀门相关
⛹️♀️生活
📽️影音相关
👀我看...
♪ 我听...
🗑️其他
🚴♀️游记
关于...
友链
统计
更多...
旅游地图
XC'S 图册
XC'S视频
XS'小工具
单位转换
Search
1
小米11 Ultra 刷机rom、面具magisk、太极.阳折腾记
16,172 阅读
2
Solidworks 2016 激活Activator.GUI.SSQ产生的卡顿 闪退
8,940 阅读
3
Apache & PHP 8.0.X 分享Apache80_2454.8210_arm_64.qpkg
8,760 阅读
4
电液伺服阀特性参数、定义、技术术语,如何测试操作。
6,963 阅读
5
MXplayer,vlc如何访问远程webdav服务器,如何投屏?
6,256 阅读
登录
/
注册
Search
标签搜索
培训学习
软件分享
xc影后感
想说两句
液压经验
心灵感悟
液压产品样册
行业知识
AMESIM
试验台
影评
测试设备
测试内容与方法
生活小技巧
生活感言
仪表产品样册
追忆少年
3D模型
typecho
经验
xc
累计撰写
225
篇文章
累计收到
1,031
条评论
首页
栏目
💼工作
🔧机械 ♑ 液压
✈ 航空相关
📏仪表及电气
⏳ 阀门相关
⛹️♀️生活
📽️影音相关
👀我看...
♪ 我听...
🗑️其他
🚴♀️游记
页面
关于...
友链
统计
旅游地图
XC'S 图册
XC'S视频
XS'小工具
推荐
单位转换
最新回复
222
2025-06-28
匆匆过客
谢谢
1
2025-06-27
匆匆过客
xiexie
dynastyyu
2025-06-25
匆匆过客
111
搜索到
25
篇与
标签 软件分享 下的文章 -
的结果
2025-05-05
ALIST 外调mpv播放器进行在线播放视频
概述:最近对mpv播放器很感兴趣,alist网盘程序虽然下面继承了多个第三方播放器,但是没Mpv,原因就是mpv播放器默认不会将mpv://协议注册到系统中。正文:那我们就自己动手吧,大概原理也很简单,让系统知道mpv://协议应该调用mpv播放器进行播放,另外就是在alist网页中注入相关按钮和生成mpv://协议。我们先完成系统注册,网上都会提到使用 mpv-handler ,但我试了多次,最终也没成功,我很奇怪,它通过注册表启动mpv-handler.exe,然后这个应用查找本地的config文件,在config文件中,我们要修改本地的mpv播放器路径。流程多次尝试,最后总结的成功流程:先系统注册表,告诉系统mpv://协议,就去启动一个mpv-handler.bat或mpv-handler.exe的文件,因为此时的URL真实地址前面多了一个mpv://,MPV播放器正常来说,还是不识别的,当然,有的系统会被识别,为了统一标准,提高运行成功率,我们需要mpv-handler.bat或mpv-handler.exe将mpv://删除,只保留后面的视频地址给Mpv播放器。注册mpv-handler.bat或mpv-handler.exe创建注册表脚本新建一个文本文件,粘贴以下内容,然后另存为 mpv_protocol.reg(确保保存类型选"所有文件"):隐藏内容,请前往内页查看详情{callout color="#f0ad4e"}"D:\mpv\mpv-handler.bat" 要换成你的本地路径{/callout}生成mpv-handler.bat@echo off setlocal :: 去掉前缀并解码 set "raw_url=%~1" set "raw_url=%raw_url:mpv://=%" :: 确保 URL 是有效的(修复 https// 到 https://) set "raw_url=%raw_url:http//=http://%" set "raw_url=%raw_url:https//=https://%" :: 打印 URL 和路径以调试 echo Incoming URL: %~1 echo Decoded URL: %raw_url% echo MPV Path: "D:\mpv\mpv\mpv.exe" :: 启动 mpv start "" "D:\mpv\mpv\mpv.exe" "%raw_url%" :: 检查是否成功启动 if %errorlevel% neq 0 ( echo Failed to start MPV! Error code: %errorlevel% ) else ( echo MPV started successfully! ) 生成mpv-handler.exe首先要安装好python其次安装模块pip install pyinstaller pip install pyinstaller 系统有多个python记得前面加python -mmpv-handler.py( 请根据需要修改D:\mpv\mpv\mpv.exe)import sys import subprocess def fix_url(url): """ 修复 URL 格式,例如将 https// 修正为 https:// """ url = url.replace('mpv://', '') # 去掉前缀 url = url.replace('https//', 'https://') # 修正协议部分 url = url.replace('http//', 'http://') # 修正协议部分 return url if len(sys.argv) > 1: raw_url = sys.argv[1] fixed_url = fix_url(raw_url) # 修复 URL mpv_path = r"D:\mpv\mpv\mpv.exe" # 启动 MPV 播放器并传入修复后的 URL subprocess.Popen([mpv_path, fixed_url])编译pyinstaller --onefile mpv-handler.py出错就强制编译C:\Users\Admin\AppData\Local\Programs\Python\Python312\Scripts\pyinstaller.exe --onefile mpv-handler.py 新生成的exe文件在:dist\mpv-handler.exe修改alist页面大概alist管理页面,在全局的自定义中,添加以下代码。<script> (function() { 'use strict'; // --- Configuration --- const MPV_PROTOCOL = 'mpv://'; const BUTTON_CONTAINER_SELECTOR = 'div.hope-flex[class*="igXrpAn-css"]'; // More flexible selector const EXISTING_BUTTON_SELECTOR = 'a.hope-anchor[href*="://"]'; const MPV_BUTTON_ID = 'alist-external-mpv-button'; // *** IMPORTANT: Make sure this path is correct OR use Base64 *** const MPV_ICON_SRC = 'data:image/png;base64,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'; // Or 'data:image/png;base64,YOUR_BASE64_STRING' const DEBUG_MODE = true; // Set to true for more console logs // --- Logging Function --- function log(...args) { if (DEBUG_MODE) { console.log('[AList MPV Button]', ...args); } } log("Script Initializing..."); // --- Helper Functions --- function extractRawUrl(href) { if (!href) return null; log("Attempting to extract raw URL from:", href); const specificSchemes = [ { prefix: 'iina://weblink?url=', isBase64: false }, { prefix: 'potplayer://', isBase64: false }, { prefix: 'vlc://', isBase64: false }, { prefix: 'nplayer-', isBase64: false }, { prefix: 'omniplayer://weblink?url=', isBase64: false }, { prefix: 'figplayer://weblink?url=', isBase64: false }, { prefix: 'infuse://x-callback-url/play?url=', isBase64: false }, { prefix: 'filebox://play?url=', isBase64: false }, { prefix: 'intent:', isBase64: false }, { prefix: 'iplay://play/any?type=url&url=', isBase64: true } ]; for (const scheme of specificSchemes) { if (href.startsWith(scheme.prefix)) { let urlPart = href.substring(scheme.prefix.length); // Handle intent URLs if (scheme.prefix === 'intent:') { const intentEndIndex = urlPart.indexOf('#Intent'); if (intentEndIndex !== -1) { urlPart = urlPart.substring(0, intentEndIndex); } } // --- 修改开始: 先移除后缀,然后解码 --- urlPart = urlPart.replace(/:0$/, ''); // 移除潜在的 :0 后缀 if (scheme.isBase64) { try { urlPart = atob(urlPart); log("Decoded Base64 URL:", urlPart); } catch (e) { console.error("Error decoding Base64 URL:", e, urlPart); return null; } } else { // 对非 Base64 的 URL 进行 URL 解码 try { urlPart = decodeURIComponent(urlPart); log("URL-decoded part:", urlPart); } catch (e) { console.error("Error URL-decoding part:", e, urlPart); // 如果解码失败(比如 URL 本身有问题),也认为无效 return null; } } // --- 修改结束 --- // 现在检查解码后的 URL if (urlPart.startsWith('http://') || urlPart.startsWith('https://')) { log("Extracted URL:", urlPart); return urlPart; } else { log("Processed part doesn't look like a valid URL:", urlPart); } } } // Fallback (也需要解码) const genericMatch = href.match(/(https?:\/\/.*)/); if (genericMatch && genericMatch[1]) { try { const fallbackUrl = decodeURIComponent(genericMatch[1].replace(/:0$/, '')); log("Extracted URL using fallback (decoded):", fallbackUrl); if (fallbackUrl.startsWith('http://') || fallbackUrl.startsWith('https://')) { return fallbackUrl; } } catch (e) { console.error("Error URL-decoding fallback URL:", e, genericMatch[1]); } } console.warn("Could not extract raw URL from:", href); return null; } function createMpvButton(rawUrl) { if (!rawUrl) return null; log("Creating MPV button for URL:", rawUrl); const mpvUrl = MPV_PROTOCOL + rawUrl; const link = document.createElement('a'); link.id = MPV_BUTTON_ID; // Use specific classes found in the example, be careful if they change link.className = 'hope-anchor hope-c-iHuheP hope-c-PJLV hope-c-PJLV-idrWMwW-css'; link.href = mpvUrl; link.target = "_blank"; link.style.marginLeft = '4px'; // Add a little space const img = document.createElement('img'); // Use specific classes found in the example img.className = 'hope-image hope-c-PJLV hope-c-PJLV-idGrHCo-css'; img.src = MPV_ICON_SRC; img.alt = "MPV"; img.title = "使用 MPV 播放"; // Add basic error handling for the image img.onerror = () => { console.error(`Failed to load MPV icon: ${MPV_ICON_SRC}`); img.alt = "MPV (icon error)"; // Show text if icon fails img.style.width = '20px'; // Give it some size even without icon img.style.height = '20px'; img.style.border = '1px solid red'; // Make it visible }; link.appendChild(img); return link; } function addMpvButtonToContainer(container) { if (!container) { log("addMpvButtonToContainer called with null container"); return; } if (container.querySelector(`#${MPV_BUTTON_ID}`)) { log("MPV button already exists in container:", container); return; // Already added } log("Attempting to add MPV button to container:", container); const existingButton = container.querySelector(EXISTING_BUTTON_SELECTOR); if (!existingButton || !existingButton.href) { log("No existing button with href found in container."); return; } const rawUrl = extractRawUrl(existingButton.href); if (!rawUrl) { log("Failed to extract raw URL from existing button:", existingButton.href); return; } const mpvButton = createMpvButton(rawUrl); if (mpvButton) { // Append the button container.appendChild(mpvButton); log("MPV button added successfully."); } else { log("Failed to create MPV button element."); } } // --- MutationObserver Logic --- const observerCallback = (mutationsList, observer) => { log("MutationObserver detected changes..."); for (const mutation of mutationsList) { if (mutation.type === 'childList') { mutation.addedNodes.forEach(node => { if (node.nodeType === Node.ELEMENT_NODE) { // Check if the added node itself is the container if (node.matches && node.matches(BUTTON_CONTAINER_SELECTOR)) { log("Container node added:", node); addMpvButtonToContainer(node); } // Check if the added node contains the container else if (node.querySelectorAll) { const containers = node.querySelectorAll(BUTTON_CONTAINER_SELECTOR); if (containers.length > 0) { log("Container node found within added node:", node); containers.forEach(addMpvButtonToContainer); } } } }); // Also check removed nodes in case the container is re-rendered quickly // This might be overkill, but could help in some frameworks mutation.removedNodes.forEach(node => { if (node.nodeType === Node.ELEMENT_NODE && node.matches && node.matches(BUTTON_CONTAINER_SELECTOR)) { log("Container node removed, will re-check on next addition."); } }); } // Optional: Observe attribute changes if the container exists but buttons are added later // else if (mutation.type === 'attributes' && mutation.target.matches(BUTTON_CONTAINER_SELECTOR)) { // log("Attributes changed on container, re-checking:", mutation.target); // addMpvButtonToContainer(mutation.target); // } } }; // Start observing const observer = new MutationObserver(observerCallback); // Observe body, but consider observing a more specific, stable parent if possible observer.observe(document.body, { childList: true, subtree: true }); log("Observer started."); // --- Initial Check --- log("Performing initial check for existing containers..."); document.querySelectorAll(BUTTON_CONTAINER_SELECTOR).forEach(container => { log("Found existing container on load:", container); addMpvButtonToContainer(container); }); log("Initial check complete."); })(); </script>总结:mpv-handler.bat和mpv-handler.exe二选一就可以了,在win系统中exe文件要比bat文件更可靠一些,但bat文件修改起来更方便一些,按需选择,最后记得更新mpv_protocol.reg的位置信息。我已经打包好了这些文件,确保你的mpv.exe和我一致的话(D:\mpv\mpv\mpv.exe),拿来直接用就可以了。{alert type="info"}mpv-handler.bat或mpv-handler.exe的路径问题,按照我上面的代码,就需要把这两个文件拷贝到D:\mpv的路径下才行,或者根据自己情况修改!{/alert}隐藏内容,请前往内页查看详情
2025年05月05日
56 阅读
1 评论
0 点赞
2025-05-01
Topaz Video AI 任务结束自动关机小程序
概述Topaz Video AI做视频增强,这个时间一般都很长,应该多数人都希望有个执行任务结束后,有个自动关机选项。可是找了半天,也没找到。索性用AI工具编写一个吧,使用 Gemini 2.5 Pro Preview 03-25 编写,调试了几次,就可以了,分享给大家。运行环境:需要 python并且需要安装依赖pip install psutil或者python -m pip install psutil运行执行bat文件即可或者python topaz_shutdown_monitor.py运行原理监控Topaz Video AI.exe在运行,Topaz Video AI的任务主要是启用了ffmpeg.exe 进行编码,我仔细观察了一下,发现ffmpeg.exe 进程占用率很高,所以这个程序就是监测:在Topaz Video AI启动的情况下ffmpeg.exe的进程,当ffmpeg.exe消失后,就代表任务完成,进入关机倒计时。交互设置ffmpeg结束后多久,就认为任务完成。设置关机倒计时时间。探讨:这里我提一个自己的小疑问,电脑有GPU,但我发现ffmpeg.exe运行主要还是用到CPU,我以为是ffmpeg.exe没有带GPU硬件编码驱动,因为我看到Topaz Video AI自动生成的ffmpeg.exe文件很小,但是当我把我电脑上带有GPU驱动的ffmpeg.exe拷贝覆盖后,结果Topaz Video AI根本无法识别。所以,CPU满载运行,GPU空闲,有人解决这个问题吗??附件:Topaz Video AI关机程序隐藏内容,请前往内页查看详情
2025年05月01日
3 阅读
0 评论
0 点赞
2025-04-28
mpv player 的UI 版本及截屏说明,局域网远程操控
概述优秀的视频播放器,每个系统都有很优秀的选择,对于电脑用户,相信potplayer绝对是大多数人的选择,我却独爱简约风格的mpv player.它跨平台能力也很强,基本上常用给的几个平台都有它的版本,但正是因为它太简约了,很多时候需要命令来操作它,另外就是快捷键使用,在它原始的播放器界面,没什么可以让给用户选择的按钮。具体使用参考非官方的中文汉化说明 mpv播放器的使用引导正文更多人还是习惯鼠标选择,这就需要一个给mpv安装一个皮肤,说白了,也就是通过按钮实现了命令或快捷键的效果,谁会闲着没事记那么多快捷键。mpv UI我这里分享一个网上已经优化并自带UI的版本:有两套UI第一种效果看图,很漂亮,但没关闭按钮,可以按快捷键F11或在任务栏关闭。带有右键弹出菜单。第二种效果看图,也很漂亮,按钮要丰富一些,看个人喜好!带有右键弹出菜单。截屏的问题看说明文档,截屏的快捷键是S,但我按了无效,找了半天原因,解决方案如下:编辑 input.conf 文件,(没有就创建),添加以下配置来确保截图快捷键正常工作:SHIFT+s screenshot编辑 mpv.conf 文件,(没有就创建),添加以下配置来设置截图保存路径:screenshot-directory="C:\Users\您的用户名\Pictures" screenshot-format=pngmpv 局域网控制这种场景适合远距离,你用你的手机,就能登陆局域网网页,来做基本的操作。配置方法,编辑 mpv.conf 文件,添加以下内容## 局域网控制 input-ipc-server=\\.\pipe\mpvsocket scripts-append=scripts/main.lua load-scripts=yes然后把webuicontrol文件夹下的内容,复制到程序运行的根目录下(mpv.exe所在目录)就可以了,如果想修改端口号,已我目前修改的mpvnext未来,就修改mpvnext\portable_config\script-opts\webui.conf 中的内容。我已经配置好了,mpvnext开箱即用,首先要确保mpv已经打开,然后用手机访问运行mpv的设备IP地址+端口8086参考我的:http://192.168.0.141:8086/附件打包的mpv中,截屏和局域网,我均已配置好了mpvnext,另一个没配置。隐藏内容,请前往内页查看详情
2025年04月28日
21 阅读
1 评论
0 点赞
2024-12-18
ESP32-S3局域网采集模拟量传感器数值
概述最近对单片机感兴趣了,来回折腾了小一个月了,其中,AI给了极大的帮助,这里记录以下成果:利用ESP32-S3 的局域网功能,具体功能如下:1.包含了12路模拟量的物理量转换;2.2路温度(PT100、PT1000)的测量;3.4路继电器的手动及自动控制;局域网配置有AP热点和wifi一键配网功能,配网成功后,自动显示IP;详细说明采用ESP32-S3 ,我用的是ESP32-S3-DevKitC-1 有44个针脚,理论上,只要是ESP32 都可以的,但要看你具体的GPIO是否有那么多个模拟量采集通道。上电后,搜索网络AP热点 AP_SSID = "YourAPSSID"; AP_PASS = "12345678"; 输入密码后,链接成功后,就可以登陆了,AP网络的IP地址是 192.168.4.1内容展示剩下的就很简单了,用浏览器打开上面的IP地址后,查看和设置。首页系统设置模拟量配置页面温度传感器配置页面继电器配置页面数据的滤波经过多次对比,发现采用幅值法有比较好的体感,由于ADC干扰电压,采样值的波动和偏离, 幅值法很简单, 如果ADC数值调动没有超过设定值,就保持不变,一秒钟采集10次的差值,会显示在配置页面,供参考。数据的校准经过对比,发现单片机转换后的电压和实测值存在较大的偏差,不但有偏差,还存在差不多0.03V的调动,并且3.0-3.3V还存在盲区,这让人真头疼,我采用了信号发生器进行了简单的数值查找法,只利用0-3.0V的范围,以下是我校准的过程实测电压(V)ADC电压(V)实测电压(V)ADC电压(V)实测电压(V)ADC电压(V)0.0 ->0.0001.0 ->0.9322.0 ->1.9320.1 ->0.0651.1 ->1.0322.1 ->2.0320.2 ->0.1651.2 ->1.1322.2 ->2.1320.3 ->0.2651.3 ->1.2322.3 ->2.2320.4 ->0.3651.4 ->1.3322.4 ->2.3320.5 ->0.4651.5 ->1.4322.5 ->2.4320.6 ->0.5651.6 ->1.5322.6 ->2.5320.7 ->0.6651.7 ->1.6322.7 ->2.6650.8 ->0.7651.8 ->1.7322.8 ->2.8000.9 ->0.8651.9 ->1.8322.9 ->2.932实测电压(V)ADC电压(V)3.0 ->3.10很明显,分辨率在0.1V ,当ADC实测值在右侧数值的+/-0.02V 范围内,就按照左侧数数值修订。当ADC实测值不在上面的范围,就比例对应在相邻值之间。我并没有进一步细化分辨率。由于ADC的值存在波动,我觉得这样做的意义不大,且耗费较多的精力。注意事项ESP32 能接受的电压范围只能是0-3V, 至于传感器的信号电压:0-5V、0-10V 、4-20mA 都需要电压转换,建议采用市场上成熟的转换模块,如果没有,可以考虑用电阻分压的原理进行转换,具体模拟量配置页面中有说明。代码获取托管在 GITHUB结论目前看来,单片机来做工业传感器的采样,并不是很好,只能用在控制精度和稳定性不高的场合,玩玩可以,但真正要用到传感器的数据采集和显示,我认为PLC是比较专业的。
2024年12月18日
34 阅读
0 评论
0 点赞
2024-10-19
solidworks 零件属性和工程图图框数据关联,以及装配图bom清单的生成
概述最近工作需要,涉及到工程图规范化的问题,用了两天的时间研究了一下solidworks的工程图相关用法,特此分享,顺便也记录一下。我们用软件制图的时候,前期尽可能的把各个数据都录进去,这样在出工程图或装配图的时候,就非常便捷,可以说是一键生成。正文零件设计公差的数据一切的根源都是零件设计,3D模型设计的时候,最好就需要录入公差,并且规范操作,找好对应的基准做尺寸限制,这样在工程图中就可以自动生成尺寸:零件属性菜单制作零件的属性可以点击“文件属性”按钮打开:可以看到我这里已经录入了部分数据在自定义属性,其实旁边的“配置属性”和自定义属性功能都差不多,但它的优先级会更高,功能更多,比如利用数据表驱动零件的设计尺寸,批量生成多种同类产品或图纸,我们这里只想影响工程图的一些显示信息,我就用在自定义属性了。当然,这里你可以把信息手敲进去,便于后面工程图的调用,不过,还有一个更好的办法,就是自定义一个属性录入菜单。更直观便捷一些。上面这个是我自定义好的菜单,每个零部件都可以通过它快速便捷的录入基础信息,是不是也想要,下面附件可以直接下载我目前设置好的文件,也可以自己动手来配置。如果是用我目前配置好的文件,请直接跳过点击右下角的按钮,打开模板选项对话框:这里显示了菜单文件的位置和编辑程序,打开编辑程序其实,还是很简单,1、2、3 一共3列,第1列主要是编辑菜单所用的部件或控件,按需选择在第2列,第3列主要是各个控件的属性修改,相信你琢磨一下,很快就能上手。需要说明的是:序号4 是数据传递的函数名称,不要重名,序号5和6 其实就分别对应了上面提到的“自定义属性”和“配置属性”,看你是打算保存在哪个位置。编辑好,保存好位置,建议利用solidworks的默认位置,这样打开就很容易调用,在这里查看:当然,你也可以自定义位置。工程图配置我们需要编写自己公司的工程图图框,然后把数据链接在一起,这样,当导入模型文件的时候,这些信息将会自动被填写。是不是非常便捷?当然,你可以用我上面的菜单文件,要可以用我这里的工程图模板,这样是匹配的,可以直接达到上面的效果。关联数据通过鼠标点选如果你想自定义图框,并关联数据,可以按照以下操作。默认是工程图的属性,如果和模型本身的一些属性有关,可以选择下面的那个选项。通过编辑传递函数另一个方法就是直接编辑传递的函数名称,确保文件属性有对应的选项,然后直接编辑同样的名称,即可调用。装配图bom最后讲讲装配图的bom表单生成问题,solidworks自带了一些材料bom格式的表格,但每个公司多少都有一些差异,就像我们公司用的就是这种样式。我这里已经编辑好了,你可以直接拿来用,用法如下:表格如果很短,就可以直接插入在装配图中,如果bom清单较多,建议导出为excel进行编辑保存。如果你的格式和我差不多,可以在我这个基础上进行更改,但如果想自己编辑自己的格式,可以在solidworks自带的bom表格中,自行设计,数据的引用可以双击顶行的A、B...来选择关联数据。附件:XC工程图A4.DRWDOTXC装配图属性.asmprpXC材料明细.sldbomtbtXC零件属性.prtprp隐藏内容,请前往内页查看详情
2024年10月19日
34 阅读
0 评论
0 点赞
2024-06-24
利用ffmpeg 将3D视频上下格式,左右格式转换为2D格式正常视频
概述现在3D视频资源不多,虽然体感是不错,但穿戴麻烦,片源太大,在加上3DVR格式的加持,这东西半死不活,我有一个3D头盔,刚拿到手完了一段时间,现在一直在吃灰中。手上有个三星公司出的3D视频,也是多年前从互联网下载的MTV,韩国男女团现场演唱会,很精彩,今天忽然想,要是能分享在我的视频页面就好了。我的视频资源是上下格式的,在网上找以下资料,还是ffmpeg强大,原理到也简单,只保留左眼或右眼的视频,再调整一下画面比例就OK了。正文上下/左右3D格式分离为2D正常视频下面的代码是上下格式分离为正常的2D视频代码:相关的代码说明 stereo3d 最核心的代码就是:abl:ml分离后,视频比例一般会失衡。所以用“-aspect 16:9”来调整视频画面比例,最后用“-vcodec h264” 编码转换为mp4格式。请根据自身情况,灵活调整。上下格式代码ffmpeg -i A.mkv -vf stereo3d=abl:ml -metadata:s:v:0 stereo_mode="mono" -aspect 16:9 -vcodec h264 B.mp4左右格式代码ffmpeg -i A.mkv -vf stereo3d=sbsl:ml -metadata:s:v:0 stereo_mode="mono" -aspect 16:9 -vcodec h264 B.mp4这里copy一份stereo3d的官网内容,便于查询修改:stereo3dConvert between different stereoscopic image formats. The filters accept the following options: in Set stereoscopic image format of input. Available values for input image formats are: ‘sbsl’ side by side parallel (left eye left, right eye right) ‘sbsr’ side by side crosseye (right eye left, left eye right) ‘sbs2l’ side by side parallel with half width resolution (left eye left, right eye right) ‘sbs2r’ side by side crosseye with half width resolution (right eye left, left eye right) ‘abl’ ‘tbl’ above-below (left eye above, right eye below) ‘abr’ ‘tbr’ above-below (right eye above, left eye below) ‘ab2l’ ‘tb2l’ above-below with half height resolution (left eye above, right eye below) ‘ab2r’ ‘tb2r’ above-below with half height resolution (right eye above, left eye below) ‘al’ alternating frames (left eye first, right eye second) ‘ar’ alternating frames (right eye first, left eye second) ‘irl’ interleaved rows (left eye has top row, right eye starts on next row) ‘irr’ interleaved rows (right eye has top row, left eye starts on next row) ‘icl’ interleaved columns, left eye first ‘icr’ interleaved columns, right eye first Default value is ‘sbsl’. out Set stereoscopic image format of output. ‘sbsl’ side by side parallel (left eye left, right eye right) ‘sbsr’ side by side crosseye (right eye left, left eye right) ‘sbs2l’ side by side parallel with half width resolution (left eye left, right eye right) ‘sbs2r’ side by side crosseye with half width resolution (right eye left, left eye right) ‘abl’ ‘tbl’ above-below (left eye above, right eye below) ‘abr’ ‘tbr’ above-below (right eye above, left eye below) ‘ab2l’ ‘tb2l’ above-below with half height resolution (left eye above, right eye below) ‘ab2r’ ‘tb2r’ above-below with half height resolution (right eye above, left eye below) ‘al’ alternating frames (left eye first, right eye second) ‘ar’ alternating frames (right eye first, left eye second) ‘irl’ interleaved rows (left eye has top row, right eye starts on next row) ‘irr’ interleaved rows (right eye has top row, left eye starts on next row) ‘arbg’ anaglyph red/blue gray (red filter on left eye, blue filter on right eye) ‘argg’ anaglyph red/green gray (red filter on left eye, green filter on right eye) ‘arcg’ anaglyph red/cyan gray (red filter on left eye, cyan filter on right eye) ‘arch’ anaglyph red/cyan half colored (red filter on left eye, cyan filter on right eye) ‘arcc’ anaglyph red/cyan color (red filter on left eye, cyan filter on right eye) ‘arcd’ anaglyph red/cyan color optimized with the least squares projection of dubois (red filter on left eye, cyan filter on right eye) ‘agmg’ anaglyph green/magenta gray (green filter on left eye, magenta filter on right eye) ‘agmh’ anaglyph green/magenta half colored (green filter on left eye, magenta filter on right eye) ‘agmc’ anaglyph green/magenta colored (green filter on left eye, magenta filter on right eye) ‘agmd’ anaglyph green/magenta color optimized with the least squares projection of dubois (green filter on left eye, magenta filter on right eye) ‘aybg’ anaglyph yellow/blue gray (yellow filter on left eye, blue filter on right eye) ‘aybh’ anaglyph yellow/blue half colored (yellow filter on left eye, blue filter on right eye) ‘aybc’ anaglyph yellow/blue colored (yellow filter on left eye, blue filter on right eye) ‘aybd’ anaglyph yellow/blue color optimized with the least squares projection of dubois (yellow filter on left eye, blue filter on right eye) ‘ml’ mono output (left eye only) ‘mr’ mono output (right eye only) ‘chl’ checkerboard, left eye first ‘chr’ checkerboard, right eye first ‘icl’ interleaved columns, left eye first ‘icr’ interleaved columns, right eye first ‘hdmi’ HDMI frame pack Default value is ‘arcd’.结尾最终的效果,可以看我的视频页面-韩流来袭:oh!-Girls Generationoh!-Girls Generationsorry.sorry-Super Juniorsorry.sorry-Super Junior是否很棒?ffmpeg的更多用法,我已整理在一起了,请参考: 如何利用ffmpeg完成MKV转换MP4的视频格式,视频转gif图片格式。
2024年06月24日
136 阅读
0 评论
0 点赞
2024-06-04
lucky 的ssl证书申请,解决:acme: error: 400... DNS problem: server failure at resolver looking up TXT for _acme-challenge
概述我使用的域名昨天ssl到期了,今天打开后竟然是:竟然还不能直接访问http,赶紧用局域网登录lucky,发现ssl证书已经过去,并且自动申请没成功,我手动申请,也被拒绝,看日志:正文我网上学习了以下,大概了解到Let’s Encrypt 的验证方式包含了HTTP-01 验证 和DNS-01 验证 感兴趣的在这里看看。 Let’s Encrypt验证报错现象日志很明显提到了DNS验证出错,大概意思就是说,查不到“_acme-challenge.271650168.xyz” 这条域名的txt的记录值,(271650168.xyz 是我的主域名): acme: error: 400 :: urn:ietf:params:acme:error:dns :: DNS problem: server failure at resolver looking up TXT for _acme-challenge.271650168.xyz卡住问题当然还是搜索,发现老外的网站也是又这个问题,但他们就是在域名下添加txt记录,但我的问题是,txt的内容是怎么来的?我从哪里才能搞到txt记录呢?尝试解决既然找不到,干脆就用别人的值试试,它这个的本意就是验证域名所有权的问题,应该不存在唯一性的问题吧,结果竟然解决了,很幸运。所以,我觉得有必要分享出来,给同样出问题的同学们!正确的做法到你们的域名服务商,添加一条或两条txt记录, 因我我申请的是两个域名的:271650168.xyz*.271650168.xyz你如果是申请的一个域名的,那添加一条记录即可,详细看你日志的报错信息。结尾上内容:二级域名(注意前面不要有空格) _acme-challenge txt记录值内容 glTMop6r8C8IUzeXqCm6qQq_tCE1_su2qFqO_nkOo8smo8efpFyr2YZIJpyRfc5KCDPd1rkch9cWXTzVa2In8g 是不是成功了,good lucky!
2024年06月04日
592 阅读
0 评论
1 点赞
2024-03-27
nextcloud和seafile对比,群晖docker部署记录!协同办公利器
概述:协同办公我很早就在使用了,一直采用的是DZZ(大桌子)系统,一切都感觉挺好。近期接触了nextcloud ,大名鼎鼎,是国外的一款私有云,同样可以达到私人数据备份,协同办公的功能。很多人应该都在用。另一款应该是我们国人开发的seaflie ,功能相似。我简单的看了一下页面布局,更喜欢nextcloud的页面,所以就在群晖DOCKER上进行了安装,配置数据库的时候,如果选择mysql, 老是出错,研究了挺久最终搞定,所以,这里记录一下。但登录上去后,发现nextcloud的加载页面很慢,总是在转圈,按理来说,不应该啊,本地局域网安装,为啥不流程呢?经过搜索,有网友说是他的程序架构都是PHP搭建的,没办法流畅起来,又指向了seaflie,此时,我再次对seaflie有了兴趣,同时有docker安装了seaflie,经过简单的配置,就愉快使用起来了。最终的结论:seaflie页面加载简直是秒速,而且很容易配置在线office编辑,所以,毫不犹豫的选择seaflie。正文nextcloud 部署过程这里描述的是nextcloud在群辉docker 的部署方式,其中之前,有试过虚拟机搭建,但搭建了一半,无法访问。404报错,放弃。docker搭建nextcloud其实很容易,nextcloud的数据库有三种选择,默认是轻量自带本地数据库,但如果想更多的发挥nextcloud的功能实力,建议还是选择mysql, 所以我们先在docker搭建mysql(如果群辉套件已经安装了mariaDB ,理论上在docker中就不用再安装了,但我在调用的时候,老是出错,有些权限我不会更改,索性重新搭建吧。)SSH 登录群晖系统# 下面 的password,3309 根据自己需要修改。 docker run --name=nextcloud_db -e MYSQL_ROOT_PASSWORD=password -d -p 3309:3306 --restart=always mysql:8.2.0等容器建立起来后#逐条执行下面的命令:选择容器 用root登录 docker exec -it nextcloud_db mysql -u root -p #创建数据库名nextcloud CREATE DATABASE nextcloud #授权,之前报错的解决方案 grant all privileges on *.* to 'user'@'localhost' with grant option #(备用命令 GRANT ALL ON *.* TO 'root'@'%';) #刷新授权 flush privileges #退出数据库 exit然后就可以安装nextcloud了:# 下面 本地文件夹挂载/volume1/docker/nextcloud/data,端口8880,根据自己需要修改。 docker run -d --name=nextcloud -v /volume1/docker/nextcloud/data:/var/www/html/data -p 8880:80 --restart=always nextcloud安装后,登录ip:8880登录配置界面:(以下内容,按照自己的实际情况调整)设置管理员用户名设置管理员密码数据库选择mysql数据库管理员账户:root数据库管理员密码:password数据库名称:nextcloud数据库地址:docker的主机ip:3309 不出意外的话,就可以顺利安装好了。愉快的使用吧。seaflie部署seaflie的部署就很简单,官网已经配置好了yml文件,我们下载后,按自己的实际情况进项修改,官网配置说明在这里: 官网配置说明 下载:docker-compose.yml文件,用记事本打开修改。修改说明,备注上已经写得很清楚了,我就不啰嗦了,只是叮嘱两点:端口号:80:80 默认的80端口,一般我们都用不了,前面的第一个80需要更换掉。SEAFILE_SERVER_HOSTNAME=localhost如果不懂Nginx配置的话,这里就填写localhost然后上传docker-compose.yml到群晖任意文件夹,ssh登录 并cd切换到 该文件夹,执行:docker compose up -d就可以建立了,记得提前建立好挂载文件夹哦。然后,ip+端口号就可以访问了。最后再说两个异常过程:如果出现上传或下载。网络异常的错误时,请打开右上角系统设置---ip需要带上端口号。另外,就是挂载OnlyOffice的时候,注意http和https的跨域问题。具体挂载方式,见官网说明。修改对应的文件配置即可,以我的为例:/volume1/docker/Seafile/Seafile/seafile/conf/seahub_settings.py后期打算利用seafile 作为备用平台。
2024年03月27日
166 阅读
0 评论
0 点赞
2024-01-29
为什么有的mp4视频文件,不能边播放边加载,而是要等到视频全部缓存完毕才开始播放?
概述最近搞了一个视频播放页面: 《江格尔英雄赞》安达组合,超赞,如何下载CCTV视频? ,里面有两个从youtube下载的视频文件...乐队的夏天,可是播放的时候,要缓存好久,等播放的时候,几乎是100%缓存。现在的人哪有那耐心,我就很好奇,啥原因?搜了以下,网上普遍的回复是,mp4有个索引数据moov需要在mdat数据之前才行,如果是视频文件的末端,只能等浏览器读取到moov才行,所以要想一开始边播放边下载,就需要让索引数据moov移动在mdat数据之前,有个ffmpeg小工具可以做到,那就是-qt-faststart,在github上有分享,但没编译。我附件分享一个编译好的exe文件,下载后,放在ffmpeg的安装目录bin下。我使用了mp4info.exe这个小工具,神奇的发现: 我的这个moov在mdat数据之前,只是后面有堆堆长传的索引数据,看似不正常,但既然是从youtube下载的,理应符合边播边下的道理。不管它,利用ffmpeg处理以下:ffmpeg -i 视频前.mp4 -codec copy -movflags faststart 视频后.mp4再次用mp4info.exe查看修改后的数据索引,一下子就很规整了。上传测试,直接是秒开播放,赞。特此记录以下.附件分享mp4info.exeqt-faststart.exe隐藏内容,请前往内页查看详情
2024年01月29日
291 阅读
1 评论
0 点赞
2024-01-16
孔径.流量.压差计算.xlsx 计算工具分享
概述这几天,有朋友又再次和我讨论起液体中孔径.流量.压差三者的关系,我给他推荐了 用Simcenter Amesim 仿真节流孔径、压损以及流量的关系 道理看懂了,公式也给了,但是用笔计算,就莫名的烦躁。要是能有个小工具,输入参数,直接看结果,那该多好啊。今天,他来了!正文我也是今天心情不错,那就顺便把公式整理成excel文件吧,孔径.流量.压差这三者关系,已知两个求第三个参数。使用方法应该一目了然吧,黄色底色的就是需要输入的值,默认情况下,a的值最好不修改,这是我个人试验得到的修正系数,除非你十分确定他是错误的,那你就自行修正。密度ρ,0.8是油液的密度,如果你是其他介质,请自行填写密度。一切就很完美了,送给不想手动计算的你! ?结尾:这是我第一次原创公式文件,希望他能帮到更多的人,good luck!附件:孔径.流量.压差计算.xlsx 隐藏内容,请前往内页查看详情
2024年01月16日
375 阅读
9 评论
2 点赞
1
2
3
✖
使用
Typecho
建站,并搭配
joe
主题(有修改)
蜀ICP备2022005623号-2
川公网安备 51012202001212号
本站已运行
00
天
00
时
00
分
00
秒
Copyright © 1970 ~
Xcshare
All rights reserved.