Flutter视频列表实战:ListView中播放器管理与性能优化
1. 从零拆解一个视频列表为什么ListView里塞播放器没那么简单短视频刷多了很多人第一反应是“列表加播放器能有多难”。真动手在Flutter里做一个视频列表你会发现事情远没有想象中那么顺。列表要滚动、视频要播放、播放器要复用、内存要控制、生命周期要管理任何一个环节没处理好轻则卡顿掉帧重则直接闪退。这个项目标题叫“ListView播放视频列表”核心就是解决一件事在一个可滚动的列表里让视频能够流畅播放同时保证性能和体验。我最早接触这类需求是在做一个内容聚合类的应用首页信息流里混着图文和视频视频卡片需要自动播放、滑出屏幕要暂停、滑回来要恢复。当时第一版直接用ListView.builder加一堆VideoPlayerController结果列表滑到二三十条就开始明显卡顿内存曲线一路往上飙。后来一步步拆解、优化才把整个方案跑通。这篇文章就把这套思路完整拆开从整体设计到核心细节再到实操过程和踩坑记录全部讲清楚。适合谁看如果你已经会写基本的Flutter页面用过ListView但对“列表里放视频”这件事还没有系统方案那这篇内容基本可以照着抄。如果你已经做过类似功能但总觉得不够流畅也可以对照看看有没有遗漏的优化点。全文围绕ListView这个核心容器展开讲的是怎么把视频播放这件事稳稳地嵌进去。2. 整体设计思路ListView和视频播放器怎么配合才不打架2.1 为什么选ListView而不是其他滚动容器Flutter里能做滚动列表的组件不少ListView、GridView、CustomScrollView、PageView各有各的适用场景。视频列表这个需求绝大多数情况下ListView是最顺手的选择原因有几个。第一ListView.builder天然支持懒加载。它只会构建当前视口内和附近少量item不会一次性把所有子项都创建出来。视频播放器是非常重的组件一个VideoPlayerController背后可能挂着解码器、纹理、音频输出等资源如果一次性创建几十个设备根本扛不住。ListView.builder的懒构建机制刚好契合这个特点。第二ListView的滚动性能经过大量优化配合itemExtent或者prototypeItem可以进一步提升滚动流畅度。视频列表通常item高度是固定的比如16:9的卡片加标题区域用itemExtent把高度写死滚动时就不需要反复测量帧率会明显更稳。第三ListView的API足够简单学习成本低和视频播放器的生命周期配合起来逻辑清晰。相比之下CustomScrollView虽然更灵活但需要自己管理Sliver的布局对于“就是一个垂直视频列表”的需求来说属于过度设计。当然如果你的视频列表需要和别的复杂布局混排比如顶部有折叠头、中间穿插不同样式的模块那CustomScrollView会更合适。但单纯从“ListView播放视频列表”这个标题出发ListView就是最直接的答案。2.2 播放器实例的管理策略什么时候创建、什么时候销毁这是整个方案里最关键的设计决策。视频播放器不是普通Widget它持有原生资源创建和销毁都有成本。管理策略直接决定了列表的流畅度和内存占用。常见的做法有三种。第一种是每个item各自创建一个controlleritem出现时创建item销毁时释放。这种做法实现简单但问题很明显列表快速滚动时大量controller被频繁创建和销毁主线程压力大容易掉帧。而且如果同时有多个视频在播放音频会混在一起体验很差。第二种是全局只维护一个controller哪个item需要播放就把controller挂上去。这种做法资源占用最小但同时只能播放一个视频切换时需要重新加载视频源会有明显延迟。对于“滑到哪个播哪个”的场景切换频繁的话体验不好。第三种是维护一个小的controller池比如同时保留3到5个controller当前可见的item从池里取滑出视口的item把controller归还到池里。这种做法兼顾了性能和体验但实现复杂度最高。我在实际项目里采用的是第二种和第三种结合的思路全局维护一个“当前活跃controller”同时用一个小的缓存池预加载相邻item的视频。具体来说列表滚动时根据item的可见性判断哪个应该播放把活跃controller切换过去对于即将进入视口的item提前从池里拿controller开始加载。这样既保证了同一时间只有一个视频在出声又减少了切换时的等待时间。注意不管用哪种策略一定要在dispose里释放controller否则内存泄漏是必然的。我见过太多因为忘记dispose导致列表滑几屏就OOM的案例。2.3 可见性检测怎么知道哪个item该播、哪个该停ListView本身不提供“item是否可见”的直接回调需要自己算。核心思路是监听ScrollController的滚动位置结合每个item的高度和位置判断它是否在视口内。具体做法是给ListView挂一个ScrollController在滚动回调里拿到当前滚动偏移量scrollOffset。假设每个item高度固定为itemHeight那么第i个item的顶部位置大约是i * itemHeight底部是(i1) * itemHeight。视口的顶部是scrollOffset底部是scrollOffset viewportHeight。两者有交集就说明item可见。判断可见之后还要决定“可见到什么程度才播放”。我的经验是设置一个阈值比如item至少露出50%才触发播放这样避免刚露个边就开始加载减少不必要的切换。同时对于滑出视口的item延迟一小段时间再暂停避免用户快速来回滑动时频繁暂停恢复。这里有个细节ListView.builder的item不一定等高于设定值如果有动态高度计算会复杂一些。所以强烈建议视频列表的item用固定高度既简化可见性计算又提升滚动性能。2.4 自动播放与手动播放的取舍自动播放体验好但有两个风险。一是流量消耗用户可能没连WiFi自动播放会偷偷跑流量。二是多个视频同时自动播放会导致音频混乱。所以自动播放必须配合“同一时间只有一个视频出声”的策略。手动播放则是用户点击才播体验可控但操作多一步。实际产品里常见的是混合策略列表静音自动播放点击后取消静音并全屏播放。这样既保证了列表的生动性又不会打扰用户。在实现上自动播放的触发点就是前面说的可见性检测手动播放则是给item加GestureDetector点击时切换播放状态。两种逻辑要能共存不能互相打架。比如用户手动暂停了某个视频滑走再滑回来不应该又自动播放需要记录用户的操作意图。3. 核心细节解析视频播放器在列表中的关键实现点3.1 VideoPlayerController的初始化与状态监听Flutter官方提供的video_player插件是大多数项目的起点。它的核心是VideoPlayerController创建时需要传入视频源然后调用initialize()进行异步初始化。初始化完成后才能拿到视频的宽高比、时长等信息才能构建VideoPlayer组件。在列表场景里初始化是异步的而item是同步构建的。这就带来一个问题item刚出现时controller还没初始化完界面上显示什么常见的做法是显示一个占位图或者加载指示器等初始化完成后再切换成视频画面。状态监听通过controller.addListener实现可以监听播放位置、播放状态、缓冲状态等变化。在列表里我们主要关心的是初始化完成和播放结束这两个状态。初始化完成后要触发setState刷新item播放结束后可能要自动播放下一个或者显示重播按钮。这里有个容易忽略的点addListener的回调触发非常频繁播放过程中每帧都可能触发。如果在回调里直接setState会导致整个item频繁重建性能很差。正确的做法是只在关键状态变化时才setState比如用一个变量记录上一次的状态只有状态真正改变时才刷新。3.2 列表item的构建与复用机制ListView.builder的item构建是懒加载的但item本身没有“复用”的概念。每次滚动到新的位置build方法会被调用返回新的Widget树。对于视频item来说如果每次build都重新创建VideoPlayerController那性能必然崩盘。所以controller必须和item解耦不能放在item的State里创建。我的做法是把controller的管理提到列表层面用一个Map或者List来维护key是item的索引或者唯一标识。item的build方法根据索引去取对应的controller取不到就显示占位。这样做的另一个好处是item的Widget可以随便重建controller始终是同一个视频播放不会中断。当item滑出视口被销毁时controller不跟着销毁而是归还到池里等待下一个item使用。提示给每个视频分配一个稳定的唯一ID很重要用索引做key在列表数据变化时会出问题。比如列表头部插入一条新数据所有索引都变了controller的映射就全乱了。3.3 视频画面的渲染与布局适配VideoPlayer组件本身不处理宽高比它只是把视频帧画出来。如果直接放在固定尺寸的容器里画面会被拉伸变形。正确的做法是根据controller.value.aspectRatio计算显示尺寸。常见的是让视频宽度撑满item宽度高度按宽高比算出来。比如视频是16:9item宽度是屏幕宽度那高度就是宽度除以16乘以9。这样画面不变形item高度也固定方便前面说的可见性计算。如果视频宽高比不统一item高度就会不一致可见性计算会变复杂。这时候可以统一用一个固定的展示比例比如都按16:9显示非16:9的视频用黑边填充。这样牺牲一点画面完整性换来布局的整齐和计算的简单在列表场景里通常是值得的。另外视频画面上通常还要叠加一些UI元素比如播放按钮、进度条、标题、作者信息等。这些用Stack叠在VideoPlayer上面就行。注意点击事件的穿透问题如果播放按钮要能点击它下面的GestureDetector要处理好事件拦截。3.4 音频焦点与静音策略多个视频同时播放时音频会混在一起这是必须避免的。除了控制同一时间只有一个controller在播放还要处理音频焦点。比如用户正在用别的应用听音乐我们的视频自动播放时应该默认静音不打断用户的音乐。video_player插件提供了setVolume方法可以控制音量。列表自动播放时统一setVolume(0)用户点击后再setVolume(1)。这样既保证了列表的视觉动效又不会造成音频干扰。还有一个细节是当应用退到后台时视频应该暂停。这需要监听应用的生命周期在didChangeAppLifecycleState回调里处理。否则用户切到别的应用视频还在后台播放既耗电又可能被系统杀掉。4. 实操过程一步步搭出一个能跑的视频列表4.1 项目依赖与基础结构搭建先在pubspec.yaml里加上video_player依赖。版本选择上建议用当前稳定版不要追最新的beta版列表场景对稳定性要求高。加完之后跑一下pub get确认没有版本冲突。基础结构我习惯分成三层。最上层是页面持有ScrollController和controller池中间层是列表用ListView.builder构建最下层是item组件负责单个视频的展示和交互。这样分层的好处是职责清晰controller的管理逻辑集中在页面层item组件保持无状态或者只管理自己的UI状态。页面层的State里维护几个关键变量一个Mapint, VideoPlayerController存controller一个int记录当前活跃的索引一个ScrollController监听滚动。initState里初始化ScrollController并添加监听dispose里释放所有controller和ScrollController。4.2 滚动监听与可见性计算的代码实现滚动监听的核心逻辑写在ScrollController的addListener回调里。回调触发时先拿到scrollOffset和viewportHeight然后遍历当前应该可见的item范围计算每个item的可见比例。void _onScroll() { final offset _scrollController.offset; final viewportHeight _scrollController.position.viewportDimension; final firstVisible (offset / itemHeight).floor(); final lastVisible ((offset viewportHeight) / itemHeight).ceil(); for (int i firstVisible; i lastVisible i itemCount; i) { final itemTop i * itemHeight; final itemBottom itemTop itemHeight; final visibleTop offset itemTop ? offset : itemTop; final visibleBottom (offset viewportHeight) itemBottom ? (offset viewportHeight) : itemBottom; final visibleRatio (visibleBottom - visibleTop) / itemHeight; if (visibleRatio 0.5 i ! _activeIndex) { _switchToItem(i); } } }这段代码里itemHeight是固定的item高度itemCount是列表总长度。visibleRatio超过0.5就认为这个item应该成为活跃item。_switchToItem负责暂停旧的controller播放新的controller。注意滚动回调触发非常频繁这段计算虽然不复杂但也要注意不要在回调里做耗时操作。controller的切换是异步的不要阻塞滚动。4.3 controller池的创建与复用逻辑controller池的实现思路是维护一个空闲controller的列表需要时从列表里取用完归还。池的大小根据设备性能定一般3到5个够用。VideoPlayerController _obtainController(String url) { if (_idleControllers.isNotEmpty) { final controller _idleControllers.removeLast(); if (controller.dataSource url) { return controller; } else { controller.dispose(); } } return VideoPlayerController.network(url); } void _recycleController(VideoPlayerController controller) { controller.pause(); controller.setVolume(0); if (_idleControllers.length maxPoolSize) { _idleControllers.add(controller); } else { controller.dispose(); } }这里有个优化点如果池里取出的controller正好是同一个视频源可以直接复用省去重新加载的时间。如果不是就dispose掉重新创建。实际测试下来同一个视频反复滑进滑出的场景这个优化能明显减少加载等待。4.4 item组件的构建与状态同步item组件接收controller和索引作为参数根据controller的初始化状态决定显示什么。初始化完成前显示占位图完成后显示VideoPlayer。Widget build(BuildContext context) { if (controller null || !controller.value.isInitialized) { return _buildPlaceholder(); } return Stack( children: [ AspectRatio( aspectRatio: controller.value.aspectRatio, child: VideoPlayer(controller), ), _buildOverlay(), ], ); }状态同步的关键是当controller初始化完成时要通知item重建。这可以通过在页面层setState实现因为controller的管理在页面层setState会触发整个列表重建item自然拿到最新的controller状态。虽然重建范围大但ListView.builder只会重建可见的item实际开销可控。4.5 播放控制与用户交互的衔接用户交互主要有几种点击播放/暂停、点击全屏、拖动进度条。在列表场景里最基础的是点击切换播放状态。给item包一层GestureDetectoronTap回调里判断当前controller是否在播放是则暂停否则播放。同时要更新_activeIndex确保用户手动播放的item成为活跃item其他item暂停。全屏播放通常需要跳转到新的页面把controller传过去。这里要注意跳转前要暂停列表里的播放返回后再恢复。进度条拖动在列表里一般不做因为item太小操作不方便通常是全屏后再提供。提示用户手动暂停后滑走再滑回来不应该自动播放。需要用一个变量记录用户的意图比如_userPaused在自动播放逻辑里判断这个变量。5. 常见问题与排查技巧实录5.1 列表滚动卡顿的排查思路卡顿是视频列表最常见的问题。排查时先看是滚动卡还是播放卡。滚动卡通常是build方法太重或者item高度不固定导致反复布局。解决办法是简化item的build逻辑把耗时计算移出build用itemExtent固定高度。播放卡则可能是解码性能不够或者同时播放的视频太多。检查是不是有多个controller在同时play确保同一时间只有一个在播放。另外视频分辨率太高也会导致解码压力大可以考虑用低清晰度的视频源做列表预览。还有一个隐蔽的原因是addListener回调里做了setState。前面说过播放过程中回调触发频繁如果每次都setState整个item甚至列表都在重建不卡才怪。检查回调里是不是有条件判断只在关键状态变化时才刷新。5.2 内存泄漏的定位与解决内存泄漏的表现是列表滑久了内存持续上涨最终OOM。定位方法是打开DevTools的Memory面板反复滑动列表看内存是否持续增长不回落。常见泄漏点有几个。一是controller忘记dispose尤其是从池里取出后没有归还也没有释放的情况。二是addListener添加的回调没有removeListenercontroller销毁后回调还持有引用。三是ScrollController没有dispose。解决办法是建立严格的资源管理规范每个controller创建时记录销毁时确认释放每个addListener配对removeListener每个dispose方法里检查所有需要释放的资源。我习惯在页面dispose里打印一下当前存活的controller数量如果不是0就说明有泄漏。5.3 视频切换时的黑屏与闪烁切换视频时出现短暂黑屏是正常的因为新视频需要加载。但如果黑屏时间过长或者频繁闪烁就需要优化。黑屏时间长通常是视频源加载慢。可以在item即将可见时就提前创建controller并开始初始化等真正可见时已经加载好了。这就是前面说的预加载策略。闪烁则可能是controller切换时旧画面和新画面交替导致的。解决办法是在切换时先显示占位图等新controller初始化完成后再显示视频画面中间用过渡动画衔接。另外确保切换时旧controller先pause再切换不要两个同时渲染。5.4 常见问题速查表问题现象可能原因排查方向解决思路列表滚动卡顿build过重、高度不固定DevTools性能面板简化build、固定item高度内存持续上涨controller未释放Memory面板检查dispose和removeListener切换视频黑屏久视频源加载慢网络面板预加载相邻item多个视频同时出声播放控制失效日志打印活跃索引确保同一时间只有一个play滑回来不自动播放用户意图未记录检查状态变量区分自动和手动播放视频画面变形未按宽高比布局检查AspectRatio用aspectRatio计算尺寸后台仍在播放未监听生命周期检查didChangeAppLifecycleState后台时暂停播放5.5 几个我踩过的坑和独家技巧第一个坑是ListView的cacheExtent。默认情况下ListView会缓存视口外一定距离的item这个距离由cacheExtent控制。如果cacheExtent太大会提前创建很多itemcontroller池不够用太小则滚动时item创建不及时出现白屏。我的经验是把cacheExtent设成itemHeight的一到两倍既保证滚动流畅又不会创建太多。第二个坑是视频源的格式。有些视频源在部分设备上解码失败表现为一直黑屏或者报错。列表场景里要处理好错误状态显示错误提示而不是一直转圈。可以在controller的监听里检查value.hasError有错误就显示重试按钮。第三个技巧是用RepaintBoundary包裹视频item。视频渲染是独立的一层用RepaintBoundary可以避免视频帧的刷新影响其他item的重绘对滚动流畅度有提升。实测在低端设备上效果明显。第四个技巧是控制视频的预加载数量。预加载太多会占用大量内存和带宽太少则切换时等待久。我的经验是预加载当前item的前后各一个总共三个controller在池里基本能覆盖大多数滚动场景。6. 性能优化的进阶方向6.1 用itemExtent提升滚动性能前面提过itemExtent这里展开说一下。ListView在不知道item高度时需要逐个测量才能确定滚动范围这个过程在快速滚动时开销很大。设置itemExtent后ListView直接根据索引乘以高度就能算出位置省去测量步骤。对于视频列表item高度通常是固定的用itemExtent几乎没有副作用。设置方式是在ListView.builder里加itemExtent参数值就是item的高度。如果item高度是屏幕宽度乘以9除以16再加上标题区域高度提前算好写进去就行。实测下来设置itemExtent后滚动帧率能提升10%到20%在低端设备上更明显。这是性价比最高的优化之一强烈建议加上。6.2 图片占位与视频封面的处理视频加载需要时间这段时间显示什么很关键。直接显示黑屏体验差显示加载指示器又显得卡。最好的做法是显示视频的封面图等视频加载好后再切换。封面图可以从视频源里提取也可以单独维护一份封面图URL。列表item先用Image显示封面controller初始化完成后用Stack把VideoPlayer叠上去。这样用户看到的是封面到视频的平滑过渡感知上加载更快。封面图本身也要注意性能用cacheWidth和cacheHeight限制解码尺寸避免大图占内存。列表里的封面图通常不需要原图分辨率按显示尺寸解码就行。6.3 弱网环境下的降级策略弱网环境下视频加载慢如果一直等会严重影响体验。降级策略是检测到加载超时或者网速慢时不自动播放只显示封面和播放按钮用户点击才加载。检测网速可以用connectivity_plus插件但更简单的是设置一个加载超时比如3秒还没初始化完成就放弃自动播放。这样弱网下用户看到的是静态列表不会一直转圈。另外弱网下可以降低视频清晰度。如果视频源支持多清晰度列表预览用低清全屏播放用高清。这需要视频源本身支持如果只有单一清晰度就只能靠超时降级。6.4 列表数据更新时的controller处理列表数据不是一成不变的下拉刷新、上拉加载都会改变数据。数据变化时controller的映射关系要同步更新。如果用索引做key数据插入或删除会导致索引错位controller挂到错误的item上。解决办法是用稳定的唯一ID做key数据变化时根据ID重新映射controller。ID可以是视频的URL或者数据库里的主键。数据更新后之前活跃的item可能已经不在列表里了对应的controller要回收。同时新的可见item要重新计算触发播放逻辑。这部分逻辑容易出bug建议写单元测试覆盖。7. 我个人在实际操作中的体会做视频列表这件事技术方案其实不复杂难的是细节的打磨。我前后迭代了三个版本第一版能跑但卡第二版流畅了但内存有问题第三版才算是稳定。最大的体会是controller的管理策略决定了整个方案的成败其他都是锦上添花。另一个体会是不要过早优化。先把基本功能跑通用DevTools看性能数据找到真正的瓶颈再针对性优化。我见过有人一上来就搞复杂的池化策略结果bug一堆还不如简单的方案稳定。最后分享一个小技巧在开发阶段给每个controller的创建和销毁打上日志跑一段时间后看日志能快速发现泄漏和频繁创建的问题。这个习惯帮我省了很多排查时间。视频列表这个需求后续还可以往直播列表、多列视频流等方向扩展核心的controller管理思路是通用的。

相关新闻

PCI-6220数据采集卡从入门到实战:接线、驱动与采样率全解析

PCI-6220数据采集卡从入门到实战:接线、驱动与采样率全解析

PCI-6220这张卡,称得上数据采集圈子里的一块经典“老熟人”。干我们这行的人,只要在实验室、产线或者高校设备仓库里混过几年,大概率都见过那块墨绿色板卡。16路模拟输入、16位分辨率、250kS/s聚合采样率,配合24路数字IO和2路计数…

2026/10/17 12:30:53 阅读更多 →
HttpServletResponseWrapper:Filter响应改写实战

HttpServletResponseWrapper:Filter响应改写实战

做Java Web的朋友,只要在Filter里处理过响应内容,基本都撞过同一堵墙:想统一给接口响应加个版本号、替换一段敏感词、给HTML注入一份统计脚本,或者单纯想拿到响应体打日志。于是顺手在chain.doFilter()后面直接response.getOutput…

2026/10/17 12:30:53 阅读更多 →
Flink数据读取实战:Source选型、并行度与水位线避坑指南

Flink数据读取实战:Source选型、并行度与水位线避坑指南

1. 为什么数据读取是Flink作业的第一道生死关很多人刚接触Flink的时候,注意力几乎全放在窗口计算、状态管理、Exactly-Once语义这些"高级话题"上,觉得数据读取无非就是调一个addSource或者fromSource的事,能跑通就行。我一开始也是…

2026/10/17 12:30:53 阅读更多 →

最新新闻

Optimizing Sequential Multi-Step Tasks with Parallel LLM Agents

Optimizing Sequential Multi-Step Tasks with Parallel LLM Agents

文章主要内容总结 本文聚焦于基于大语言模型(LLM)的多智能体系统在处理复杂多步骤任务时的高延迟问题,提出了名为M1-Parallel的框架以优化性能。该框架通过并行运行多个多智能体团队,利用事件驱动的异步通信模型挖掘不同的解决方案路径,从而实现延迟降低或任务完成率提升…

2026/10/17 13:32:36 阅读更多 →
如何用Mini-InternVL2-1B-DA-BDD看图说话?单图、多轮、多图对话实战指南

如何用Mini-InternVL2-1B-DA-BDD看图说话?单图、多轮、多图对话实战指南

【免费下载链接】Mini-InternVL2-1B-DA-BDD 项目地址: https://ai.gitcode.com/OpenGVLab/Mini-InternVL2-1B-DA-BDD 点击查看 免费下载 Mini-InternVL2-1B-DA-BDD 是一个开箱即用的「看图说话」多模态大模型:基于 Mini-InternVL 的 1B 小体量底座&…

2026/10/17 13:32:36 阅读更多 →
进程劫持注入:原理、行为特征与防御检测思路

进程劫持注入:原理、行为特征与防御检测思路

1. 进程劫持注入:为什么防御研究者也要把它嚼透做安全分析和应急响应这几年,我越来越觉得"进程劫持注入"是绕不开的一堂基础课。不管是恶意软件分析、终端安全检测,还是攻防演练后的复盘讨论,它都是高频出现的技术底座。…

2026/10/17 13:32:36 阅读更多 →
摩斯密码原理与手动编解码实操:从点划间隔到应急通信

摩斯密码原理与手动编解码实操:从点划间隔到应急通信

这个系列我打算认真写一写。每次只拆一种密码或者编码方式,从原理到手动实操,再到训练技巧,尽量讲透。今天这一篇是系列的第一篇,选择了最经典也最容易被低估的摩斯密码。很多人以为摩斯密码只是“点划组合”,背张表就…

2026/10/17 13:32:36 阅读更多 →
小程序1:N人脸识别全链路实战:从Canvas压缩到阿里云比对

小程序1:N人脸识别全链路实战:从Canvas压缩到阿里云比对

1. 这不是“调个API”那么简单:为什么1:N人脸识别在小程序里特别容易翻车你是不是也遇到过这样的场景:项目需求文档上轻飘飘写着“接入阿里云人脸识别,支持小程序端多图上传比对”,开发同学拍着胸脯说“SDK都有,半小时…

2026/10/17 13:32:36 阅读更多 →
lol-skins 中 Battle Bat Vayne 炫彩(Chroma)资源清单与包结构解析

lol-skins 中 Battle Bat Vayne 炫彩(Chroma)资源清单与包结构解析

【免费下载链接】lol-skins Comprehensive collection of League of Legends skins available for custom use. 项目地址: https://gitcode.com/gh_mirrors/lo/lol-skins 点击查看 免费下载 本文基于开源仓库 lol-skins 中的 Battle Bat Vayne 炫彩清单文档&#x…

2026/10/17 13:31:35 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →