尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
H.265码流分析指南:从参数集到GOP,定位播放异常
搞音视频的人迟早会被H.265码流分析找上门。我最初学这个不是去啃标准文档而是线上播放器突然出现规律性花屏文件用本地播放器放一切正常换了Web播放器就每隔几秒碎一次画面。当时的直觉是播放器兼容性有问题查来查去在解码器里打日志最后回到码流本身才发现是编码器输出的关键帧前面缺了参数集。这一课让我养成了一个习惯播放端一有问题先把码流拉出来看一眼再谈其他。这篇文章就把我从裸流文件到逐字节拆解码流的全套实操记录下来从分析原理、手工解码到常见坑的定位手法适合刚接触H.265/HEVC编码格式、需要排查播放异常的开发者也适合想弄懂码流结构但不想先啃几百页标准的工程人员。1. 为什么播放器花屏最后查到了码流里1.1 一次典型的本地能播、网页花屏排查先说那次真实占了我两天的排查经历。视频文件是摄像机录出来的封装成MP4本地用通用播放器放一点问题没有推到自研播放器里就出马赛克而且是那种有规律的碎块基本每隔几十帧出现一次持续几帧后恢复。最开始我的判断是Web播放器解码能力不足换内核、调渲染、改丢帧策略全都没用。后来打开解码器日志发现每次花屏前都有同一类报错参考帧缺失。可文件在本地播放器里是完好的说明数据明明没丢问题只能出在解码器拿到码流的顺序或者码流本身写入的参考关系。于是我把MP4里的H.265裸流抽出来用十六进制工具从头到尾翻了一遍才发现编码器输出的关键帧序列很有问题每次IDR帧前面都带VPS、SPS、PPS这个没问题问题在于IDR后面的第一组B帧里有几帧引用了前一个GOP的参考帧而那个参考帧在关键帧切换时已经被解码器刷新掉了。也就是说码流在随机访问点设计上是不干净的本地播放器缓冲多、容忍度高真正按标准流程走的播放器就会立刻翻车。这次经历给我的教训很简单播放器报的错只是结果码流才是病灶。无论你用的是成熟播放器还是自研播放器遇到花屏、卡顿、黑屏、seek不准都应该先回到码流分析这一步把NAL结构、参数集、帧类型顺序看明白再决定要不要动解码器。1.2 码流分析到底在看什么很多人一听到码流分析以为必须把H.265标准从头读到尾其实不是。日常排查中我们真正在意的就是几件事NAL单元类型是否合法、参数集是否在随机访问点前出现、帧类型排列是否符合GOP设计、POC图像顺序计数是否有异常、宽高和帧率参数是否和封装信息一致。码流是编码器输出和解码器输入之间的唯一契约。封装容器告诉你这个文件叫什么、时长多少、音视频轨在哪但解码器真正干活时读的是码流里的参数集和slice数据。很多播放器兼容性问题本质上是编码器输出的码流不符合解码器的预期。比如参数集只在文件头放了一次直播推流或拖动播放时从中间进入解码器根本没收到参数集当然黑屏。所以码流分析的价值不在于看懂标准而在于能把播放现象和编码配置快速对应起来。下面整理了最常见的对应关系你在排查时可以直接对照。播放现象疑似码流原因重点查看项打开黑屏/绿屏关键帧前缺少VPS/SPS/PPS每个IDR/CRA帧前面是否连续出现32/33/34类型NAL拖动进度条后长时间黑屏随机访问点过稀疏两个IDR/CRA帧之间的帧数或时间间隔规律性花屏参考帧被刷新但后续帧仍在引用POC顺序、参考帧跨GOP引用花屏后长时间不恢复参考帧缺失VCL帧类型分布、是否有异常丢弃部分设备能播、部分不能profile/level超出设备能力SPS里的profile_idc、level_idc音画不同步VUI帧率参数错误num_units_in_tick和time_scale这套对应关系基本能覆盖我遇到过的90%问题。下面就从最底的二进制结构开始把每一步都讲透。2. H.265码流的物理结构起始码、NAL头和参数集2.1 把裸流看成一条NAL河H.265裸流通常就是一连串NAL单元拼在一起。NAL的全称是Network Abstraction Layer网络抽象层它把编码数据切成一个个独立的小包裹每个包裹都有自己的头好比一列火车每节车厢都贴着货单解码器按货单分拣。裸流文件的物理结构非常直接每个NAL前面都有起始码。起始码一般是00 00 01很多编码器习惯用更长的00 00 00 01还有些特殊场景会出现00 00 00 00 01这种扩展起始码。你拿十六进制工具随便打开一个H.265裸流会看到成片的00 00 00 01后面跟着数据这些起始码就是切分NAL的标记。一个典型的裸流开头长这样00 00 00 01 40 01 0c 01 ff ff ... 00 00 00 01 42 01 01 01 60 00 ... 00 00 00 01 44 01 c0 ... 00 00 00 01 26 01 af 08 ...这里的40、42、44、26就是NAL头部的第一个字节。H.265的NAL头固定占2个字节第一个字节的低6位就是NAL类型换算公式是(byte0 1) 0x3F。0x40右移1位是0x20即32对应VPS0x42右移1位是0x21即33对应SPS0x44右移1位是0x22即34对应PPS0x26右移1位是0x13即19对应IDR_W_RADL所以只要会看起始码就能把一条河切成无数个独立的NAL包裹。切分的时候有个细节容易踩坑查找起始码必须先匹配00 00 00 01再匹配00 00 01因为四字节起始码内部天然包含了一个三字节起始码顺序反了会把一个NAL切成两半。另外要区分容器封装的情况。MP4、TS这类容器里H.265数据通常不再保留起始码而是改用长度前缀每个NAL前面写一个固定长度的size字段。这时候不能直接按起始码扫描得先把裸流从容器里解出来或者按容器规范读长度。日常排查我习惯先解出裸流再统一按起始码分析。2.2 VPS、SPS、PPS三件套到底管什么H.265里最要紧的非VCL类型NAL有三个VPS、SPS、PPS。VPS是视频参数集相当于整个视频流的总纲它描述的是跨层、跨子层的信息SPS是序列参数集管的是整个编码序列的公共配置比如分辨率、profile、level、帧率PPS是图像参数集管的是每一帧图像公用的编码参数比如熵编码模式、分片方式、去块滤波开关。用办公室来类比的话VPS是公司规章制度SPS是部门工作手册PPS是具体项目当天的排期表。解码器开工前必须先把这三份文件都拿到手否则连第一帧都解不了。SPS里最值得手动解析的字段有这么几个profile_idc编码档次决定哪些编码工具可用level_idc编码级别决定最大分辨率、帧率、码率的约束边界pic_width_in_luma_samples和pic_height_in_luma_samples亮度采样宽高单位是像素chroma_format_idc色度采样格式4:2:0还是4:2:2bit_depth_luma_minus8和bit_depth_chroma_minus8位深是否10bit就靠它判断VUI区域里的num_units_in_tick和time_scale帧率相关参数PPS则不用每个字段都懂实战中先看它是否存在、是否在关键帧之前。很多转码工具处理PPS时会带出额外字段比如output_flag_present_flag、cabac_init_present_flag等这些字段如果编码器和解码器理解不一致也会造成个别设备花屏。不过作为排查第一步先确认三件套的完整性和出现位置就够了。2.3 VCL帧的常见类型和GOP角色VCL类型NAL装载的是真正的图像编码数据。H.265的VCL类型从0到23最常见的几个NAL类型值名称角色0TRAIL_N普通非参考帧常为B帧1TRAIL_R普通参考帧常为P帧2/3TSA_N/TSA_R时间子层切换帧6/7RADL_N/RADL_R随机访问前导帧紧跟IDR后8/9RASL_N/RASL_R随机访问跳过前导帧16/17/18BLA_W_LP/BLA_W_RADL/BLA_N_LP断链访问帧19IDR_W_RADL关键帧带前导帧20IDR_N_LP关键帧不带前导帧21CRA_NUT清洁随机访问帧开放GOP关键帧IDR和CRA都算随机访问点但区别很大。IDR帧之后的所有帧都不能引用它之前的帧解码器遇到IDR可以直接清空参考帧缓冲因此IDR是最干脆的seek位置。CRA允许它后面的帧引用它之前的帧压缩效率更高但对播放器提出了更高要求一旦播放器从CRA开始解码前面那段引用旧帧的数据就废了。GOP设计就体现在这些帧类型的排列上。一个典型的封闭GOP是IDR开头后面跟着B帧和P帧下一个GOP再来一个IDR如果用了开放GOP关键帧就会变成CRA前面还混着RASL帧。码流分析里你只要看看关键帧类型是19/20还是21基本就能判断编码器GOP配的是封闭还是开放。3. 手工读码流没有专业软件也能定位问题3.1 第一道扫描看十六进制就能知道大半问题专业码流分析软件确实好用但很多时候你手头只有一条裸流文件和一台终端。别急先用十六进制工具做第一道扫描很多结论直接就能得出来。我常用的是系统自带的xxd先看前256字节xxd -l 256 stream.h265输出里如果能清楚看到40 01、42 01、44 01这几组头部说明文件开头参数集是齐的。如果第一个有效NAL直接就是26开头的IDR那就有问题了——播放器从文件头开始解连SPS都没有只能靠外部配置硬撑这往往是黑屏和绿屏的根源。再往后翻看前两三个GOP的NAL类型序列。用肉眼数26IDR出现的间距如果间隔太长比如超过几百帧那拖动播放肯定会卡。这种第一道扫描虽然土但在没有现成工具的环境下能救命而且它能让你对码流的形状有一个整体感觉这是直接点开专业软件看解析树替代不了的。3.2 写一个极简NAL切分器要让分析可重复还得靠脚本。下面这个Python脚本做的事情就是读入裸流、按起始码切分NAL、统计每个NAL的类型和大小够日常用。import sys from collections import Counter NAL_NAMES { 0: TRAIL_N, 1: TRAIL_R, 2: TSA_N, 3: TSA_R, 4: STSA_N, 5: STSA_R, 6: RADL_N, 7: RADL_R, 8: RASL_N, 9: RASL_R, 16: BLA_W_LP, 17: BLA_W_RADL, 18: BLA_N_LP, 19: IDR_W_RADL, 20: IDR_N_LP, 21: CRA_NUT, 32: VPS, 33: SPS, 34: PPS, 35: AUD, 36: EOS, 37: EOB, 38: FD, 39: SEI, } def find_start_codes(data): starts [] i 0 n len(data) while i n - 3: # 必须优先匹配四字节起始码 if data[i] 0 and data[i 1] 0 and data[i 2] 0 and data[i 3] 1: starts.append((i, 4)) i 4 continue if data[i] 0 and data[i 1] 0 and data[i 2] 1: starts.append((i, 3)) i 3 continue i 1 return starts def split_nals(data): starts find_start_codes(data) nals [] for idx, (start, sc_len) in enumerate(starts): end starts[idx 1][0] if idx 1 len(starts) else len(data) # nal 包含起始码后面的完整 NAL 头 RBSP nal data[start sc_len:end] if len(nal) 2: nals.append((start, nal)) return nals def nal_type(nal): return (nal[0] 1) 0x3F if __name__ __main__: if len(sys.argv) 2: print(usage: python3 nal_split.py stream.h265) sys.exit(1) data open(sys.argv[1], rb).read() nals split_nals(data) type_counter Counter() for i, (offset, nal) in enumerate(nals[:50]): t nal_type(nal) type_counter[t] 1 print(fNAL[{i}] offset0x{offset:08x} type{t:2d} f({NAL_NAMES.get(t, ?)}) size{len(nal):6d}) print(---- top NAL types ----) for t, cnt in type_counter.most_common(10): print(ftype{t:2d} ({NAL_NAMES.get(t, ?)}) count{cnt})这个脚本切完NAL之后你还能顺手统计关键帧间隔。比如记录每个type为19、20、21的NAL下标相邻两个下标的差就是GOP帧数换算成时间再排查拖动卡顿就非常直观。3.3 从SPS里读出宽高、profile和level光会切NAL还不够遇到兼容性问题必须进SPS里看参数。SPS数据在NAL头之后但先要处理一个特殊机制防止竞争字节emulation prevention bytes。编码器为了避免码流内部出现和起始码一样的00 00 01或00 00 00 01会在连续的00 00之后插入一个03解码时要把这个03删掉再还原。所以解析SPS的第一步是去掉这些03字节def remove_epb(data): out bytearray() i 0 while i len(data): if (i 2 len(data) and data[i] 0 and data[i 1] 0 and data[i 2] 0x03): out.extend([0, 0]) i 3 else: out.append(data[i]) i 1 return bytes(out)接下来需要按位读取SPS字段。H.265的SPS大量使用 ue(v) 指数哥伦布编码所以我习惯写一个简单的BitReaderclass BitReader: def __init__(self, data): self.data data self.pos 0 def bit(self): b self.data[self.pos 3] bit (b (7 - (self.pos 7))) 1 self.pos 1 return bit def bits(self, n): v 0 for _ in range(n): v (v 1) | self.bit() return v def ue(self): leading_zeros 0 while self.bit() 0: leading_zeros 1 if leading_zeros 0: return 0 return (1 leading_zeros) - 1 self.bits(leading_zeros)然后就可以解析SPS里的关键字段了def parse_sps(nal): if nal_type(nal) ! 33: raise ValueError(not SPS) # H.265 的 NAL 头占 2 字节 rbsp remove_epb(nal[2:]) br BitReader(rbsp) sps_video_parameter_set_id br.bits(4) sps_max_sub_layers_minus1 br.bits(3) sps_temporal_id_nesting_flag br.bits(1) # profile_tier_level br.bits(2) # general_profile_space br.bits(1) # general_tier_flag profile_idc br.bits(5) br.bits(32) # general_profile_compatibility_flag br.bits(4) # progressive/interlaced/packed/frame_only br.bits(44) # general_reserved_zero_44bits level_idc br.bits(8) br.ue() # sps_seq_parameter_set_id chroma_format_idc br.ue() if chroma_format_idc 3: br.bits(1) # separate_colour_plane_flag width br.ue() # pic_width_in_luma_samples height br.ue() # pic_height_in_luma_samples return { profile_idc: profile_idc, level_idc: level_idc, level: level_idc / 30, width: width, height: height, chroma_format_idc: chroma_format_idc, }注意这里的宽高是亮度采样数并不一定等于最终显示尺寸因为后面还有conformance_window_flag和左右上下裁剪值。但日常排查拿它们做依据足够了。level_idc换算成级别很简单除以30。比如level_idc120就是Level 4.0level_idc150就是Level 5.0。看到profile_idc0是Main Profileprofile_idc1是Main 10 Profile。如果你的视频是10bit编码但播放器只支持8bit解码码流分析里profile_idc和bit_depth字段会直接暴露问题。4. 我踩过的码流坑POC乱序、参数集丢失与参考帧缺失4.1 POC乱序引发的抖动和seek不准先说POC图像顺序计数。H.265编码时帧的存储顺序和显示顺序通常不一样POC用来告诉解码器这一帧在显示序列里的真实位置。如果POC乱序或者编码器输出的帧顺序和POC不匹配解码器虽然能解出走帧但seek之后很可能从错误的参考帧开始预测画面就会乱跳。我遇到过一种情况码流里IDR帧后面直接跟着POC很大的B帧本地播放器提前做了大量缓存看着没事但低延迟播放器拿到这帧就急着上屏结果画面闪了一下又回退观感就是画面突然倒退一下。查码流时我把每个slice里的POC值提出来排序发现有一组B帧的POC顺序和存储顺序完全反了。这类问题的根源通常在编码器配置比如B帧层级过高、参考帧列表重排逻辑异常。排查时可以先看GOP里B帧数量和层级如果B帧层级超过2配合低延迟场景就要特别注意。把编码器B帧层级降下来或者改成交叉显示顺序基本能解决。4.2 关键帧之前的SPS/PPS少了就会黑屏这是兼容性问题的头号原因。很多编码器为了省码率只在文件开头写一次VPS/SPS/PPS后面全是纯帧数据。本地播放器从开头顺序解没问题但直播场景或者拖动进度后播放器是从中间某个位置开始的它不知道参数集自然解不出一帧。H.265标准里VPS/SPS/PPS可以出现在码流中任何位置但为了支持随机访问通常要求每个随机访问点前重复发送这组参数。判断方法很简单统计每两个IDR/CRA之间的NAL类型看32、33、34是否都出现。如果只有开头有一组后面全程没有那就等着被兼容性投诉吧。实际修改也不复杂。转码或封装时强制在每个GOP开头插入参数集很多工具都有这个开关。实在不想动编码器也可以在封装环节手动插入不过需要保证插入位置严格位于随机访问点之前否则同样是脏码流。4.3 参考帧缺失造成的长期花屏还有一种花屏是最磨人的错误不发生在当前帧而是发生在参考帧上当前帧明明接收完整但因为参考帧坏了解出来就是花的。更麻烦的是后续一串帧都可能依赖这个坏参考帧花屏迟迟不恢复。有一次排查直播流发现每丢一个P帧画面要花两三秒才恢复。从码流看GOP长度设了120帧P帧丢了之后后面连续几十帧都引用这个丢失的P帧做参考解码器就算重传成功顺序也已经被打乱。根因很简单GOP太长加上B帧层级高参考依赖链太长。把关键帧间隔从120帧缩到60帧参考依赖链短了画面恢复时间立刻缩短。码流分析层面能做的事是看清参考链路的脆弱程度关键帧间隔越大、B帧层级越深、参考帧数量越多网络丢包后的恢复时间越长。实操中我会写脚本统计每帧的slice头里参考帧索引但这一步比较花时间日常还是先看GOP结构和帧类型分布大多数情况已经能定位方向。5. 从码流结果反推编码配置GOP、码率与兼容性5.1 关键帧间隔和随机访问点GOP改多少合适码流里的IDR/CRA分布直接对应编码器的关键帧间隔设置。做短视频点播GOP可以放到120帧甚至更长码率省不少做直播、低延迟场景GOP通常控制在30到60帧不然拖动静音、网络抖动都会放大。用之前写的NAL切分脚本把type为19、20、21的位置拉出来相邻间隔就能算出实际关键帧间隔。有时候编码器配置设了60帧一个IDR但因为场景切换会自动插入IDR实际间隔可能只有30帧这类细节也只有看码流才知道。我一般建议运维同学定期抽测线上码流重点看关键帧分布是否均匀。如果出现连续多个CRA而没有IDR的情况要确认播放端是否都支持CRA解码老设备对开放GOP的兼容性其实参差不齐。遇到老设备比例高的场景老老实实全用IDR反而省心。5.2 profile/level和播放器兼容性的边界SPS里的profile_idc和level_idc决定了码流的工具边界。同样的1080p30Main Profile和Main10 Profile完全不是一个世界。Main10是10bit色彩精度更高但老设备和部分浏览器根本不认。码流分析里看到profile_idc1时我第一反应就是检查播放器H.265解码能力说明里是否包含Main10。level_idc对应的解码能力约束同样重要。Level 4.0规定的是1080p30fps级别的能力边界Level 5.0才能覆盖4K60fps。如果视频实际是4K60但SPS里level_idc写低了部分严格解码器会按低能力处理轻则丢帧重则解码失败。反过来写高了老设备又可能拒绝硬解。所以每次换编码器、改分辨率、改帧率之后我都会跑一遍SPS解析脚本把profile_idc和level_idc打印出来和实际编码参数核对一遍。有次发现编码器在改分辨率后level_idc没有自动更新就是靠这一步抓出来的。5.3 码率、帧率、分辨率的参数联动最后说说码率。码流里没有直接写明码率这个字段它是根据时间信息和NAL大小间接算出来的一段时间内所有VCL NAL的字节数除以时长。帧率则藏在SPS的VUI区域相关字段是num_units_in_tick和time_scale。实际经验中4500kbps左右的码率1080p30的主观画质往往比勉强压4K30好很多因为4K分摊到每帧的码率太少画面细节全是噪点。码流分析到这一步不是看单个字段而是看整体分辨率、位深、profile、关键帧间隔、VCL帧大小分布这些加起来才能说明当前编码器的发挥是否正常。我自己的习惯是每次调完参数都留一条新的裸流样本跑一遍NAL统计脚本把GOP长度、关键帧间隔、平均帧大小、SPS里的profile和level存成一个表格。参数改动引起的码流变化一目了然后面出了问题也不用重新猜历史配置。6. 一点沉淀把这套方法变成日常检查流程6.1 把脚本沉淀成自己的小工具集上面三个脚本——NAL切分、类型统计、SPS解析——我建议你合并成一个文件加上参数输出成JSON。这样不管排查还是巡检一条命令就能拿到码流摘要。我还喜欢加一个简单的检查规则每个IDR/CRA之前的32/33/34是否齐全缺少就报警。这个规则在转码服务上线前跑一遍能挡掉很大一部分播放兼容性问题。脚本不要写得过大够用就好。真正复杂的字段级解析交给专业软件脚本负责的是批量、抽样和自动化。两者配合才是完整的工作流。6.2 遇到播放问题先看码流再动播放器分析码流这个动作本质上是在建立编码器输出和播放器表现之间的因果链。很多播放器问题查到最后锅都在编码器。反过来码流分析也能帮你证明播放器清白——如果码流完全合规那就是播放器实现的问题这时候再回解码器翻代码也不迟。我后来把那次花屏的排查过程整理成了一页检查清单拿到一条异常码流先看参数集完整性再看关键帧分布然后看VCL类型序列最后看SPS里的profile和level。按这个顺序走一遍80%问题都能定位到具体环节。这套流程本身不依赖任何特定工具和平台只要是接触H.265/HEVC的开发者都能直接拿来用。
RELATED

相关推荐

Halcon算子中文详解:从取图到测量的视觉项目实战指南

Halcon算子中文详解:从取图到测量的视觉项目实战指南

打开Halcon的算子浏览器,第一反应大概率是懵的。满屏英文动词缩写——read_image、threshold、connection、select_shape、find_shape_model——每个单词都认识,但合在一起完全不知道它在视觉流程里到底扮演什么角色。我刚开始学Halcon时也是这个状态&am…

📅 2026/10/21 22:50:37
中亚五国矢量图shp格式:GIS边界底图与空间分析实战指南

中亚五国矢量图shp格式:GIS边界底图与空间分析实战指南

简介:这份中亚五国矢量图数据集面向GIS从业者、地理科研人员及区域研究学习者,提供哈萨克斯坦、乌兹别克斯坦、吉尔吉斯斯坦、塔吉克斯坦和土库曼斯坦五国的精确地理边界与属性信息,可用于地图制作、土地利用规划、区域发展分析及政治边界研究…

📅 2026/10/21 22:50:37
知识工作插件开发实战:从浏览器高亮到知识库归档

知识工作插件开发实战:从浏览器高亮到知识库归档

1. 重新理解知识工作:我为什么偏要做成插件先把话说明白,knowledge-work-plugins这个标题看着抽象,翻译成大白话就是:围绕知识工作者日常使用的笔记工具、文档平台、研发辅助环境,做一套插件集合,把“信息收…

📅 2026/10/21 22:50:37
MORE NEWS

更多资讯

📰

Gitea 版本控制服务端【Red Hat 离线安装】

官网 官方网站:https://about.gitea.cn/ 官方文档:https://docs.gitea.cn/ 官方下载地址:https://dl.gitea.com/gitea/ 各版本控制软件对比 对比项SVNGitMercurialPerforce版本控制类型集中式(依赖中央服务器)分布式…

📰

make_tuple 一文讲透:CANN 昇腾算子开发里最省心的元组创建方式

make_tuple 一文讲透:CANN 昇腾算子开发里最省心的元组创建方式 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API&#xff0…

📰

lxmusic--听歌自由,感谢开源

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

读懂PIIP-LLaVA的trainer_state与training_args:5197步微调训练全复盘

【免费下载链接】PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_13B 项目地址: https://ai.gitcode.com/OpenGVLab/PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_13B 点击查看 免费下载 PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_13B 是基于 Vicuna-13B 的图像多模态大模型&…

📰

如何可视化TIPSv1-So400m/14的1024个空间Patch特征:PCA可视化实战

【免费下载链接】tipsv1-so400m14 项目地址: https://ai.gitcode.com/hf_mirrors/google/tipsv1-so400m14 点击查看 免费下载 TIPSv1-So400m/14(TIPS,ICLR 2025 提出的对比式视觉语言模型)最大的亮点之一,就是它能输出…

📰

无名杀完全上手指南:在浏览器里跑一套可自由改造的三国杀引擎

无名杀完全上手指南:在浏览器里跑一套可自由改造的三国杀引擎 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 我把仓库克隆下来挂到本地服务器上,用 Chrome 内核浏览器打开页面,就能选武将、发牌…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬