NDI 画面每行向右错位,怎样用 line_stride 检查行跨距
每一行逐渐错位时,先检查行起点是否按line_stride_in_bytes递增。有效像素占用的字节数只说明一行应读取多少内容,并不保证下一行紧接其后;对齐padding可能位于行尾。这个问题与红蓝通道互换不同,修正FourCC仍然可能保持斜纹。
先固定输入与适用条件
本例假设UYVY宽度为4像素、高度为3行,每两个像素四字节,因此有效行长8字节,但提供的行跨距为12字节。只在脱离SDK的合成内存中复现,padding用固定哨兵值标记。实际接收接口给出的跨距应当原样记录,不能为了让数字整齐而改成width乘二。
本篇按NDI官方滚动SDK文档解释视频v2或音频v3帧描述。文档核对日期为2026-10-24;这不是本地已安装NDI运行库的版本声明,设备与第三方软件需另录版本。
按字段与边界执行
-
先根据实际FourCC确定有效行最少字节数,再核对返回跨距是否足够容纳。宽度为零、格式不支持或跨距短于有效行时立即停止处理。
-
使用行索引乘跨距寻找行起点,然后只取有效字节范围。逐行打印起点及首尾样本,避免只看第一行,因为第一行起点为零时通常看不出错误。
-
用包含行号签名的夹具同时运行正确路径和紧密排列错误路径。比对第二、第三行是否进入padding,将结果保留而不是仅凭窗口截图判断。
-
交给GPU时再检查上传API是否接受源行距;若必须紧密排列,应明确逐行复制到新的紧密缓冲,而不是改变描述后继续使用原地址。
用具体样例核对结果
本例正确行起点为0、12、24,错误的紧密排列路径为0、8、16。第一行两条路径都得到8个值为1的字节;第二行错误路径先读到四个204哨兵,再读到下一行内容。脚本同时输出这两组结果,并断言正确路径只得到行号1、2、3。输入文件因此可以复现行错位,而不是一张看不出内存布局的空白表。
通过条件是所有有效行内容与输入一致、padding没有出现在图像中、所需缓冲长度未越界。若跨距是更大的对齐值,程序应继续使用真实跨距,并重新计算末行有效区的结束地址。不要把“总缓冲字节数能整除高度”当成可靠跨距证明;有的缓冲还包含额外平面或分配余量,实际格式描述才是依据。
下载与复现
analyze.py、input.json、result.json。
input记录有效行长度与跨距,结果列出每行hex和错误对照。现场交接应追加接收API、FourCC、行跨距以及上传纹理API的行距配置;本题没有测试任何显卡驱动,不能把合成断言通过写成屏幕恢复。
把输入与脚本保存到同一个本地目录后执行 python analyze.py,脚本只读取输入、计算并重写同目录的结果文件。先保留原始附件副本,再将自己的脱敏输入另存为新版本,记录输入摘要与执行日期;不要把合成字段覆盖成看似真实的现场日志。
已用 Python 3.12.4 实际运行附件算法并检查断言。结果来自同目录合成输入;没有接入真实NDI源、控制器、灯具、接收卡或LED屏,不能据此填写现场验收通过。
对接下一步与一级来源
基础背景可看NDI 网络视频传输协议详解。相关流程收在多媒体播放专题;需要项目对接时,带上本文输入及结果向SoftPlayer核对实际能力。
一级来源核对日期:2026-10-24。原始协议规则、本文原创运算和目标系统行为应分别留证;附件计算正确,不等于设备已经按该参数工作。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。