ONVIF设备支持H265完整开发指南:能力上报、RTSP与RTP打包改造
设备要支持H265不是简单把编码器切过去就完事的。ONVIF这套协议栈从能力上报、媒体配置到RTSP取流、RTP打包每一层都得跟着改。我最近刚把一批存量设备从仅支持H264升级成同时支持H265中间踩了不少坑SDP里漏了VPS导致部分平台直接拒流、RTP分片头写错导致首帧花屏、老客户端读不到能力等等。这篇文章把我的开发流程完整整理出来按步骤讲清楚每一步要改什么、为什么改、改完怎么验证给正在做设备端ONVIF H265支持的朋友参考。1. 项目视角ONVIF加H265到底动了哪些地方1.1 拆开协议链路看问题ONVIF本质是一套基于SOAP/XML的应用层协议它自己不传视频视频走的是RTSP和RTP。ONVIF负责“告诉客户端我能做什么、怎么取流”RTSP/RTP负责“把码流真正送出去”。所以支持H265必须同时改这两大块。打个比方ONVIF像餐厅前台负责告诉顾客有什么菜、怎么下单RTSP/RTP像后厨的出菜流程。你光跟顾客说新增了牛排能力上报后厨不会做完全没用反过来后厨会做牛排但前台不写在菜单上顾客也不会点。关键就是菜单、下单、后厨三件事要同步改。具体到链路有这三条能力链路GetCapabilities、GetVideoEncoderConfigurations这类接口让客户端感知到设备支持H265编码。配置链路Profile和VideoEncoderConfiguration或VideoEncoder2Configuration把编码格式、分辨率、码率绑定成一个可直接使用的档位。取流链路GetStreamUri返回RTSP地址RTSP的DESCRIBE响应里通过SDP描述H265之后RTP用HEVC封装往外送。这三条链路任意一环出错最后表现都是一样的客户端要么读不到能力要么连不上流要么流连上了但画面花屏。1.2 为什么只换编码器远远不够第一次做这个功能的人最普遍的想法是把编码器从H264切到H265码流自然就有了。问题在于你拿到的可能只是一条裸的ES流而客户端在解码之前必须通过协议层知道这是H265并且拿到解码必需的参数集。H265相对H264协议层的差异至少有四处新增了VPS参数集。H264只有SPS和PPS而H265是VPS、SPS、PPS三件套SDP和RTP封装里都要处理VPS。NAL单元头从1字节变成2字节RTP打包和拆包逻辑完全不一样。RTP封装规范从RFC 6184换成RFC 7798连分包的类型号都变了。新老ONVIF接口并存。老客户端可能只走VideoEncoderConfiguration新客户端优先走VideoEncoder2Configuration两边都得同步上报H265。所以“添加H265”本质是一次协议栈适配不是编码器上的一个开关。1.3 适合谁、难度怎么样这篇文章主要面向三类人做摄像头、网络摄像机固件开发的工程师要给设备ONVIF服务补上H265声明和取流能力。做NVR、平台接入的开发者需要排查自己的平台为什么拉不了一些H265设备。想系统学习ONVIF接入的人拉流链路涉及RTSP、RTP、H265语法正好是一条完整的入门线路。难度上如果你已经做过H264的ONVIF对接加H265并不难难在细节。我在一个熟悉现有代码的项目里改动量大约在几个工作日到两周之间主要取决于底层SDK封装到什么程度。2. 动手前先做三件事2.1 确认手里的ONVIF协议版本H265在ONVIF标准里是16.06版本开始正式支持的。如果你的实现是基于旧版本WSDL生成的代码可能枚举定义里压根没有H265这个选项必须先更新SOAP/XML生成代码。另外要注意Profile档位。ONVIF Profile T对H265有比较明确的规定做认证产品的话需要参考对应Profile的规范文档核对需求。就算不做认证也要确认你用的枚举和字段在标准里是存在的不能自己发明一个值填进去。2.2 确认SoC SDK能输出什么这一步是硬件前提。需要确认以下几点SDK是否提供H265编码器硬编还是软编。编码数据输出的是裸ES流还是已经打包好的RTP包。SDK能不能回调出VPS、SPS、PPS参数集以及回调时机一般是在编码器初始化时或关键帧开头。支不支持动态切换H264和H265还是切换后必须重新初始化编码器。支持的分辨率、帧率、码率范围是否覆盖你要上报的配置范围。这些信息直接决定你的工作量。如果SDK输出的是已经打包好的RTP包那RTP部分几乎不用写只要把SDP和载荷类型写对就行。如果SDK只给ES流RTP打包、帧拆分、FU分片都得自己做或者靠现有的流媒体库处理。2.3 把调试工具搭好再开工我常用的调试工具组合抓包分析Wireshark过滤器写rtsp or rtp。协议验证ONVIF Device Manager官方一致性测试工具。取流验证VLC、ffprobe、ffplay。设备端日志方便打印SOAP请求响应和RTSP交互过程。提前把工具装好、熟悉操作后面排查问题时能省很多时间。尤其是Wireshark抓RTSP的SDP这一步在调试H265的时候几乎是必用的。3. 第一步把H265能力挂到ONVIF服务上3.1 在WSDL生成的代码里加H265枚举用gSOAP或类似工具从ONVIF WSDL生成框架时编码类型枚举一般在类似video_encoder_configuration.h的文件里大致是这样enum video_encoding { VIDEO_ENCODING_JPEG, VIDEO_ENCODING_H264, VIDEO_ENCODING_H265, /* 新增 */ };如果你实现了VideoEncoder2相关接口会看到另一个枚举比如enum VideoEncoding2 { VIDEO_ENCODING2_JPEG, VIDEO_ENCODING2_H264, VIDEO_ENCODING2_HEVC, /* ... */ };注意一点H265和HEVC是同一个东西标准命名经常用HEVC。对接的时候要清楚“H265”和“HEVC”是一个编码但不同接口里枚举名字可能不一样千万别混。3.2 能力查询接口怎么改下面几个接口必须确认返回值GetCapabilities媒体能力部分要能体现支持H265。GetVideoEncoderConfigurations返回的VideoEncoderConfiguration节点Encoding字段直接写H265。GetProfiles返回的Profile要引用上面那个H265编码器配置。一个简化版的配置节点长这样tt:VideoEncoderConfiguration tokenenc_265_main tt:EncodingH265/tt:Encoding tt:Resolution tt:Width1920/tt:Width tt:Height1080/tt:Height /tt:Resolution tt:RateControl tt:FrameRateLimit30/tt:FrameRateLimit tt:EncodingInterval1/tt:EncodingInterval tt:BitrateLimit4096/tt:BitrateLimit /tt:RateControl /tt:VideoEncoderConfiguration一般实现里多个接口读的是同一份配置结构体不需要在每个接口里单独写逻辑。只要配置结构体内部能保存H265编码信息串行化响应时Encoding字段就会自动填成H265。3.3 为什么建议同时实现VideoEncoder2ConfigurationVideoEncoder2Configuration是比VideoEncoderConfiguration更新的配置模型也是标准里支持HEVC最正规的路径。老接口的枚举对H265的支持在新老规范之间不够统一但新接口从一开始就是为H264、H265这类编码设计的。实际项目里我建议两个都做VideoEncoderConfiguration接口返回H265兼容还在用老接口的客户端。VideoEncoder2Configuration接口返回HEVC满足新客户端和合规要求。VideoEncoder2Configuration的字段更紧凑像Quality这种老接口里的字段是没有的。很多具体参数通过编码器配置策略来设不同SDK叫法不一样这块需要自己看代码。3.4 GetStreamUri返回什么地址客户端取流前最后调用的是GetStreamUri它根据ProfileToken、主码流/子码流、偏好TCP还是UDP返回一个RTSP URL。这里两个容易出错的地方URL路径必须和RTSP服务器注册的资源一致。比如返回rtsp://ip:554/streaming/ch0RTSP服务器上就必须有能解析这个路径的会话工厂并且动态生成H265媒体会话。不要因为编码器是H265就把URL搞成另一套逻辑保证H264和H265走同一套寻址客户端才不用特别适配。多数实现里面GetStreamUri是根据Profile去找对应的视频源和编码器然后拼地址。Profile里的H265编码器绑定正确这里基本不用额外改动。4. 第二步RTSP协商和SDP描述4.1 H265的SDP标准写法客户端用DESCRIBE请求拉流时服务端返回的SDP是最关键的一处。一个典型的H265 SDP长这样v0 o- 123456 789 IN IP4 192.168.1.100 sH265 Stream t0 0 mvideo 0 RTP/AVP 96 artpmap:96 H265/90000 afmtp:96 profile-id1; sprop-vpsQAABHEABAwKAAAMA; sprop-spsQgEBAgAAAwAgAAAAwAAAwAAnig; sprop-ppsRAHBcZ fV acontrol:trackID0几个关键点mvideo媒体类型仍然是video。96动态载荷类型取值范围96到127。H265/90000这是rtpmap的核心大写H265时钟频率固定90000。profile-id从SPS解析出的HEVC profile标识。sprop-vps、sprop-sps、sprop-pps三个参数集的Base16编码分号分隔。这几项写错任何一点客户端都容易出现问题。比如把H265写成H264/90000或者漏掉VPS轻则打不开流重则画面花屏。4.2 VPS、SPS、PPS从哪里来分几种情况SDK提供专门的接口获取参数集直接调用。SDK只给裸流参数集会周期性出现在关键帧开头也就是码流里的00 00 00 01起始码后面。需要按NALU语法解析把VPS、SPS、PPS分别取出来。解析思路是用起始码切分NALU然后看NAL头里的类型字段。H265的NALU类型中NALU类型含义32VPS33SPS34PPS19IDR_W_RADL关键帧20IDR_N_LP关键帧实用的做法是拿到码流后先遍历一遍把类型为32、33、34的NALU单独存下来保存三份字节数组备用。4.3 参数集要转成hex字符串获取到VPS/SPS/PPS原始字节后不能直接塞进SDP要转成Base16字符串。建议统一用小写。写一个转换函数static void to_hex_string(const uint8_t* data, size_t len, char* out) { static const char hex_tab[] 0123456789abcdef; for (size_t i 0; i len; i) { out[i * 2] hex_tab[(data[i] 4) 0x0F]; out[i * 2 1] hex_tab[data[i] 0x0F]; } out[len * 2] \0; }生成SDP的时候把三个hex字符串填进各自的sprop字段就行了。4.4 profile-id怎么计算profile-id不是随便填一个值应当从SPS解析。HEVC SPS里的profile信息比较复杂最简单的情况是直接取general_profile_idc。在SPS字节流里一般可以从第二个字节取出低5位profile_idc (sps[1] 0x1F)不过严格来说SPS语法还包括profile_space、tier_flag这些位想完全准确需要按HEVC的SPS语法逐位解析。如果SDK能直接给出profile-id优先用SDK的值。有一点可以放心VLC这类播放器对profile-id的容错性比较强写得不完全准确也能放。但正规的平台接入方会严格校验SDP所以建议还是解析准确。4.5 RTSP交互完整过程标准的四段式交互OPTIONS rtsp://192.168.1.100/streaming/ch0 RTSP/1.0 CSeq: 1服务端返回200Public字段里带上支持的请求方法。接下来DESCRIBEDESCRIBE rtsp://192.168.1.100/streaming/ch0 RTSP/1.0 CSeq: 2 Accept: application/sdp返回200Body里就是上面那个SDP。然后是SETUPSETUP rtsp://192.168.1.100/streaming/ch0/trackID0 RTSP/1.0 CSeq: 3 Transport: RTP/AVP/TCP;unicast;interleaved0-1这里容易出问题。如果客户端要TCP但你只实现了UDP服务端会返回461 Unsupported transport。建议TCP和UDP都支持线上大多数客户端更常用TCP。最后PLAY服务端开始发RTP包。5. 第三步RTP打包要换规范5.1 H265的NAL头是两个字节这是和H264最直观的区别。H264的NAL头只有1字节F(1bit)、NRI(2bit)、Type(5bit)。H265的NAL头是2字节0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ---------------- |F| Type | LayerId | TID | ----------------其中F1 bit必须为0。Type6 bit标识VPS/SPS/PPS/IDR等。LayerId6 bit通常为0。TID3 bit时间层ID通常为1。RTP打包拆包逻辑要基于这16位操作。有人直接把H264的1字节头换成2字节头其他代码几乎不动结果对端解析时NALU类型全部错位。5.2 三种打包模式RFC 7798定义了三种运作模式单NAL单元模式一个NAL单元直接作为一个RTP包。适合较小的包比如参数集和小的非IDR帧。聚合包AP把连续的几个小NAL合并进一个RTP包。AP的负载类型是48每个NAL前面带2字节长度字段。常用于VPS、SPS、PPS和IDR帧同包发送减少小包数量。分片包FU大NAL切成多个RTP包。FU的负载类型是49分片头1字节0 1 2 3 4 5 6 7 -------- |S|E| FuType | --------S分片开始第一个分片置1。E分片结束最后一个分片置1。FuType原始NAL的类型值从原始NAL头里读出来填进去。实际经验参数集和IDR推荐用AP包组合发送普通大帧用FU小帧用单包。合理的打包能减少丢包概率和解码延迟。5.3 时间戳和标记位不能乱这个不管H264还是H265都一样关键视频时间戳单位是90kHz。一个视频帧的所有RTP包使用同一时间戳。每帧的最后一个RTP包要置RTP头的Mark位为1。帧间时间戳差按帧率算30fps就是90000/303000个时钟单位。出现播放时画面跳动、无限缓冲先查时间戳。很多人只改打包格式忘了时间戳最后效果不对找半天找不到原因。5.4 不同SDK输出方式怎么处理如果是已封装RTP的SDK主要确认封装是不是RFC 7798以及SDP载荷类型和RTP包里的PT值是否一致。如果是裸ES流的SDK建议单独封装一层StreamPacker专门把ES转成RTP包。别把RTP逻辑写在ONVIF业务代码里后面维护会很痛苦。这一层做好以后H264和H265共用一个入口只是分包策略不同。6. 测试环节别拿“能出图”当标准6.1 先用ONVIF工具验证协议层每次改完先用ONVIF工具跑一遍重点看GetCapabilities里能否看到H265。GetVideoEncoderConfigurations返回的编码是H265。GetProfiles里的Profile挂了H265编码器。GetStreamUri返回的RTSP地址能被正常解析。SetVideoEncoderConfiguration切到H265后再Get能读到新配置。很多工具自带预览能正常预览说明ONVIF层和RTSP层基本通了。但注意自带预览兼容性强不代表所有第三方客户端都能解。6.2 用ffprobe和VLC拉流验证命令行直接验证最直接ffprobe -rtsp_transport tcp -show_streams rtsp://192.168.1.100/streaming/ch0看到codec_name为hevc说明SDP和协商成功了。ffplay -rtsp_transport tcp -fflags nobuffer rtsp://192.168.1.100/streaming/ch0能流畅出画面且日志无解码错误基本算通过。VLC也可以直接打开网络串流再在媒体信息里看编码器信息确定是HEVC在解码。6.3 Wireshark抓包怎么判断对错抓包时过滤rtsp or rtp然后按顺序检查DESCRIBE响应看mvideo这一行确认载荷类型和rtpmap。看fmtp确认sprop-vps、sprop-sps、sprop-pps非空长度合理。看SETUP请求响应里的Transport确认传输方式一致。看RTP包的载荷类型前两位能识别出AP48、FU49、VPS32、SPS33、PPS34、IDR19/20。如果抓包能看到这些基本可以说明链路没问题。哪里不对也能直接根据Wireshark的解码器进一步定位。6.4 最小验证清单设备上电后GetCapabilities返回H265。GetVideoEncoderConfigurations返回H265配置。GetStreamUri返回正常RTSP地址。DESCRIBE响应里rtpmap是H265/90000。SDP里带VPS/SPS/PPS三个参数集。SETUP返回200传输类型和客户端一致。RTP流中能识别出VPS32、SPS33、PPS34、IDR19/20。播放器拉流正常画面无花屏。7. 常见问题排查与避坑经验7.1 问题速查表现象可能原因排查方向客户端看不到H265能力GetCapabilities没上报或旧接口枚举不完整抓取GetCapabilities响应检查枚举和配置拉流返回461 Unsupported transportRTSP服务器只实现了TCP但客户端请求UDP或反之对比SETUP请求响应的Transport尽量同时支持TCP/UDPVLC打不开提示Unsupported codecSDP里rtpmap不是H265/90000或fmtp格式错误抓包检查rtpmap和fmtp拼写画面花屏、马赛克RTP分片错误、NAL头错位、参数集缺失Wireshark里按NAL类型检查号段画面正常但延迟很大RTP时间戳混乱包间隔不一致检查RTP时间戳和Mark位偶尔黑屏后恢复丢关键帧播放器没拿到参数集确认IDR前是否发送VPS/SPS/PPS抓包验证7.2 亲测踩过的几个坑第一个坑只改了能力接口和老接口的编码枚举漏掉了VideoEncoder2相关接口。结果新版客户端工具能看到能力实际拉流却走了VideoEncoder2接口返回的编码类型还是H264。加上以后重启设备再试才正常。第二个坑SDP里漏了sprop-vps。原因是H264时代只有SPS和PPS惯性思维下压根没意识到H265多了一个VPS。漏掉以后表现很典型VLC能放但开头黑屏两三秒某平台的取流模块直接返回“不支持的编码格式”因为它在SDP初始化阶段就放弃了。第三个坑分片包的FuType从原始NAL头解析时写错了直接手写死IDR类型。IDR拆分后播放器识别不了第一帧必花。第四个坑RTSP地址里trackID不一致。客户端DESCRIBE后用SDP里control字段给出的track地址做SETUP设备端实际注册的会话路径却是另一个trackID导致SETUP 404。排查时把SDP里acontrol和RTSP服务器的媒体会话注册路径对齐就能解决。7.3 上线前的兼容性确认设备如果还要接第三方平台或别人的NVR建议上线前做几项兼容性验证用老版本和新版本两种ONVIF客户端验证接口确保VideoEncoderConfiguration和VideoEncoder2Configuration都返回正确编码。用VLC和ffprobe两种播放器验证能覆盖大多数解码路径。有条件就对另一家厂商的ONVIF测试工具做验证。测试H264、H265混用场景确保客户端能在两个配置间自由切换。最后说点个人体会回到开头的问题ONVIF添加H265能不能更简单如果SDK已经把RTP封装和参数集提取做好了那工作量确实可以缩到只改协议配置和SDP拼接。但不管SDK多省心VPS参数集、SDP的fmtp、RTSP传输方式这几部分还是必须自己盯住的关键路径。这个需求最坑的地方不是某个复杂算法而是所有细节之间的一致性能力声明要和实际编码一致SDP参数要和RTP包内容一致配置切换要和实际码流一致。调试时多抓包、多换不同客户端对比比闷头改代码有效得多。希望这篇流程整理能帮你少走几个我走过的弯路。

相关新闻

深入AQS:doReleaseShared如何用PROPAGATE守住共享锁唤醒链

深入AQS:doReleaseShared如何用PROPAGATE守住共享锁唤醒链

/* 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 4:29:20 阅读更多 →
FPGA高速安全状态机设计:编码、时序优化与安全机制

FPGA高速安全状态机设计:编码、时序优化与安全机制

/* 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 4:28:20 阅读更多 →
基于MP2642GR-Z与PIC18F87J50的两串电池主动均衡方案设计与实现

基于MP2642GR-Z与PIC18F87J50的两串电池主动均衡方案设计与实现

/* 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 4:28:20 阅读更多 →

最新新闻

C++十进制转十六进制:从手写算法到标准库全解析

C++十进制转十六进制:从手写算法到标准库全解析

/* 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 5:07:31 阅读更多 →
pegasusWMS:用Python与Jupyter拆解仓库管理系统核心流程

pegasusWMS:用Python与Jupyter拆解仓库管理系统核心流程

/* 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 5:07:31 阅读更多 →
ICRA 2020三维重建论文盘点:从实时融合到动态场景的工程实践

ICRA 2020三维重建论文盘点:从实时融合到动态场景的工程实践

/* 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 5:07:31 阅读更多 →
两节串联电池主动均衡方案:基于MP2642GR-Z与MK24FN1M0VDC12的备电系统设计

两节串联电池主动均衡方案:基于MP2642GR-Z与MK24FN1M0VDC12的备电系统设计

/* 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 5:07:31 阅读更多 →
基于MP2642GR-Z与PIC18F8722的2S电池均衡系统设计

基于MP2642GR-Z与PIC18F8722的2S电池均衡系统设计

/* 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 5:07:31 阅读更多 →
基于IGH开源主站与汇川SV660N的EtherCAT实时运动控制实现

基于IGH开源主站与汇川SV660N的EtherCAT实时运动控制实现

简介:这份资源面向工业自动化与运动控制方向的开发者,提供基于IGH EtherCAT主站控制汇川SV660N伺服电机的C语言实现代码,重点解决主站与伺服之间位置控制模式(PP模式)下的通信与指令下发问题,适合已具备Eth…

2026/10/16 5:06:30 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* 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 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/15 9:49:14 阅读更多 →