No copy
Forward
Back
reload
;Message
首页
💼工作
🔧机械 ♑ 液压
✈ 航空相关
📏仪表及电气
⏳ 阀门相关
⛹️♀️生活
📽️影音相关
👀我看...
♪ 我听...
🗑️其他
🚴♀️游记
关于...
友链
统计
更多...
XC'S 图册
XC'S视频
单位转换
Search
1
小米11 Ultra 刷机rom、面具magisk、太极.阳折腾记
16,142 阅读
2
Apache & PHP 8.0.X 分享Apache80_2454.8210_arm_64.qpkg
8,734 阅读
3
Solidworks 2016 激活Activator.GUI.SSQ产生的卡顿 闪退
8,661 阅读
4
电液伺服阀特性参数、定义、技术术语,如何测试操作。
6,914 阅读
5
NAS黑群晖DSM7.0 定时开关机方案
6,090 阅读
登录
/
注册
Search
标签搜索
培训学习
软件分享
xc影后感
想说两句
液压经验
心灵感悟
液压产品样册
行业知识
AMESIM
试验台
影评
测试设备
测试内容与方法
生活小技巧
生活感言
仪表产品样册
追忆少年
3D模型
typecho
经验
xc
累计撰写
225
篇文章
累计收到
1,006
条评论
首页
栏目
💼工作
🔧机械 ♑ 液压
✈ 航空相关
📏仪表及电气
⏳ 阀门相关
⛹️♀️生活
📽️影音相关
👀我看...
♪ 我听...
🗑️其他
🚴♀️游记
页面
关于...
友链
统计
XC'S 图册
XC'S视频
推荐
单位转换
最新回复
dujianwen
2025-05-06
匆匆过客
大佬,谢谢分享
1241241
2025-05-06
匆匆过客
111111
leo
2025-05-05
匆匆过客
感谢分享
搜索到
63
篇与
分类 🗑️其他 下的文章 -
的结果
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: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://') # 修正协议部分 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日
5 阅读
0 评论
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日
1 阅读
0 评论
0 点赞
2025-04-30
104宿舍的兄弟们,你们还好吗?
概述:想起我很多年前(2008)做的一个网站,里面有最有价值的是大学同宿舍的兄弟们的介绍,我找了很多备份资料,最终在百度网盘中找到了源代码的备份,纯html静态网页,但我关注的内容好好的保存了起来。正文:我尽可能的把这个页面原封不动的保存在本文中:照片104宿舍从左至右王海斌、郭克文、梁远伟、赵三牛、宋大年(下面那个胖子)、陈辉(上面张牙舞爪的那个)、催路松介绍(我当时的记录)郭克文特点:人长得挺帅,但就是个子有点低。一口破嗓子能喊出比较动听的歌曲!梁远伟特点:一个大网虫 ,自从迷上了网络游戏,就再也没有从网吧走出来过!崔露松特点: 多功能人才,啥都会,但都不是很厉害!王海斌特点:就是我啦!呵呵!我对自己不想有任何评价,因为要我说自己,我老是说自己好的不得了,有私人因素在里面,所以嘛!还是交给大家了.....点这里你就能找到我~-~陈辉特点:长的好结实,特别喜欢足球,是我们班的主将! 赵 犇特点 :整天喊着失恋,一失恋就空虚,一空虚就拉我们去喝酒! 宋大年特点:此人虽然长得不怎么样,但是在老师眼里都是好学生,在同学眼里都是好知己,我相信将来在他妻子面前也一定是个好丈夫 !总结大学的我们就是这样,天真、调皮、快乐、无忧无虑,大家开开心心的度过了几年,如今已经毕业参加工作了,我们几个好像从没再见过面,去年回西安的时候,我碰到了宋大年,和他吃了顿饭,这么久了,他依然是那么幽默风趣,人也帅气了很多,身上到处都是名牌,晚上还吵这要挑CS,呵。。。不知道其他几个都还好吗? 说起我们宿舍,我就想笑,我们班是我们学校最差的班,我们宿舍可以说是我们班最差的宿舍,7个人就喜欢喝酒,一喝就是十几瓶,几十瓶,连个菜都没有,就买几袋花生米,玩着文字游戏,喝的不亦乐乎,连平时检查卫生的,安全的都不愿意来,后来毕业考试的时候,我们宿舍7个人,就又5个人同时挂科,剩下的两个,当时还是打算升学考试,才用了点心,否则。。哈哈。。虽然我们的学习不好,但我们并不笨,全校的兵乓球冠军在我们宿舍,校队的足球好手在我们宿舍,各种网络游戏,单机游戏级数比较高的也在我们宿舍,大家毕业考试并不理想,但在社会中,我相信从我们104宿舍走出去的,一定不会很差。 祈福大家!一切都好!
2025年04月30日
3 阅读
0 评论
1 点赞
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日
2 阅读
0 评论
0 点赞
2025-04-18
HP Reverb G2 VR头戴显示器,SteamVR 未检测到或请插好您的vr头戴显示器,问题解决
概述我有一台 HP Reverb G2 VR,显示效果还真是不错,虽然很少用,最近忽然翻出来想玩一下,结果发现,在win10系统中 ,混合现实门户mixed reality可以正确启动,但steam VR和Virtual Desktop检测不出VR设备,提示“未检测到或请插好您的vr头戴显示器”搜了半天,资料少的可怜,最终在一个老外的网站上找到了答案,所以分享出来。解决方案SteamVR 需要特殊的驱动程序才能与 Reverb G2 等 Windows Mixed Reality 头戴显示设备配合使用。它被称为:MixedRealityVRDriver当然,当你安装好steamVR以后,上面的驱动大概率已经自带了,steam VR会在openvrpaths.vrpath的文件中找到这个驱动地址,如果你目前报错,大概率就是这里面的地址不对。第一步搜索openvrpaths.vrpath,推荐用Everything找到这个文件:参考地址C:\Users\Admin\AppData\Local\openvr\openvrpaths.vrpath第二步用Everything找到MixedRealityVRDriver,并复制地址;参考地址D:\Program Files\Steam\steamapps\common\MixedRealityVRDriver第三步隐藏内容,请前往内页查看详情说明:当你打开这个文件的时候,大概率会发现不是我上面说明的这样,这就是问题所在。如果你打开后,发现和我上面展示的内容是一样的,没啥需要修改的,那本帖的问题不适合你。第四步修改,保存,关闭。退出steam VR ,关闭VR设备,最好重新开机。然后等待Windows Mixed Reality 正常启动运行此时,当你再次进入steam VR时,是不是可以正常运行了??结尾good luck!
2025年04月18日
4 阅读
0 评论
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日
16 阅读
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日
95 阅读
0 评论
0 点赞
2024-06-18
typecho,腾讯云 cdn后,获取用户真实IP,回源HTTP请求头配置
概述网站评论区增加了用户Ip后,就没怎么关注了,直到这几天,回复留言时,发现Ip莫名的显示:湖南?我明明在成都的嘛,偏差这么大吗?赶紧翻阅了我近期的几条留言,都不正确,要么在湖南,要么就在陕西咸阳?查阅了网上的解释,那都是cdn搞的鬼,显示的是cdn节点的ip,网上当然给了解决方案:在配置文件 (/config.inc.php) 中加入如下配置。/** 定义 IP 来源 */ define('__TYPECHO_IP_SOURCE__', 'HTTP_X_FORWARDED_FOR');或者是://防止 CDN 造成无法获取客户真实 IP 地址 if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; }但是,我参考并且照做了,结果没有用。不过,经过了好几个小时的折腾,其中这篇文章: Typecho 使用 CDN 后获取访客真 IP 给了我较大的帮助,当然,也引发了新问题,就是作者可以在服务器打印内容找到ip:HTTP_CF_CONNECTING_IP但是我打印出来没有啊。只能找到一个腾讯云的[HTTP_X_FORWARD_PORT] => 3944, 但看不到HTTP_X_FORWARD的地址。几乎要崩溃,最终还是联系了腾讯云支持工单,来回沟通,加上自行摸索,总算搞定,特此分享出来。查询自己的ip随便一个ip查询网站,查询自己的当前ip信息,看看是否正确,原作者采用的是 这里 ,那就用这个吧,只要和你的位置信息对的上,都行。打印自己的服务器信息新建一个 PHP 文件,输入以下内容PHP <?php print_r($_SERVER); ?>上传到服务器,然后通过浏览器访问,得到一堆内容。比对IP看看这对内容中,有没有自己的真是Ip,有的话,恭喜你,省事了,找出Ip 对应的代码,比如原作者找出的是:HTTP_CF_CONNECTING_IP修改config.inc.php然后在在配置文件 (/config.inc.php) 中加入如下配置。/** 定义 IP 来源 */ define('__TYPECHO_IP_SOURCE__', 'CF_CONNECTING_IP');//去掉HTTP_{callout color="#f0ad4e"}再次提醒://去掉HTTP_{/callout}没有找出ip我的是腾讯云cdn,请到这里,照抄,别问我是啥意思,我也不懂,抄就是了:再次对比ip不出意外的话,你应该是能找到一致的ip了,对应的代码是不是:HTTP_X_FORWARD_FOR然后修改config.inc.php/** 定义 IP 来源 */ define('__TYPECHO_IP_SOURCE__', 'X_FORWARD_FOR');//去掉HTTP_搞定,GOOD LUCK!
2024年06月18日
22 阅读
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日
473 阅读
0 评论
1 点赞
2024-04-20
针对腾讯云内容分发CDN的设置,避免无法登录或登录状态不能更新的问题
概述这段时间使用到了一些云资源,比如cdn和对象存储功能。1.对象存储主要解决网站图片资源的放置和管理,其实就是图床功能。2.cdn 当然是加速网站访问速度,多人,多地域访问的请求响应问题,缓解了服务器请求频次和流量等问题。以上解释是我个人的理解,具体还请自行搜索了解,我这里只谈我使用中遇到的问题。我使用cdn的时候,网站的后台登录来时不能传递给前台,也算是折腾了很久。才总算解决,特此记录一下,同时供参考:开始设置(一)基础配置1.基本信息基本信息是在创建cdn时,根据实际情况填写。2.源站信息源站的意识是如果缓存不存在,去哪里“要数据”这里的源站不能使用加速的域名(会出现死循环)。为了方便,直接写服务的ip+443端口即可,或者是一个域名,这个域名指向源服务器所在ip。(二)访问控制这一项,我的实际设置基本都没内容,只有IP访问限频配置设置了:130,这个看自己需要.但下面还是顺便解释一下意义,便于理解设置。1.防盗链配置放盗链不能防止别人获取信息,只能阻止那些用你的资源显示别人网页的行为。(常见的有链接盗图,图片流量从你这走,但是是别人的网页)建议使用白名单模式,允许空referer访问(如果不允许空referer访问,无法输入url地址访问,会直接返回403)注意,如果你的应用需要调用外部的服务进行跳转,把这个外部服务的网址也加进来,否则无法跳转。2.IP黑白名单配置(默认无需配置)有如下情况需要配置,包括但不限于:(1) 受到指定ip的攻击,加入黑名单(2) 只允许白名单内的ip使用3.IP访问限频配置防止一些网络攻击,推荐开启,根据应用类型配置,如果不知道设置qps多少,可以使用100。然后后台统计大多数人具体的访问量,来进行调整即可如果设置过小,影响正常使用,网页加载文件不能全部载入,会报513的错误,如果过大,这个值设置就没有意义了。4.鉴权配置鉴权配置的意义在于,可以后端控制用户获取静态资源,即使用户知道文件位置,如果鉴权不通过,也无法从cdn获取。根据需要配置。有多种鉴权方式,一种是用算法时间鉴权,类似jwt,一种是转发到你的服务器进行验证(至于怎么验证则是后端的设计了)5.UA黑白名单配置添加对指定请求头的控制,通常是君子协议,因为请求头可以改。(但是大多数普通用户不会改的,所以还是过滤小白的操作)6.下行限速配置根据你的应用实际情况配置,为了限制具体的某个文件用户获取的速度。通常用于高流量的场景,可以不配置,等需要了再配置。7.访问端口配置保持默认,开启80和4438.区域访问控制插件建议开启,如果只面向国内用户,建议开启只允许国内ip访问9.远程鉴权需要自己搭建鉴权的服务器,有需要配置(需要后端开发支持),如果不熟悉,直接默认不开启。(三)缓存配置重点内容1.缓存键规则配置2.节点缓存过期配置重点配置区域(1) 全部文件,不缓存:(这个非常重要,很可能会导致后台正常登陆,但前台状态更新不及时的情况,这个问题困扰我很久,最终还是腾讯云的客服帮忙排查出的)(2) /usr/uploads,缓存10天。(这个文件夹大多是图片或附件,所以这里选择了,下面的文件后缀名,我就没有再增加图片格式了)(3) svg;woff;ttf;woff2;css;js,缓存2小时,根据自己情况调整。{callout color="#f0ad4e"}注意规则权限:新增加的权限越大,优先级就越高。如果不懂,就抄我的图。{/callout}给出我定义的内容,便于你懒得打字输入:/usr/uploadssvg;woff;ttf;woff2;css;js3.浏览器缓存过期配置保持默认即可,需要前端开发时去做,建议保持默认或者根据需要。4.状态码缓存保持默认404,如果需要返回别的状态,根据需要调整。5.HTTP头部缓存配置建议开启,方便开发和应用6.访问URL重写配置重写url可以在cdn配置,也可以在服务器入口处配置,根据需要配置。我的做法通常是不在cdn配置,即这里是无规则的。(四)回源配置重点内容1.合并回源配置建议开启即可2.分片回源配置通常不建议开启,容易出小问题3.回源HTTP请求头配置重点配置强烈建议开启,增加X-Forward-Port请求头获取真实ip原因是将ip写入请求头,就不用专门把ip一层层传递了,后端直接就可以从请求头获取。{callout color="#f0ad4e"}注意:目前的配置,网站获取是cdn节点的Ip,如果需要用户真实ip ,请参考: typecho,腾讯云 cdn后,获取用户真实IP,回源HTTP请求头配置 {/callout}4.回源跟随301/302配置建议开启,简单说就是你的外链也进行缓存,我的设置为不开启。5.回源超时配置保持默认配置6.回源URL重写配置根据情况,一般情况默认即可。这个配置同样可以在后端服务器配置,我的习惯是在后端服务器配置。把除了必须暴露外部的目录之外的其它全部屏蔽并指向404(后端的结构很重要)7.回源SNI配置保持默认关闭只有在一个ip绑定了多个域名时才需要配置注:一个ip绑定多个域名要额外加入反向代理或路由才能实现(五)https配置https是重点配置区域,稍有不慎就会无法访问,建议一定要用https1.HTTPS服务重点配置强烈建议开启,不建议使用http,建议全部https2.HTTPS配置重点配置务必上传域名的证书(https证书),否则会提示中间人攻击,直接无法访问注意:需要手动将https证书(ssl)的公钥和私钥内容复制到如下指定位置,自己生成的不行3.HTTP 2.0配置开启4.强制跳转建议开启,通常情况下,后端的服务器应该也增加跳转或者直接关闭http的访问(只允许https)、http->https,302,不携带头部(选择不携带头部,如果正常请求都是https,用http访问显然是为了试探)5.HSTS配置建议保持默认关闭6.TLS版本配置保持默认7.OCSP装订配置建议开启8.QUIC保持默认关闭,有需要也可以额外付费用(六)高级配置1.自定义错误页面配置如果请求不到资源返回的页面,可以不配置,或者指向4042.用量封顶配置(重要)如果网站不是非常重要,又怕被攻击导致高额账单,这个是保底。可以设定一段时间内最大用量,同时到达时进行提前预警。3.SEO配置默认开启即可4.HTTP响应头配置通常不需要配置。使得每个通过cdn的都会返回给客户端的http响应头的内容5.智能压缩开启即可。6.离线缓存配置开启即可。开启后如果源站故障,这个也能显示,不过这个实际作用不是很大,除非是内容型网站,很少和后端交互。7.POST请求大小配置默认为1M(nginx的默认也是1M)建议不要动,请求通常不会超过1M,如果是post上传大文件,建议分段后上传。参考文章: cdn配置(超详细+图解+原理)
2024年04月20日
85 阅读
0 评论
0 点赞
1
2
...
7
✖
使用
Typecho
建站,并搭配
joe
主题(有修改)
蜀ICP备2022005623号-2
川公网安备 51012202001212号
本站已运行
00
天
00
时
00
分
00
秒
Copyright © 1970 ~
Xcshare
All rights reserved.