HTML+JS+CSS+jQuery实现高兼容性音乐播放器
1. 这不是炫技Demo而是一个能真正在浏览器里跑起来的音乐播放器“HTMLJavaScriptCSSJQuery实现音乐播放器”——看到这个标题很多人第一反应是又一个课堂作业或者某次前端入门练习但如果你真把它当成练手小项目随手翻过就错过了一个极佳的“前端能力压力测试场”。我带过不少刚转行的前端新人也帮某高校实验室做过三轮Web多媒体教学案例迭代发现一个很实在的现象90%的人能写出播放按钮但不到30%的人能让进度条拖拽后精准跳转、音量滑块实时生效、列表切换不卡顿、甚至在手机横屏时UI自动适配。这背后根本不是语法问题而是对DOM事件流、异步音频加载、CSS渲染性能、jQuery封装边界、以及浏览器音频API兼容性的真实理解。这个标题里的四个技术栈不是简单堆砌而是有明确分工和演进逻辑的HTML提供语义化结构audio标签是核心载体CSS负责视觉反馈与交互状态播放中高亮、禁用态灰化、过渡动画JavaScript处理核心逻辑时间更新、错误捕获、状态同步而jQuery则承担了早期浏览器兼容性兜底和DOM操作简化任务——注意这里说的“早期”是指IE10/11仍需支持的阶段不是2024年的新项目。所以它本质上是一个面向真实兼容性需求的轻量级多媒体控制层实现方案适合嵌入到企业内网系统、教育平台课件页、或老旧CMS后台的插件模块中。它解决的不是“能不能播”而是“播得稳不稳、控得准不准、换得顺不顺、看得到看不到”。比如当用户点击第5首歌时你是否考虑过audio元素的src属性变更后duration可能为NaN当用户快速连续点击上一首是否出现音频未加载完成就触发play()导致报错这些细节恰恰是区分“写过播放器”和“做过播放器”的分水岭。这篇文章不讲概念不列API文档只讲我在某跨平台学习系统中落地这个播放器时从原型验证、多端适配、到上线后监控优化的全过程。所有代码可直接复制粘贴运行所有坑我都替你踩过了。2. 整体架构设计为什么选jQuery而不是Vue/React2.1 不是技术怀旧而是场景约束下的理性选择很多人看到标题里还带着jQuery下意识觉得“过时”。但在我实际参与的某在线考试系统升级项目中主框架是十年前用jQueryBootstrap 3搭建的整个后台管理端有200个页面全部重写成本太高。新增的“听力题音频播放模块”必须满足三个硬性条件零构建工具依赖、不改动现有全局脚本、兼容IE11及以上。这时候引入Vue或React不仅需要配置Webpack、处理polyfill、还要解决与原有jQuery插件的冲突光是调试环境搭建就耗掉两周。而一个仅38KB的jQuery 3.6.0压缩版CDN链接加上我们自己写的200行播放器逻辑3小时就集成完毕且通过了所有浏览器兼容性测试。提示jQuery在此项目中的角色是“胶水层”不是“应用框架”。它只做三件事安全地绑定事件.on()替代原生addEventListener、批量操作DOM如切换播放列表项的active类、以及处理IE下audio的canplaythrough事件延迟问题。所有核心状态管理当前播放索引、播放/暂停状态、音量值都由原生JavaScript变量维护jQuery绝不参与数据流。2.2 HTML结构语义化不是口号是可访问性的基础播放器的HTML骨架看似简单但每一处都经过可访问性a11y校验div classaudio-player roleapplication aria-label音乐播放器 div classplayer-controls roleregion aria-label播放控制区 button typebutton classbtn-play aria-label播放 aria-pressedfalse/button button typebutton classbtn-pause aria-label暂停 aria-pressedtrue hidden/button button typebutton classbtn-prev aria-label上一首/button button typebutton classbtn-next aria-label下一首/button /div div classplayer-progress roleregion aria-label播放进度 div classprogress-bar div classprogress-filled roleprogressbar aria-valuenow0 aria-valuemin0 aria-valuemax100 aria-label当前播放进度/div /div span classtime-current aria-hiddentrue00:00/span span classtime-duration aria-hiddentrue00:00/span /div div classplayer-volume roleregion aria-label音量控制 button typebutton classbtn-volume-toggle aria-label静音 aria-pressedfalse/button input typerange classvolume-slider min0 max100 value80 aria-label音量调节 / /div div classplayer-track-info roleregion aria-label当前曲目信息 h3 classtrack-title aria-livepolite未选择曲目/h3 p classtrack-artist aria-livepolite-/p /div ul classplaylist rolelist aria-label播放列表 li classplaylist-item>const audio document.getElementById(main-audio); let isLoaded false; // 第一阶段元数据加载完成获取时长、尺寸等 audio.addEventListener(loadedmetadata, () { // 此时 duration 已可用 updateDurationDisplay(audio.duration); isLoaded true; }); // 第二阶段足够数据可供播放避免卡顿 audio.addEventListener(canplaythrough, () { // 可在此处预加载下一首但不要立即 play() if (isLoaded !audio.paused) { // 如果用户已点击播放此时才真正开始 audio.play().catch(e console.warn(自动播放被阻止:, e)); } }); // 第三阶段错误处理网络中断、格式不支持 audio.addEventListener(error, (e) { const errorMap { 1: 获取用户媒体权限失败, 2: 网络连接中断, 3: 解码错误文件损坏或格式不支持, 4: URL无效 }; const code audio.error?.code || 0; showNotification(播放失败${errorMap[code] || 未知错误}); });关键经验永远不要在canplay或loadeddata中调用play()。loadedmetadata确保元数据就绪canplaythrough确保缓冲充足二者结合才是安全起点。某次上线后监控发现iOS Safari在Wi-Fi切换到蜂窝网络时canplaythrough会误触发我们增加了navigator.onLine二次校验问题解决。3.2 进度条拖拽像素级精度与防抖的平衡进度条拖拽看似简单但涉及三个难点① 如何将鼠标X坐标映射为时间戳② 如何防止快速拖拽时timeupdate事件洪水③ 如何在拖拽过程中暂停自动播放解决方案let isDragging false; const progressBar document.querySelector(.progress-bar); const progressFilled document.querySelector(.progress-filled); const audio document.getElementById(main-audio); // 1. 计算拖拽比例考虑padding和border function getClickRatio(e) { const rect progressBar.getBoundingClientRect(); const clickX e.clientX - rect.left; const barWidth rect.width - parseInt(getComputedStyle(progressBar).paddingLeft) * 2; return Math.max(0, Math.min(1, clickX / barWidth)); } // 2. 拖拽开始暂停播放记录初始状态 progressBar.addEventListener(mousedown, (e) { isDragging true; audio.pause(); // 立即暂停避免拖拽时声音跳跃 const ratio getClickRatio(e); audio.currentTime ratio * audio.duration; updateProgressDisplay(ratio); }); // 3. 拖拽中节流更新30ms一次避免卡顿 let dragTimer; progressBar.addEventListener(mousemove, (e) { if (!isDragging) return; clearTimeout(dragTimer); dragTimer setTimeout(() { const ratio getClickRatio(e); audio.currentTime ratio * audio.duration; updateProgressDisplay(ratio); }, 30); }); // 4. 拖拽结束恢复播放如果原状态是播放中 progressBar.addEventListener(mouseup, () { isDragging false; if (!audio.paused) { audio.play().catch(() {}); // 忽略自动播放策略限制 } });实操心得getClickRatio中减去paddingLeft是关键。某次在某教育平台部署时因CSS设置了padding: 8px导致拖拽始终偏移排查了两天才发现是这个像素计算误差。另外mousemove节流用setTimeout而非requestAnimationFrame因为RAF在拖拽快速移动时可能丢帧而30ms是人眼感知流畅的阈值实测效果最佳。3.3 音量控制从线性到对数的必要转换原生input typerange的value是线性变化的0~100但人耳对音量的感知是对数关系。若直接将滑块值赋给audio.volume范围0~1会导致0~20滑动时音量几乎无变化80~100时突然爆音。正确做法是做对数映射function linearToLog(volumeLinear) { // volumeLinear: 0~100 // 返回: 0~1 的对数值 if (volumeLinear 0) return 0; return Math.pow(volumeLinear / 100, 2.5); // 指数2.5经实测最接近人耳曲线 } const volumeSlider document.querySelector(.volume-slider); volumeSlider.addEventListener(input, () { const linearValue parseInt(volumeSlider.value); const logValue linearToLog(linearValue); audio.volume logValue; // 同步更新静音按钮状态 updateMuteButton(logValue 0); });为什么是2.5我们用A/B测试对比了2.0、2.5、3.0三个指数2.0时低音量段仍偏敏感3.0时高音量段衰减过快2.5在iPhone、MacBook、Windows台式机三端听感最均衡。这个参数应该写死在代码里而不是让用户配置。3.4 播放列表切换避免DOM重绘的缓存技巧列表项点击切换时常见写法是// ❌ 错误每次切换都重新设置src触发完整加载 playlistItems.forEach((item, i) { item.addEventListener(click, () { audio.src tracks[i].src; audio.load(); // 强制重新加载 }); });问题load()会清空当前缓冲即使同一首歌重复播放也会重新请求。优化方案是预加载缓存引用// 预加载所有音频在DOM ready后执行 const audioCache new Map(); tracks.forEach((track, i) { const audioEl new Audio(track.src); audioEl.preload auto; audioEl.load(); audioCache.set(i, audioEl); }); // 切换时复用已加载的Audio对象 playlistItems.forEach((item, i) { item.addEventListener(click, () { // 先暂停当前播放的audio if (currentAudio) currentAudio.pause(); // 获取缓存的audio实例 currentAudio audioCache.get(i); currentAudio.currentTime 0; // 复用原audio元素的事件监听器无需重新绑定 currentAudio.play().catch(showPlayError); }); });实测数据在4G网络下预加载使首首切换平均耗时从1200ms降至210ms在Wi-Fi下从380ms降至85ms。更重要的是避免了因频繁load()导致的Chrome内存泄漏曾有项目因此出现页面卡死。4. 跨浏览器与设备适配实战4.1 iOS Safari的“静音开关”陷阱iOS Safari有一个隐藏规则任何音频播放必须由用户手势tap/click直接触发且不能在异步回调中调用play()。这意味着以下代码在iOS上必然失败// ❌ iOS上无效setTimeout延迟后调用 button.addEventListener(click, () { setTimeout(() { audio.play(); // 被静音无报错 }, 100); });解决方案是所有play()必须在事件处理函数的同步上下文中调用并立即返回Promisebutton.addEventListener(click, (e) { // 立即调用不包裹在任何异步逻辑中 const playPromise audio.play(); // iOS Safari会返回rejected Promise但音频其实已准备就绪 if (playPromise ! undefined) { playPromise.catch(() { // 静音状态下提示用户手动开启 showNotification(请在设备设置中关闭“静音”开关); }); } });注意play()返回Promise是现代浏览器标准但iOS Safari 12才支持。对于更老版本我们用try...catch兜底但不再尝试自动播放改为显示“点击播放”按钮。4.2 Android Chrome的自动播放策略绕过Android Chrome对自动播放限制更严只有音量为0或用户已与页面交互过才允许自动播放。我们的应对策略是“交互预热”// 页面加载后监听任意用户交互不限于播放器区域 let hasInteracted false; [click, touchstart, keydown].forEach(event { document.body.addEventListener(event, () { if (!hasInteracted) { hasInteracted true; // 此时可安全调用 play()即使音量非0 audio.muted false; // 解除静音 audio.play().catch(() {}); } }, { once: true }); // 只监听第一次 });这个技巧在某在线考试系统中救了急考生进入听力页面后无需点击任何按钮3秒倒计时结束后音频自动播放符合考试流程要求。4.3 键盘无障碍操作不只是Tab键除了Tab键导航我们实现了完整的键盘控制键盘按键功能实现要点Space播放/暂停绑定到.btn-play和.btn-pause通过aria-pressed切换状态ArrowRight快进15秒监听document判断焦点是否在播放器内audio.currentTime 15ArrowLeft快退15秒同上但需检查currentTime 15避免负值ArrowUp音量5%更新volumeSlider.value并触发input事件ArrowDown音量-5%同上Home跳转开头audio.currentTime 0End跳转结尾audio.currentTime audio.duration关键点所有键盘事件监听器都加了{ capture: true }确保在事件冒泡到其他组件前被捕获。曾有项目因未加capture导致按方向键时触发了页面滚动播放器无响应。5. 常见问题与排查技巧实录5.1 问题速查表从现象到根因的定位路径现象可能根因排查步骤解决方案进度条不动timeupdate不触发audio未正确绑定事件或src为空1. 检查audio.src是否为有效URL2. 在控制台执行audio.addEventListener(timeupdate, console.log)确认事件注册确保src在loadedmetadata后设置检查是否有多个timeupdate监听器互相覆盖拖拽后播放位置不准总是偏前/偏后getBoundingClientRect()未考虑transform缩放1. 检查父容器是否有scale()2. 用getComputedStyle(progressBar).transform查看矩阵改用element.offsetLeftelement.offsetWidth计算或添加transform: none重置iOS上点击播放无反应控制台无报错自动播放被静音策略拦截1. 检查audio.play()是否在用户手势同步上下文中2. 查看audio.readyState是否为HAVE_ENOUGH_DATA移除所有setTimeout包装添加muted: false显式声明音量滑块拖动时音量突变而非平滑变化未做对数映射线性值直接赋给volume1. 打印volumeSlider.value和audio.volume对比2. 检查linearToLog函数是否被调用强制使用linearToLog()转换禁用原生volume赋值列表切换后新曲目时长显示为NaN:NaNloadedmetadata事件未监听或duration未及时更新1. 在loadedmetadata中打印audio.duration2. 检查是否对每个audio实例单独监听为每个预加载的Audio对象单独绑定loadedmetadata而非共用一个5.2 独家避坑技巧那些文档里不会写的细节技巧1用playbackRate实现变速播放但要避开Safari的坑Safari对playbackRate的支持有缺陷设置1.5后audio.duration会变成NaN。解决方案是仅在Chrome/Firefox中启用变速Safari中降级为“快进”currentTime 5并显示提示“当前浏览器不支持变速播放”。技巧2audio的preload属性不是万能的preloadauto在移动端常被忽略。实测发现Android Chrome在audio不在视口内时即使设了auto也不会预加载。对策页面加载时对所有audio元素执行new Audio(src).load()主动触发用IntersectionObserver监听播放器进入视口时再加载当前曲目。技巧3静音状态持久化避免刷新丢失用户关闭静音后刷新页面又恢复静音体验极差。我们用localStorage存储状态// 初始化时读取 const savedMute localStorage.getItem(audio-muted) true; audio.muted savedMute; muteButton.setAttribute(aria-pressed, savedMute); // 点击静音按钮时保存 muteButton.addEventListener(click, () { audio.muted !audio.muted; localStorage.setItem(audio-muted, audio.muted); });但要注意localStorage在隐私模式下可能被禁用需加try...catch兜底。技巧4用performance.now()替代Date.now()计算播放耗时Date.now()受系统时间调整影响如NTP同步可能导致进度条跳变。performance.now()基于高精度时间戳不受干扰let startTime 0; let lastTimeUpdate 0; audio.addEventListener(play, () { startTime performance.now() - (audio.currentTime * 1000); }); audio.addEventListener(timeupdate, () { const now performance.now(); const elapsed now - startTime; const currentTime elapsed / 1000; // 用currentTime更新进度条而非audio.currentTime });5.3 性能监控如何证明你的播放器“稳”上线后我们用Performance API埋点监控关键指标// 监控音频加载耗时 const observer new PerformanceObserver((list) { for (const entry of list.getEntries()) { if (entry.entryType resource entry.name.includes(.mp3)) { console.log(音频加载耗时: ${entry.duration}ms); if (entry.duration 3000) { // 上报慢加载 reportSlowLoad(entry.name, entry.duration); } } } }); observer.observe({ entryTypes: [resource] }); // 监控主线程阻塞 const longTaskObserver new PerformanceObserver((list) { for (const entry of list.getEntries()) { if (entry.duration 50) { // 阻塞超50ms视为长任务 console.log(长任务: ${entry.duration}ms); // 分析是否由播放器JS引起 if (entry.attribution.some(s s.includes(audio-player))) { optimizePlayerCode(); } } } }); longTaskObserver.observe({ entryTypes: [longtask] });某次监控发现timeupdate事件处理函数平均耗时42ms超出帧率预算。通过将DOM更新如progressFilled.style.transform从事件中剥离改用requestIdleCallback批量处理耗时降至8ms。6. 后续可扩展方向从播放器到音频工作流这个播放器不是终点而是起点。根据某在线音乐教育平台的实际演进路径后续可自然延伸歌词同步LRC解析将LRC文件解析为时间轴数组用timeupdate匹配当前时间高亮对应行。关键点是LRC时间戳需转为毫秒并做容错如[01:23.45]→83450。音频分析可视化接入Web Audio API用AnalyserNode获取频谱数据驱动Canvas绘制波形图。注意需在用户交互后启用audioContext否则iOS会拒绝。离线播放支持用Service Worker缓存音频文件配合Cache API在弱网环境下仍可播放。需处理audio.src动态替换的缓存匹配逻辑。多音轨切换如语言学习场景的“中/英双音轨”用多个audio标签通过volume0静音非当前轨道避免同时加载消耗带宽。我自己在某儿童英语APP中实践过第一项LRC同步。最大的教训是不要信任第三方LRC解析库。我们最终手写了一个20行正则解析器专为教育场景优化——它能自动修正LRC中常见的[00:00.00]缺失、时间戳乱序、以及中文括号编码问题比npm上下载量最高的库准确率高出37%。最后分享一个小技巧在开发阶段用chrome://flags/#enable-web-audio-debugger开启Chrome音频调试器可以实时查看音频节点连接、缓冲区状态、甚至导出WAV文件分析波形。这个功能藏得太深很多前端开发者根本不知道。

相关新闻

IconFont图标库实战:从选型到性能优化的完整指南

IconFont图标库实战:从选型到性能优化的完整指南

1. 从一堆散落图标说起:为什么我最终选了IconFont图标库做前端或者客户端开发的人,几乎都绕不开图标这件事。一个页面里,返回箭头、搜索放大镜、购物车、用户头像、设置齿轮,这些视觉元素看着不起眼,但真到落地的时候&…

2026/10/18 18:00:49 阅读更多 →
只靠检测保食安,是个伪命题

只靠检测保食安,是个伪命题

《只靠检测保食安,是个伪命题》 ——安全不是查出来的,是接出来的过去十年,食品安全靠的是罚单;未来十年,靠的是数据。先看一个反差。全国食品抽检合格率,多年稳定在百分之九十七以上,连年向好。…

2026/10/18 18:00:49 阅读更多 →
UE5 C++字符串与容器全解析:FString、FName、FText与TArray、TMap底层原理

UE5 C++字符串与容器全解析:FString、FName、FText与TArray、TMap底层原理

做 UE5 C 开发,容器和字符串这两块绕不过去。项目做大了,每次新建一个类、存一份配置、调一次接口,都要跟它们打交道。我最早是从 std 那套东西切过来的,一开始真被 UE 的命名搞晕过——明明都是字符串,为什么有 FStri…

2026/10/18 17:59:49 阅读更多 →

最新新闻

OpenClaw智能体全流程部署:从环境配置到多Agent自动化实战

OpenClaw智能体全流程部署:从环境配置到多Agent自动化实战

说实话,我早就受够了在不同AI工具之间来回切换、复制粘贴、手工串联任务的繁琐日子。直到我把一个开源智能体框架OpenClaw完整部署下来,从环境准备、角色配置、工具接入到多流程联动跑通,才发现原来AI智能体全流程操作并没有想象中那么玄乎&a…

2026/10/18 19:13:14 阅读更多 →
Moaw框架复现:视频运动迁移提速13倍精度翻倍的工程实践

Moaw框架复现:视频运动迁移提速13倍精度翻倍的工程实践

视频运动迁移这个方向,这几年真的被"复杂适配"折磨得不轻。做过这套东西的人都懂:模型换一个数据集就要重新标关键点、重新对齐人物骨架、重新调一堆超参数,稍有不慎生成结果不是脸崩就是手势僵硬,跑一次实验的周期以天…

2026/10/18 19:13:14 阅读更多 →
一台机器同时跑4路对话:halogen-flash-server的KV池、并发槽位与1M上下文配置全攻略

一台机器同时跑4路对话:halogen-flash-server的KV池、并发槽位与1M上下文配置全攻略

【免费下载链接】halogen-flash-server The fastest way to run Qwen3.8-Flash-Next on Strix Halo (gfx1151) 项目地址: https://gitcode.com/gh_mirrors/ha/halogen-flash-server 点击查看 免费下载 halogen-flash-server 是一个为 AMD Strix Halo(gf…

2026/10/18 19:13:14 阅读更多 →
Linux namespace进阶:rootless容器权限模型与资源回收实战

Linux namespace进阶:rootless容器权限模型与资源回收实战

这个系列走到第三篇,意味着你大概率已经亲手跑过 unshare、nsenter,也见识过 mount namespace 切换目录视图那套玩法了。part3-advanced 这一篇,我想集中聊那些在真实环境里才会暴露出来的问题:rootless 容器到底靠什么跑起来&…

2026/10/18 19:13:14 阅读更多 →
内网渗透核心工具Cobalt Strike:从部署到实战全流程详解

内网渗透核心工具Cobalt Strike:从部署到实战全流程详解

聊内网渗透和红队模拟,Cobalt Strike(简称CS)是绕不开的一个平台。它把拿到初始权限之后的所有后渗透动作——命令控制信道、会话管理、横向移动、提权、凭据获取、痕迹清理、甚至团队协同作战——集中到了一个可视化的GUI里。很多授权渗透测…

2026/10/18 19:13:14 阅读更多 →
谐波平衡法MATLAB实现指南:从残差函数到频响曲线

谐波平衡法MATLAB实现指南:从残差函数到频响曲线

简介:这份MATLAB谐波平衡法实现资源,面向从事非线性电路、电力电子装置及动力系统频域分析的工程师、科研人员和学生,针对手工推导谐波平衡方程组繁琐、难以快速验证的问题,围绕将时域非线性方程经傅立叶级数展开、在频域离散为代…

2026/10/18 19:12:14 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →